iOS setContentOffset无法在ipad上运行

时间:2012-12-16 18:21:59

标签: ios uiscrollview scrollview

这真的很奇怪。我有一个包含三个图像的滚动视图,用户滑动以查看下一个图像。但是,我希望第一个屏幕从中间图像开始。简单;我将使用setContentOffset,一切都会好的。

该代码适用于iPhone模拟器,但不适用于iPad模拟器(或设备!)

CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat height = CGRectGetHeight(screen);
CGFloat width = CGRectGetWidth(screen);

CGPoint rightOffset = CGPointMake(width, 0);
[scrollView setContentOffset:rightOffset animated:YES];

在添加scrollView之前设置所有设置(事实上,我们可以在添加了相同结果的scrollview之后执行此操作)。

宽度在ipad上返回768,在iphone上返回320.

这是一个错误吗? Xcode 4.4.1和ios 6。

编辑:

看起来这与创作顺序有关;移动到viewWillAppear而不是viewDidLoad,显然是在iphone和ipad上工作。只是不一致是非常令人惊讶的....

1 个答案:

答案 0 :(得分:8)

您不应在viewDidLoad中初始化与UI几何相关的内容,因为此时未设置视图的几何结构且结果将是不可预测的。

正如您所发现的那样,viewWillAppear是执行这些操作的正确位置,此时设置了几何体,因此获取和设置与几何体相关的属性是有意义的。

viewDidAppear。

更新(ios6)

在ios6中使用自动布局时,在布置子视图之前不会设置帧。在这些条件下获取帧数据的正确位置是在viewController方法-viewDidLayoutSubviews中。

在 -viewWillAppear之后称为。但要小心 - 他们并不总是被召集在一起。例如,-viewWDidLayoutSubviews在轮换后调用,-viewWillAppear不是。 -viewWillAppear在每次视图成为可见视图*时调用,-viewDidLayoutSubviews不一定(仅当我们的视图需要中继时)。

(*除非应用程序是后台程序并且正在成为前台应用程序,否则不会调用-viewWillAppear)