【问题标题】:Xcode6, iOS8 and (void)layoutSubviewsXcode6、iOS8 和 (void)layoutSubviews
【发布时间】:2014-07-01 12:42:01
【问题描述】:

我有自定义的 UILabel,它在 iOS6 和 iOS7 上运行良好。但是在 iOS8 上,这个标签的 (void)layoutSubviews 方法永远不会被调用。 我用 initWithFrame 创建了这个标签,所以应该调用这个方法 - 它在另一个 iOS 版本上被调用。 iOS8 中的 autoLayout 系统会发生什么?

【问题讨论】:

  • 你有没有想过这个问题?
  • 问题更严重,子视图使用自动布局时,也没有得到 layoutet。
  • 我创建了一个示例项目来显示该问题。在 iOS 7 和 8 上运行以查看差异。 github.com/fabb/LabelTest
  • 我也面临同样的问题。您对此有任何答复吗?
  • 似乎问题已在 iOS 8.1 beta 版本中得到修复。

标签: uilabel autolayout ios8 xcode6 layoutsubviews


【解决方案1】:

我只想添加这个答案,因为问题标题可能会导致很多人在这里遇到类似的问题(比如我)。

对于 iOS 8 到 8.0.2,LayoutSubviews 调用不可靠。它们可能永远不会被调用,或者(在我的情况下)被循环调用。

即使您不应该这样做,在 LayoutSubviews 中分配内容也是相当安全的,但是这种错误 (?!) 行为可能会导致难以追踪的错误。

我不知道 8.1 是否解决了所有问题,但客户设备运行 8.1 并且他们现在确实运行 8.0.2 还需要一段时间

【讨论】:

  • 我在这里面临同样的问题。循环调用“LayoutSubviews”为了覆盖使用iOS 8.0.2的用户,这个bug有修复吗?
  • 不,据我所知没有解决办法。但是您不应该尝试支持处于中间版本的 iOS 版本。如果有人仍在使用 8.0 或 8.0.2,他们可以升级到新版本并自行解决问题。
  • 是的,这是真的。但是,不幸的是,在应用程序中,我们不能要求每个坚持使用该版本的客户升级他们的设备。 ;) 好吧,我想我已经找到了解决办法。感谢您的回复。 :)
【解决方案2】:

我有同样的问题。实际上,iOS8 上的 UILabel 不再调用 layoutSubviews,因为 Apple 不希望有人将其用作超级视图。

我使用的是ReactiveCocoaLayout,所以可以通过订阅 rcl_frameSignal 或 rcl_boundsSignal 来完成。

-(void)awakeFromNib { [ self.rcl_boundsSignal subscribeNext: ^( NSValue* boundsValue ) { //layout changed } ]; }

或者您可以使用简单的 KVO 来了解帧何时更改:

-(void)dealloc
{
   [ self removeObserver: self forKeyPath: @"layer.bounds" ];
}

-(void)observeValueForKeyPath:( NSString* )keyPath
                     ofObject:( id )object
                       change:( NSDictionary* )change
                      context:( void* )context
{
   if ( [ keyPath isEqualToString: @"layer.bounds" ] )
   {
      //layoutSubviews
   }
   else
   {
      [ super observeValueForKeyPath: keyPath
                      ofObject: object
                        change: change
                       context: context ];
   }
}

-(void)awakeFromNib
{
   [ self addObserver: self
           forKeyPath: @"layer.bounds"
              options: NSKeyValueObservingOptionNew
              context: 0 ];
}

【讨论】:

  • 请注意,UIKit 是每个文档 KVO 兼容的 - 即使它适用于某些情况,它也可能在未来中断。
【解决方案3】:

Apple 在 iOS 8.1(测试版)中修复了该错误。

【讨论】:

  • 你有链接或其他东西来支持它吗?
  • 可以确认,layoutSubview 在 8.1 beta 中被再次调用
  • 我已向 Apple 提交了 Radar。我创建了一个示例项目:github.com/fabb/LabelTest
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
相关资源
最近更新 更多