uilabel autolayout ios8 xcode6 layoutsubviews

uilabel - Xcode6, iOS8 y layout(void)



autolayout layoutsubviews (3)

Tengo UILabel personalizado que funciona bien en iOS6 e iOS7. Pero en iOS8 nunca se llama al método layoutSubviews de esta etiqueta (nulo). Creo esta etiqueta con initWithFrame, por lo que debe llamarse a este método y se llama en otras versiones de iOS. ¿Qué sucede con el sistema de autoLayout en iOS8?


El error fue corregido por Apple en iOS 8.1 (beta).


Solo quiero agregar esta respuesta porque el título de la pregunta puede llevar a muchas personas aquí con problemas similares (como yo).

Con iOS 8 a 8.0.2 LayoutSubviews llamadas a LayoutSubviews no son confiables. No se pueden llamar nunca o (en mi caso) se llaman en un bucle.

Aunque no debería hacerlo, era bastante seguro asignar cosas en LayoutSubviews, pero con este comportamiento erróneo (?!) Puede causar errores difíciles de rastrear.

No sé si 8.1 soluciona todos los problemas, pero pasará algún tiempo hasta que los dispositivos del cliente ejecuten 8.1 y ejecuten 8.0.2 AHORA


Tuve el mismo problema. Realmente layoutSubviews ya no se llama para UILabel en iOS8, ya que Apple no espera que nadie lo use como superview.

Estoy usando ReactiveCocoaLayout , por lo que puede hacerlo suscribiéndose a rcl_frameSignal o rcl_boundsSignal.

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

O puede usar KVO simple para saber cuándo se ha cambiado el marco:

-(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 ]; }