iOS:确定所有孩子何时调用layoutSubviews

时间:2013-12-24 19:10:16

标签: ios objective-c uiview uiviewcontroller layoutsubviews

在视图上调用viewDidLayoutSubviews之后立即调用layoutSubviews,之后在该视图的子视图上调用layoutSubviews。有没有办法知道什么时候在一个视图上调用了layoutSubviews,哪些孩子也需要更新它们的布局?

2 个答案:

答案 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++;
    }
}