6

ストーリーボードで初期化されたアプリにスクロール ビューがあり、フレームを変更しようとしています。すべてが機能しているように見えますが、フレームとコンテンツのサイズが設定された直後にアクセスされた場合、メソッドが戻った後、それらは異なります! コードは次のとおりです。

CGFloat inputHeight = inputView.frame.size.height;
originalContentHeight = self.scrollableContentView.frame.size.height;
NSLog(@"%f", self.scrollableContentView.frame.size.height-inputHeight);
[self.scrollableContentView setFrame:CGRectMake(self.scrollableContentView.frame.origin.x, self.scrollableContentView.frame.origin.y, self.scrollableContentView.frame.size.width, self.scrollableContentView.frame.size.height-inputHeight)];
NSLog(@"%f", self.scrollableContentView.frame.size.height);
NSLog(@"%@", self.scrollableContentView);

これらのログの出力はすべて予想どおりです。つまり、次のとおりです。

<UIScrollView: 0x808de00; frame = (0 0; 320 81); ... >

ただし、別のメソッドにブレークポイントを設定すると、それが呼び出されるまでに、scrollView をログに記録すると次のようになります。

<UIScrollView: 0x808de00; frame = (0 0; 320 416); ... >

さらに、コンテンツのサイズは次のように変更されます。

(width=320, height=416)

(width=320, height=504)

両方の値は、ビューが最初にレイアウトされたときの値に自動的に戻っているようです。スクロール ビューの getter と setter にブレークポイントを設定しましたが、予期しないアクセスが見つからないため、変更は内部的に行う必要があると結論付けました。これは正当な結論ですか?何がうまくいかないのですか?

4

1 に答える 1

7

自動レイアウトを使用している場合は、スクロールビューのフレームを設定するのではなく、制約を変更する必要があります。

ここで同様の質問に対する私の回答を参照してください。プログラムで制約を設定する方法の例へのリンクがいくつかあります。

また、どの方法でframeandを設定していcontentSizeますか? ストーリーボードを使用しているため、viewDidLoadまたはviewWillAppear:にある場合は、代わりにこのコードを移動することをお勧めしますviewDidLayoutSubviews

于 2013-07-16T14:11:44.017 に答える