2011-10-08 86 views
4

我有一個UIViewControllerwillRotateToInterfaceOrientation,我打電話[self view] setNeedsLayout];setNeedsLayout在UIView的子視圖

這一觀點調用的它的子視圖的(一個UIScrollViewlayoutSubviews方法,但UIScrollView沒有調用layoutSubviews爲它的子視圖。這是怎麼想的?我想,如果你在查看通話setNeedsLayout,它會調用layoutSubviews對每一個subivew及其子視圖和......

我一定要手動,在UIScrollView覆蓋layoutsubview,並呼籲setNeedsDisplay每個子視圖?

謝謝。

回答

5

我前段時間在我的應用程序中觀察到同樣的情況,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 

在瀏覽器中鍵入的,沒有測試

+0

Thanks..I希望我沒有做到這一點,要避免這種情況。因爲我有一個深層次的視圖層次結構,所以不想真正地去查看大量的UIViews。無論如何,非常感謝您的幫助。 – 0xSina

+0

優秀的小選擇性小碼,完美地解決了我的問題。謝謝! –

+0

但是,孩子的意見不應該擔心父母的狀態。只有當子視圖邊界發生變化時,才需要重新佈置子視圖。如果父母的layoutSubviews(或自動調整大小掩碼)更改孩子的大小,就會發生這種情況。在這種情況下,layoutSubviews向下傳播視圖層次結構。 –