iOS setContentOffset 不适用于 ipad

标签 ios uiscrollview scrollview

这真的很奇怪。我有一个包含三张图片的 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 上工作。只是不一致是非常令人惊讶的....

最佳答案

您不应该在 viewDidLoad 中初始化与 UI 几何相关的东西,因为此时您的 View 的几何尚未设置,结果将不可预测。

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

viewDidAppear。

更新(ios6)

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

这称为 after -viewWillAppear。但要小心——他们并不总是被召集在一起。例如,-viewWDidLayoutSubviews 在旋转后调用,-viewWillAppear 则不是。每次 View 变为可见 View 时都会调用 -viewWillAppear*,-viewDidLayoutSubviews 不一定(仅当我们的 View 需要中继时)。

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

关于iOS setContentOffset 不适用于 ipad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904205/

相关文章:

ios - 客户端获取iOS Universal Framework的版本号

iphone - UIScrollView 中的几个 UIImageView 和崩溃

android - 使用 ScrollView 的 Flex 布局

iOS 7 游戏中心在模拟器而不是设备上运行

iphone - 适用于 iOS 的 Tesseract 3.02?

android - 在应用程序中解压缩 .zip 文件 |加速器 |钛

ios - SpriteKit,Swift - ScrollView 未显示

iphone - UIScrollView:动画横幅效果

android - ScrollView 和 OnGestureListener

Android - ScrollView like foursquare with maps + list