为了允许灵活的布局,我想创建一个子类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/