Xcode6, iOS8 и (void) layoutSubviews

89
9

У меня есть пользовательский UILabel, который отлично работает на iOS6 и iOS7. Но на iOS8 эта метка (void) метод layoutSubviews никогда не вызывается.
Я создаю этот ярлык с помощью initWithFrame, поэтому этот метод должен быть вызван - и он вызвал другие версии iOS.
Что происходит с системой autoLayout в iOS8?

спросил(а) 2014-07-01T15:42:00+04:00 5 лет, 5 месяцев назад
3
Решение
82

Я просто хочу добавить этот ответ, потому что заголовок вопроса может привести к большому количеству ppl здесь с похожими проблемами (например, я).


С iOS 8 до 8.0.2 LayoutSubviews вызовы ненадежны. Они не могут быть вызваны когда-либо или (в моем случае) вызываются в цикле.

Несмотря на то, что вы не должны этого делать, было довольно безопасно выделять материал в LayoutSubviews, но с этим непонятным (?!) поведением это может привести к ошибкам, затрудняющим трассировку.


Я не знаю, исправляет ли все проблемы 8, но будет некоторое время, пока клиентские устройства не запустит 8.1, и они запустили 8.0.2 СЕЙЧАС

ответил(а) 2014-10-02T17:37:00+04:00 5 лет, 2 месяца назад
Еще 2 ответа
72

У меня была такая же проблема. На самом деле 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 ];
}

ответил(а) 2014-09-10T15:44:00+04:00 5 лет, 2 месяца назад
54

Ошибка была исправлена ​​Apple в iOS 8.1 (бета).

ответил(а) 2014-10-01T12:25:00+04:00 5 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема