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

时间:2014-10-23 16:51:52

标签: ios uiscrollview uiimageview ios8 autolayout

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

这是设置:在Interface Builder中,我有一个UIViewController,其中包含一个UIView,其中包含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?

2 个答案:

答案 0 :(得分:22)

我已经解决了。出于某种原因,viewDidLoad在生命周期中过早,无法在iOS 8上获得滚动视图的调整框架,但同样适用于iOS 7. viewWillAppear也太早了,因为以及viewWillLayoutSubviews

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

答案 1 :(得分:1)

我也遇到了类似的问题。我通过以编程方式更改scrollview中的contentView 的宽度来解决它。在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)
}