2011-11-10 130 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) 
}