Xcode6, iOS8 и (void) layoutSubviews
У меня есть пользовательский UILabel, который отлично работает на iOS6 и iOS7. Но на iOS8 эта метка (void) метод layoutSubviews никогда не вызывается.
Я создаю этот ярлык с помощью initWithFrame, поэтому этот метод должен быть вызван - и он вызвал другие версии iOS.
Что происходит с системой autoLayout в iOS8?
Я просто хочу добавить этот ответ, потому что заголовок вопроса может привести к большому количеству ppl здесь с похожими проблемами (например, я).
С iOS 8 до 8.0.2 LayoutSubviews
вызовы ненадежны. Они не могут быть вызваны когда-либо или (в моем случае) вызываются в цикле.
Несмотря на то, что вы не должны этого делать, было довольно безопасно выделять материал в LayoutSubviews, но с этим непонятным (?!) поведением это может привести к ошибкам, затрудняющим трассировку.
Я не знаю, исправляет ли все проблемы 8, но будет некоторое время, пока клиентские устройства не запустит 8.1, и они запустили 8.0.2 СЕЙЧАС
У меня была такая же проблема. На самом деле layoutSubviews больше не вызывается для UILabel на iOS8, так как 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 ];
}
Ошибка была исправлена Apple в iOS 8.1 (бета).
- Вопросы
- Layoutsubviews
- Xcode6, iOS8 и (void) layoutSubviews