如何将子视图的调整大小传递到父视图的调整大小?

3
我试图做与自动调整掩码相反的事情。也就是说,我有一个视图层次结构,我需要传播最深子视图框架的更改,使所有子视图调整大小以适应更新后的(可能更大的)子视图。
具体来说,我有一个滚动视图,其作为容器的子视图包含一个表格和另一个视图,该视图又包含图像和另一个表格。如下所示:
https://istack.dev59.com/BN3lI.webp 事件链如下:
A)
1. 最内部的2行表格可能会向下伸展,如果人名过长,则单元格高度可变且在heightForCellAtIndexPath上运行时计算。
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);
  }
}

但这只是链条中的最后一个链接。一切始于最内层的表格扩展以适应所有单元格...你有任何想法吗?

你最终做了什么? - huggie
1个回答

0
你可以检查最后一次调用的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath函数。
if (indexPath.row == (NumberOfCells - 1)) {
        // update your views (preferably call it after a slight delay)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接