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