79

我在它后面有一个滚动视图和一个图像视图,我正在用笔尖填充它。我正在使用自动布局。我在两个视图上都有一个用于超级视图的底部空间和一个用于超级视图的顶部空间。图像视图完全符合我的要求。对于 iphone 5,这是我想要的。对于其他 iphone,它位于屏幕底部上方,因此可以正确调整大小。滚动视图在 iphone 5 上看起来正确,但在其他手机上它没有调整大小,因此它向下滚动到应用程序视图下方。我在日志中收到这些消息:

 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];

据我所知,这只是消除了视图中的所有约束。而且不是我想要的。

4

4 回答 4

177

UIScrollView 和自动布局的关系不同于自动布局的其他方面。基本上,如果允许运行简单的自动布局,则什么都不会滚动。例如,如果滚动视图的子视图以正常方式被固定到距离滚动视图顶部 10 个点的约束,那么它将绝对固定在那里;无论滚动视图如何滚动,它都不会移动。

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

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

于 2012-11-25T03:37:05.870 回答
162

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

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

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

我因此失去了几个小时,我希望减轻其他人的痛苦。

于 2013-04-16T04:50:10.570 回答
0

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

于 2015-01-22T03:47:26.287 回答
-3

有几件事。

  1. 确保自动布局已打开(“文件检查器选项卡”上的 IB)
  2. 确保您没有进行任何涉及边界、框架等的更改 - 现在这一切都由自动约束完成
  3. 确保远离 AutoResizingMask。这将与您的新设置竞争。如果这些都做对了,你现在可以布局你的按钮,它会很好用。就是这样。

此错误表明您的笔尖或该笔尖中的控件未使用自动布局。

于 2012-11-24T05:55:13.360 回答