UIScrollView 不使用自动布局约束

我有一个滚动视图和背后的图像视图,我填充它与笔尖。我正在使用自动布局。我有一个底部空间和顶部空间上的两个视图上的总览。图像视图完全按照我的要求进行操作。对于 iphone5来说,它就是我想要的地方。而对于其他的 iphone,它保持在屏幕底部以上,所以它可以正确调整大小。滚动视图在 iphone5上看起来是正确的,但在其他手机上它不会调整大小,所以它会向下滚动到应用程序视图的下方。我在日志里看到了这些信息:

 2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this: (1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer
to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)


"<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-|   (Names: '|':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0]   (Names: '|':ScheduleView:0x1d8efc30 )>"




Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom ==      UIImageView:0x1d892110.bottom>

我已经试过了

[self setTranslatesAutoresizingMaskIntoConstraints:YES];

还有

[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];

在我看来,这只是摆脱了视图的所有限制,并不是我想要的。

85788 次浏览

有几件事。

  1. 确保打开自动布局(IB 在“文件检查器”选项卡上)
  2. 确保你没有做任何涉及边界,框架等变化-这都是由自动约束现在
  3. 请确保您远离自动调整面具。这将与您的新设置竞争。 如果这些都做对了,你现在可以布局你的按钮,它将工作得很好。

此错误说明您的笔尖或该笔尖内的控件没有使用自动布局。

UIScrollView 与自动布局之间的关系不同于自动布局的其他方面。基本上,如果简单的自动布局被允许操作,什么也不会滚动。例如,如果滚动视图的子视图以正常方式固定在滚动视图顶部的10点上,那么它绝对会固定在那里; 无论滚动视图如何滚动,它都不会移动。

为了解决这个问题,使用自动布局的 UIScrollView 以一种全新的方式进行操作。因此,当你说“我正在使用自动布局”,你必须准备事情的运作非常不同于以前。您必须使用一个带有 translatesAutoresizingMaskIntoConstraints = YES的滚动视图子视图和一个显式的内容大小,否则所有内容都必须具有 translatesAutoresizingMaskIntoConstraints = NO,并且内容大小将根据子视图的约束隐式地推断出来。

这在 https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html中得到了很好的解释

使用自动布局时非常重要: 必须将最后一个子视图的右侧和/或底部固定在滚动视图的右侧和/或底部。这就是滚动视图知道内容大小的方法。例如:

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:0]];

我感谢 这个网站提供了完美的例子。

我因此失去了几个小时的时间,我希望别人能够免受我的痛苦。

为了让 UIScrollviews 能够很好地处理约束,我使用了这种回答 给你的方法。在这个答案中,我解决了如何让一个 垂直的滚动滚动视图工作,也与设备旋转工作。您也可以调整使用 水平方向滚动滚动视图的方法。对于向两个方向滚动的滚动视图,不要添加了大小匹配宽度约束技巧。但是做其他的事情也是一样的。