繁体   English   中英

调用[super layoutSubviews]的正确方法是什么?

[英]What is the correct way to call [super layoutSubviews]?

我刚刚在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];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM