如何将子视图大小调整传播到superview大小调整?

时间:2011-11-10 05:10:32

标签: ios uiview uiscrollview key-value-observing autoresize

我正在尝试与自动调整掩码自动执行相反的操作。那是, 我有一个视图层次结构,我需要在最深的子视图框架中向上传播一个更改,以便所有子视图调整大小以适应更新的(可能更大的)子视图。

具体来说,我有一个滚动视图,它有一个子视图作为容器,包含一个表,另一个视图又包含一个图像和另一个表。 像这样:

enter image description here

这就是事件链:

A)

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

但这只是链中的最后一环。这一切都始于最里面的桌子扩展到适合所有细胞......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以检查- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

的最后一次通话
if (indexPath.row == (NumberOfCells - 1)) {
        // update your views (preferably call it after a slight delay)
}