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

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

这是设置:在界面生成器中,我有一个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); 

我发现如果我把相同的NSLogviewDidAppear框架的宽度是正确的768pt。 我试着将代码移动到viewWillAppear而不是viewDidLoad ,但是我得到了相同的结果 – 在viewWillAppear中也是600。 所以滚动视图正确拉伸,以填充显示,但直到它出现在屏幕上。 在图像出现在屏幕上之前,我需要正确的帧大小,以便我可以计算正确的最小和最大缩放值。

我能做些什么来解决这个问题,并确保它适用于iOS 7和8?

我解决了它。 出于某种原因, viewDidLoad在生命周期中获取iOS 8上的滚动视图的调整框架还为时尚早,但是它仍然适用于iOS 7. viewWillAppear还为时尚早,还有viewWillLayoutSubviews

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

我也遇到了类似的问题。 我通过以编程方式更改 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) }