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



我实现了一个视图控制器,它只显示单个图像,并允许用户捏合以放大/平移图像。它在iOS 7上运行良好,但在iOS 8上,滚动视图的框架大小不同,最终结果是在iPhone上图像放大得太远,而在iPad上缩小得太远,在iOS 8上运行时。这是因为滚动视图框架的宽度为 600pt,这是它在情节提要中的大小(使用大小类的通用情节提要(。但是我有自动布局约束,应该确保滚动视图拉伸以填充可用空间 - 在 iPad 上应该是 768pt。iOS 7 是这种情况,但不是 iOS 8。

这是设置:在界面生成器中,我有一个包含UIView UIViewController,其中包含一个UIScrollView,自动布局限制尾随、前导、底部和顶部空间到超级视图。然后在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。因此,滚动视图会正确拉伸以填充显示,但直到它出现在屏幕上之后。在图像出现在屏幕上之前,我需要正确的帧大小,以便我可以计算出正确的最小和最大缩放值。

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

我已经解决了。出于某种原因,viewDidLoad生命周期中还为时过早,无法在 iOS 8 上获取滚动视图的调整帧,但它同样适用于 iOS 7。 viewWillAppear还为时过早,viewWillLayoutSubviews.

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

我也在为类似的问题而苦苦挣扎。我通过以编程方式更改滚动视图中内容视图的宽度来解决它。在ViewDidLoad我称之为方法

func setupWidthOfContentView(){
    let screen = UIScreen.mainScreen().bounds
//        println("Width: (screen.size.width) Height: (screen.size.height)")
    var constW = NSLayoutConstraint(item: vwContentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: screen.size.width)
    vwContentView.addConstraint(constW)
}

最新更新