我很惊讶没有看到更多关于这个的评论。在iOS 8中,滚动视图内部自动布局很大程度上已经失效(截至本文撰写时)。
编辑:在第5个种子版本中进行了修复,因此应忽略这个提醒!
据说规则是(请参见
https://developer.apple.com/library/prerelease/ios/technotes/tn2154/_index.html),如果滚动视图的内容(其子视图或子视图)与滚动视图的全部四个边界对齐,则设置内容大小。
但在iOS 8中,仅当确定子视图高度和宽度的约束全部为绝对值而不是内在值时,该规则才会失败。
因此,例如,请考虑那篇技术说明底部的代码,在其中通过代码创建了一个滚动视图和一个真正巨大的图像视图(以下是代码;我已校正了一个小错误,一个 @ 符号被省略了)。
- (void)viewDidLoad {
UIScrollView *scrollView;
UIImageView *imageView;
NSDictionary *viewsDictionary;
scrollView = [[UIScrollView alloc] init];
imageView = [[UIImageView alloc] init];
[imageView setImage:[UIImage imageNamed:@"MyReallyBigImage"]];
[self.view addSubview:scrollView];
[scrollView addSubview:imageView];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
imageView.translatesAutoresizingMaskIntoConstraints = NO;
viewsDictionary = NSDictionaryOfVariableBindings(scrollView, imageView);
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[scrollView]|"
options:0 metrics: 0 views:viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[scrollView]|"
options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[imageView]|"
options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[imageView]|"
options:0 metrics: 0 views:viewsDictionary]];
}
那段代码是可行的(假设你有一个非常大的图片),因为图像视图是由内在约束大小的。但现在将最后两行改成这样:
[scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[imageView(1000)]|"
options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[imageView(1000)]|"
options:0 metrics: 0 views:viewsDictionary]];
现在您拥有的是一个可以在iOS 7上滚动但
不能在iOS 8上滚动的滚动视图。进一步调查显示,这是因为内容大小仍为
(0,0)
;它不遵循内容视图的绝对宽度和高度约束。