UIScrollView不使用自动布局约束


78

我后面有一个滚动视图和一个图像视图,并用笔尖填充它。我正在使用自动版式。在这两个视图中,我都有一个底部空间可以进行超级视图和顶部空间来进行超级视图。图像视图确实可以实现我想要的功能。对于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];

从我可以看出,这消除了视图中的所有约束。而且不是我想要的。


2
Apple的技术说明TN2154:UIScrollView和自动版式详细介绍了此问题。
smileyborg

Answers:


176

UIScrollView和自动布局之间的关系与自动布局的其他方面不同。基本上,如果允许使用简单的自动布局,则不会滚动。例如,如果通过约束将滚动视图的子视图以常规方式固定到距离滚动视图顶部10个点的位置,则它将绝对固定在该位置。无论滚动视图如何滚动,它都不会移动。

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

https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html中对此进行了很好的解释。


5
您可能对此问题感兴趣:stackoverflow.com/questions/14307037/…(尤其是由于赏金!)我认为这是scrollview / autolayout问题,但在我看来,它看起来像是个bug-在这种情况下,滚动view是一个表格视图,并且内容大小在旋转时无法正确调整。
jrturton

3
@matt我不知道您是否已经看到这种行为,但是如果仅使用布局约束来定义滚动视图的内容大小,则会出现一个错误:将内容偏移量从(0,0)移到另一个选项卡上或模式视图控制器,请返回,然后滚动视图的子视图都将移动内容偏移量,您将无法返回。如果您能确认并欺骗我,我将不胜感激:openradar.appspot.com/radar?id=2932404
edelaney05

3
@ edelaney05我想我可以确认该错误,但是在提交给Apple之前,您应该创建一个演示项目,尤其是。因为openradar.appspot.com/radar?id=2932404中的复制和粘贴代码甚至都不会编译(您键入的名称constraintsWithVisualFormat:options:metrics:views:错误)。始终使用实际有效的真实代码。此外,在真实项目中,您可以包含真实图像。苹果人民没有想象力,没有时间。您必须提前为他们完成所有工作。
马特2013年

3
@ edelaney05“肩膀consectetur pancetta” ????:)好的,很好。实际上,我根据他们的代码进行了更紧密的处理,将图像视图缩放为一张大图片。通过为滚动视图提供红色背景色并进行记录,很明显,滚动视图认为一切都正确(内容大小,内容偏移),但是在错误的位置绘制了图像视图,即偏移了一定数量离开视图时的内容偏移量。
马特2013年

2
@matt baconipsum.com!:-)太棒了 我看到的行为完全一样。滚动视图将所有内容报告为“正常”,但由于偏移原因,绘图不正确。感谢您确认我并不疯狂(但仅针对此错误!)。
edelaney13年

162

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

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

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

因此,我损失了几个小时,希望我能避免其他人的痛苦。


4
太棒了。我一直在寻找一个简单的示例,例如链接中的示例。谢谢!!!
pgpb.padilla

尽管matt的答案很好,但是该问题对于解决我在使用它时遇到的问题实际上更具帮助
dmur

22
@dmur“尽管matt的答案很好,但这个答案实际上更有帮助”-Dude,这也是我的答案。他从我的书中获得了代码/解释!很高兴我能够提供两次帮助。:)))
马特

根据您对scrollView及其子视图的布局方式,可能需要将内容固定在左侧或顶部。就我而言,我必须将所有内容固定在左侧。
ArtSabintsev 2014年

您也可以通过Interface Builder添加约束。好答案!
莫伊塞斯奥尔梅多

0

为了使UIScrollviews在约束条件下可以很好地工作,我在这里使用了这种方法。在该答案中,我解决了如何使垂直滚动的scrollview工作与设备旋转一起工作。您也可以调整方法以与水平滚动scrollview一起使用。对于在两个方向上滚动的滚动视图,请不要添加大小匹配宽度约束技巧。但是其他所有事情都一样。


-3

有几件事。

  1. 确保启用自动版式(“文件检查器选项卡”上的IB)
  2. 确保您没有进行任何涉及边界,框架等的更改-现在全部由自动约束完成
  3. 确保您远离AutoResizingMask。这将与您的新设置竞争。如果正确完成这些操作,您现在就可以布局按钮,效果会很好。就是这样。

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


1
但是UIScrollView是特殊的,您的答案没有考虑到这一事实。
马特2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.