谁能对两者之间的关系给出明确的解释UIView's
setNeedsLayout
, layoutIfNeeded
and layoutSubviews
方法?以及一个使用所有三个的示例实现。谢谢。
让我感到困惑的是,如果我将自定义视图发送给setNeedsLayout
在此方法之后调用的下一个消息是layoutSubviews
, 直接跳过layoutIfNeeded
。从文档中我预计流程是setNeedsLayout
> 原因layoutIfNeeded
被称为 > 原因layoutSubviews
被称为。
我仍在尝试自己解决这个问题,因此请对此持怀疑态度,如果其中包含错误,请原谅我。
setNeedsLayout
是一个简单的方法:它只是在 UIView 中的某个位置设置一个标志,将其标记为需要布局。这将迫使layoutSubviews
在下一次重绘发生之前在视图上调用。请注意,在许多情况下,您不需要显式调用它,因为autoresizesSubviews
财产。如果已设置(默认情况下),则对视图框架的任何更改都将导致视图布置其子视图。
layoutSubviews
是你做所有有趣事情的方法。它相当于drawRect
如果您愿意的话,可以进行布局。一个简单的例子可能是:
-(void)layoutSubviews {
// Child's frame is always equal to our bounds inset by 8px
self.subview1.frame = CGRectInset(self.bounds, 8.0, 8.0);
// It seems likely that this is incorrect:
// [self.subview1 layoutSubviews];
// ... and this is correct:
[self.subview1 setNeedsLayout];
// but I don't claim to know definitively.
}
AFAIK layoutIfNeeded
通常不意味着在您的子类中被覆盖。这是当您想要布局视图时应该调用的方法现在。 Apple 的实现可能如下所示:
-(void)layoutIfNeeded {
if (self._needsLayout) {
UIView *sv = self.superview;
if (sv._needsLayout) {
[sv layoutIfNeeded];
} else {
[self layoutSubviews];
}
}
}
你会打电话layoutIfNeeded
以迫使它(及其必要的监督)立即被布置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)