ios - UIScrollView 框架在 iOS 8 和 iOS 7 上的大小不同

标签 ios uiscrollview uiimageview ios8 autolayout

我实现了一个 View Controller ,它只显示单个图像并允许用户捏合以放大/平移图​​像。它在 iOS 7 上运行良好,但在 iOS 8 上 ScrollView 的框架大小不同,最终结果是图像在 iPhone 上放大太多,在 iOS 8 上运行时在 iPad 上缩小太多。这是因为 ScrollView 框架的宽度为 600pt,这是它在 Storyboard 中的大小(使用大小类的通用 Storyboard )。但我有自动布局约束,应该确保 ScrollView 拉伸(stretch)以填充可用空间——它在 iPad 上应该是 768pt。这是 iOS 7 的情况,但不是 iOS 8。

这是设置:在 Interface Builder 中,我有一个 UIViewController,其中包含一个 UIView,其中包含一个 UIScrollView,尾部有自动布局限制, super View 的前导、底部和顶部空间。然后在 viewDidLoad 中:

    UIImage *image = [UIImage imageNamed:@"image"];
    self.imageView = [[UIImageView alloc] initWithImage:image];
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);

    [self.scrollView addSubview:self.imageView];
    self.scrollView.contentSize = image.size;

    #warning Bug here - scroll view frame is 600pt on iOS 8 - should be 768 for iPad
    NSLog(@"scroll view frame wid: %f", self.scrollView.frame.size.width);

我发现如果我将相同的 NSLog 放在 viewDidAppear 中,框架的宽度是正确的 768pt。我尝试将该代码移至 viewWillAppear 而不是 viewDidLoad,但我得到了相同的结果 - 在 viewWillAppear 中也是 600。因此, ScrollView 会适本地拉伸(stretch)以填充显示屏,但直到它出现在屏幕上后才会拉伸(stretch)。在图像出现在屏幕上之前,我需要正确的帧大小,以便我可以计算出正确的最小和最大缩放值。

我该怎么做才能解决这个问题并确保它适用于 iOS 7 和 8?

最佳答案

我已经解决了。出于某种原因,viewDidLoad 在生命周期中太早,无法在 iOS 8 上获取 ScrollView 的调整框架,但它再次适用于 iOS 7。viewWillAppear 也太早了,以及 viewWillLayoutSubviews

为了解决这个问题,我只是将需要使用 ScrollView 的帧大小的代码移动到 viewDidLayoutSubviews,它最终获得了它出现时的正确大小。

关于ios - UIScrollView 框架在 iOS 8 和 iOS 7 上的大小不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26533243/

相关文章:

iOS Storyboard - 有什么方法可以根据屏幕大小更改字体大小?

ios - 无法让 UIScrollView 工作

ios - 停止 TableView 单元格 UIImage 在 iOS 中调整大小

ios - 覆盖 UIImageView 的图像

ios - Swift Bridging Header 导入问题

objective-c - 如何在 iOS 中将整数转换为 id

xcode - 自定义 UITextView 滚动大小

ios - iOS 8-滚动不起作用

ios - 无论 UIViewContentMode 选择如何,部分屏幕视频预览都会失真

objective-c - NSDateFormatter 损失了一年