web-dev-qa-db-ja.com

UIScrollViewは自動レイアウト制約を使用しません

スクロールビューとその背後にある画像ビューがあり、ペン先を配置しています。自動レイアウトを使用しています。両方のビューを上から見下ろすスペースと上から見下ろすスペースがあります。画像ビューは、私が望んでいるとおりに動作します。 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];

私が見ることができるものから、これはビューからすべての制約を取り除きます。そして、私が欲しいものではありません。

75
SirRupertIII

UIScrollViewと自動レイアウトの関係は、自動レイアウトの他の側面とは異なります。基本的に、単純な自動レイアウトの操作が許可されている場合、何もスクロールしません。たとえば、スクロールビューのサブビューが、スクロールビューの上部から10ポイントまでの制約によって通常の方法で固定された場合、そこに絶対に固定されます。スクロールビューがどのようにスクロールされても、決して移動しません。

この問題を解決するために、自動レイアウトを使用するUIScrollViewはまったく新しい方法で動作します。したがって、「自動レイアウトを使用しています」と言う場合、以前とはまったく異なる動作をするための準備をする必要があります。 translatesAutoresizingMaskIntoConstraints = YESと明示的なコンテンツサイズを持つ単一のスクロールビューサブビューを使用するか、すべてがtranslatesAutoresizingMaskIntoConstraints = NOでなければならず、コンテンツサイズはサブビューの制約に基づいて暗黙的に推測されます。

これは https://developer.Apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html で非常によく説明されています

173
matt

自動レイアウトを使用する場合は非常に重要です。最後のサブビューの右または下をスクロールビューの右または下に固定する必要があります。これは、スクロールビューがコンテンツサイズを認識する方法です。例えば:

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

完璧な例を提供してくれた このサイト に感謝します。

私はこれにより何時間も失いました。

161
phatmann

UIScrollviewsを制約でうまく動作させるために、このアプローチを使用します here 。その答えでは、デバイスの回転でも機能するverticallyスクロールscrollviewの動作を取得する方法に取り組んでいます。 horizo​​ntallyスクロールスクロールビューでも動作するようにアプローチを微調整できます。両方向にスクロールするスクロールビューの場合、do n'tは、サイズに一致する幅制約トリックを追加します。しかし、他のすべてを同じようにします。

0
n8tr