在视图上调用viewDidLayoutSubviews
之后立即调用layoutSubviews
,之后在该视图的子视图上调用layoutSubviews
。有没有办法知道什么时候在一个视图上调用了layoutSubviews
,哪些孩子也需要更新它们的布局?
答案 0 :(得分:3)
您不必知道子视图的子视图是否已更新其布局:这听起来像是太紧密的耦合。此外,每个子视图可能会以不同的方式处理各自子视图的排列,并且根本不需要(需要)调用layoutSubviews
的子视图。您应该只需了解您的直接子视图。您应该将它们或多或少视为黑盒子,而不关心它们是否具有自己的子视图。
答案 1 :(得分:0)
正如@Johannes Fahrenkrug
所说,你应该“将它们视为黑盒子”。但根据我的理解,这是因为Cocoa无法承诺。
如果您确实需要在所有子视图完成布局工作时收到通知,这里有一个硬核示例可以解决您的问题。我不保证它会在任何情况下都能发挥作用。
- (void) layoutSubviewsIsDone{
// Your code here for layoutSubviews is done
}
// Prepare two parameters ahead
int timesOfLayoutSubviews = 0;
BOOL isLayingOutSubviews = NO;
// Override the layoutSubviews function
- (void) layoutSubviews{
isLayingOutSubviews = YES; // It's unsafe here!
// you may move it to appropriate place according to your real scenario
// Don't forget to inform super
[super layoutSubviews];
}
// Override the setFrame function to monitor actions of layoutSubviews
- (void) setFrame:(CGRect)frame{
if(isLayingOutSubviews){
if(frame.size.width == self.frame.size.width
&& frame.size.height == self.frame.size.height
&& frame.origin.x == self.frame.origin.x
&& frame.origin.y == self.frame.origin.y
&& timesOfLayoutSubviews ==self.subviews.count){
isLayingOutSubviews = NO;
timesOfLayoutSubviews = 0;
[self layoutSubviewsIsDone]; // Detected job done, call your function
}else{
timesOfLayoutSubviews++;
}
}