我正在嘗試做與autoresizing面具自動做相反的事情。也就是, 我有一個視圖層次結構,我需要在鏈上最深的子視圖框架中傳播更改,以便所有子視圖都調整大小以適合較新(可能較大)的子視圖。如何傳播subview調整大小爲superview調整大小?
具體來說,我有一個滾動視圖,有一個子視圖作爲容器,它包含一個表,另一個視圖又包含一個圖像和另一個表。 像這樣:
而這一連串事件:
A)
1最裏面的桌子,2行,可能如果伸展下來的名稱人太長(這意味着單元高度是可變的,並且在運行時在heightForCellAtIndexPath上進行計算)。
2如果是這樣,這需要觸發此表和圖像的容器視圖的拉伸,以便表中的單元最終不會溢出視圖。
3如果是這種情況,那麼該容器視圖下方的另一個表格需要翻譯一下,以確保它不重疊。請注意,即使步驟1,2沒有發生,鏈也可以從這裏開始。如果這個表的3行恰好伸展以容納更長的文本,就會出現這種情況。
4如果上述任何一種導致長度增加,則最外面的容器視圖也需要拉長。最後,如果這個外部容器視圖確實拉伸了,那麼根滾動視圖需要改變其contentSize屬性,以便新的更大的視圖適合並且如果大於設備的屏幕則可以完全滾動。
第一個問題是知道什麼時候(代碼中的哪一點)是完成佈置其單元格並計算其最終幀的最內層表格。如果我知道什麼時候才知道最終幀,我可以發送一個關於view.frame更改的KVO通知給管理所有這些視圖的單個視圖控制器。但是,然後控制器將不得不手動調整所有子視圖幀的大小。我試過這種方法,但框架似乎並不準確。我想知道是否可能存在時間問題,我不考慮。
這適用於例如:
- (void)viewDidLoad
{
...
[self addObserver:self forKeyPath:@"attendeeContentView.frame" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"attendeeContentView.frame"])
{
CGRect newFrame = [[change objectForKey:NSKeyValueChangeOldKey] CGRectValue];
UIScrollView *scrollView = (UIScrollView*)self.view;
scrollView.contentSize = CGSizeMake([[UIScreen mainScreen] applicationFrame].size.width, newFrame.size.height + newFrame.origin.y);
NSLog(@"\n new contentSize: %f", newFrame.size.height + newFrame.origin.y);
}
}
但這僅僅是在鏈中的最後一個環節。這一切都始於最內層的表擴展到適合所有細胞...
任何想法?
那你最終會做什麼? – huggie