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