簡體   English   中英

如何將子視圖大小調整傳播到superview大小調整?

[英]How do I propagate subview resizing to superview resizing?

我試圖與自動調整掩碼自動執行相反的操作。 也就是說,我有一個視圖層次結構,我需要在最深的子視圖框架中向上傳播一個更改,以便所有子視圖調整大小以適應更新的(可能更大的)子視圖。

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

在此輸入圖像描述

這是一系列事件:

一種)

1如果人的名字太長(表示單元格高度是可變的並且在運行時在heightForCellAtIndexPath上計算),則最內層的表(2行)可能必須向下拉伸。

2如果是這樣,則需要觸發此表和圖像的容器視圖的拉伸,以使表中的單元格不會溢出視圖。

3如果是這種情況,那么此容器視圖下方的另一個表需要向下轉換一點以確保它不重疊。 請注意,即使步驟1,2沒有發生,鏈也可以從這里開始。 如果任何此表的3行恰好拉伸以容納更長的文本,則會出現這種情況。

4如果上述任何一個導致長度增加,則最外面的容器視圖也需要拉伸長度。

5最后,如果此外部容器視圖確實拉伸,則根卷軸視圖需要更改其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);
  }
}

但這只是鏈中的最后一環。 這一切都始於最里面的桌子擴展以適應所有細胞......

有任何想法嗎?

您可以檢查最后一次調用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM