2011-11-10 136 views
3

我正在嘗試做與autoresizing面具自動做相反的事情。也就是, 我有一個視圖層次結構,我需要在鏈上最深的子視圖框架中傳播更改,以便所有子視圖都調整大小以適合較新(可能較大)的子視圖。如何傳播subview調整大小爲superview調整大小?

具體來說,我有一個滾動視圖,有一個子視圖作爲容器,它包含一個表,另一個視圖又包含一個圖像和另一個表。 像這樣:

enter image description here

而這一連串事件:

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); 
    } 
} 

但這僅僅是在鏈中的最後一個環節。這一切都始於最內層的表擴展到適合所有細胞...

任何想法?

+0

那你最終會做什麼? – huggie

回答

0

你可以只檢查的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath最後一次通話

if (indexPath.row == (NumberOfCells - 1)) { 
     // update your views (preferably call it after a slight delay) 
}