我正在尝试做与autoresizing面具自动做相反的事情。也就是, 我有一个视图层次结构,我需要在链上最深的子视图框架中传播更改,以便所有子视图都调整大小以适合较新(可能较大)的子视图。如何传播subview调整大小为superview调整大小?
具体来说,我有一个滚动视图,有一个子视图作为容器,它包含一个表,另一个视图又包含一个图像和另一个表。 像这样:
而这一连串事件:
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);
}
}
但这仅仅是在链中的最后一个环节。这一切都始于最内层的表扩展到适合所有细胞...
任何想法?
那你最终会做什么? – huggie