1. ホーム
  2. objective-c

UIScrollViewがオートレイアウト制約を使用しない

2023-07-13 14:48:35

質問

スクロールビューとその後ろに画像ビューがあり、そこにnibsを入力しています。 私はautolayoutを使用しています。 私は両方のビューでsuperviewに下のスペースとsuperviewに上のスペースを持っています。 イメージビューは、まさに私がやりたいことをやってくれています。 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];

私が見る限り、これはビューからすべての制約を取り除くだけです。 そして、それは私が望むものではありません。

どのように解決するのですか?

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

この問題を解決するために、autolayoutを使用するUIScrollViewは全く新しい方法で動作します。そのため、autolayoutを使用する場合は、以前とは全く異なる動作をすることを覚悟しなければなりません。スクロールビューのサブビューを1つにして translatesAutoresizingMaskIntoConstraints = YES で、コンテンツサイズを明示的に指定するか、あるいは、すべてのコンテンツに translatesAutoresizingMaskIntoConstraints = NO でなければならず、コンテンツサイズはサブビューの制約に基づいて暗黙のうちに推測されます。

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