我刚看到他们调用的Facebook SDK for iOS [super layoutSubviews];
最后而不是在开头 layoutSubviews
方法。
据我所知,我们应该始终把它作为第一行。
可以以不同的方式实现它会导致任何意外的UI行为吗?
- (void)layoutSubviews
{
CGSize size = self.bounds.size;
CGSize longTitleSize = [self sizeThatFits:size title:[self _longLogInTitle]];
NSString *title = (longTitleSize.width <= size.width ?
[self _longLogInTitle] :
[self _shortLogInTitle]);
if (![title isEqualToString:[self titleForState:UIControlStateNormal]]) {
[self setTitle:title forState:UIControlStateNormal];
}
[super layoutSubviews];
}
根据 UIView类参考,
此方法的默认实现在iOS 5.1及更早版本中不执行任何操作。否则,默认实现使用您设置的任何约束来确定任何子视图的大小和位置。
因此,Facebook SDK示例应用程序调用 [super layoutSubviews]
在他们的实现结束时可能是最初为iOS 5.1之前的iOS版本构建的应用程序的工件。
对于iOS的更新版本,您应该致电 [super layoutSubviews]
在您的实施开始时。否则,超类将在您执行自定义布局后重新排列子视图,从而有效地忽略了您的实现 layoutSubviews()
。
查看代码,在[super layoutSubviews]之前,它不是关于框架的。所以把它放在最后也可能运作良好。
我想编码器必须要检查标题并根据一些规则修改标题,他认为每次调用layoutSubviews都是一个合适的机会,所以他把代码放在这里。
你总是要打电话 [super layoutSubviews]
最后,如果视图的内在内容大小将被更改。如果更改按钮的标题,则为内在的内容大小 UIButton
将被更改,因此是最后一次通话。
第一次打电话给 [super layoutSubviews]
始终需要,因为iOS会根据约束更新布局。
但是,实现样本的技术最正确的方法应该是:
- (void)layoutSubviews
{
[super layoutSubviews];
CGSize size = self.bounds.size;
CGSize longTitleSize = [self sizeThatFits:size title:[self _longLogInTitle]];
NSString *title = (longTitleSize.width <= size.width ?
[self _longLogInTitle] :
[self _shortLogInTitle]);
if (![title isEqualToString:[self titleForState:UIControlStateNormal]]) {
[self setTitle:title forState:UIControlStateNormal];
}
[super layoutSubviews];
}