Xcode6,iOS8和(void)layoutSubviews

时间:2014-07-01 12:42:02

标签: uilabel autolayout ios8 xcode6 layoutsubviews

我有自定义的UILabel,可以在iOS6和iOS7上正常使用。但是在iOS8上,这个标签' s(void)layoutSubviews方法永远不会被调用。 我使用initWithFrame创建此标签,因此应该调用此方法 - 并在其他iOS版本上调用它。 iOS8中的autoLayout系统会发生什么?

3 个答案:

答案 0 :(得分:5)

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

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

即使你不应该这样做,在LayoutSubviews中分配东西也是非常安全的,但是这种错误(?!)行为会导致难以追踪的错误。

我不知道8.1是否修复了所有问题,但是在客户设备运行8.1并且它们现在运行8.0.2之前需要一段时间

答案 1 :(得分:4)

我有同样的问题。对于iOS8上的UILabel,不再调用layoutSubviews,因为Apple不希望任何人将它用作superview。

我正在使用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 ];
}

答案 2 :(得分:2)

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