4

私はUIViewControllerとを持っていますwillRotateToInterfaceOrientation, 私は呼んでいます[self view] setNeedsLayout];

このビュー呼び出しはサブビューの (a UIScrollView)layoutSubviewsメソッドですが、サブビューUIScrollViewは呼び出しませんlayoutSubviews。これが本来あるべき姿ですか?setNeedsLayoutビューを呼び出すとlayoutSubviews、すべてのサブビューとそのサブビューが呼び出されると思いました...

各サブビューを手動でオーバーライドlayoutsubviewUIScrollViewて呼び出す必要がありますか?setNeedsDisplay

ありがとう。

4

1 に答える 1

8

少し前にアプリで同じことを観察しましたsetNeedsLayoutが、ビューのサブビューにのみ影響し、下にトラバースしないようです。カスタム ビューを使用する場合は、ビューを簡単にサブクラス化し、サブビューを反復処理してsetNeedsLayout明示的setNeedsLayoutに実行できます。

デフォルトの動作にしたい場合は、カテゴリのメソッドをオーバーライドできますが、すべてのビューに影響し、パフォーマンスやその他の予期しない問題が発生する可能性があるため、実際にはこれを行いません。

あなたはこのようなことをすることができます

@interface UIView (Layout)
  
- (void)setNeedsLayoutRecursively;

@end

@implementation UIView (Layout)

- (void)setNeedsLayoutRecursively {
  for (UIView *view in self.subviews) {
    [view setNeedsLayoutRecursively];
  }
  [self setNeedsLayout];
}

@end

ブラウザに入力、テストされていません

ただし、これは良い習慣ではないことに注意してください。更新が必要なものだけを更新する必要があります。これにより、パフォーマンスが大幅に低下する可能性があります。注意して使用してください!

于 2011-10-08T16:57:24.933 に答える