为了允许灵活的布局,我想创建一个子类UIView,该子类将覆盖layoutSubviews:,以自动将其所有子视图布局在彼此之间,并在每次调整其子视图的大小时继续执行此操作。

但是,我想让超级视图知道应该调用layoutSubviews:的唯一方法是在每个子视图中覆盖该方法,我想尝试避免这种情况(我希望人们能够将任意UIViews添加到父视图,并对此进行了处理)。

有什么方法可以让子视图在子视图更改大小时调用layoutSubviews:,而无需向该子视图中添加任何代码?

最佳答案

您可以使用KVO观察每个子视图的frame属性。每次添加子视图时,您都需要将自己添加为观察者,并在删除子视图时将其移除—您可以在父视图中覆盖didAddSubview:willRemoveSubview:来实现。

- (void)didAddSubview:(UIView *)subview {
    [subview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
}

- (void)willRemoveSubview:(UIView *)subview {
    [subview removeObserver:self forKeyPath:@"frame"];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"frame"]) {
         // Do your layout here...
    }
}

- (void)dealloc {
    // You might need to remove yourself as an observer here, in case
    // your subviews are still used by others
}

关于iphone - 可能使superView截取layoutSubviews:从 subview ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7011148/

10-09 16:28