iOS 10 GM con xcode 8 GM provoca que las vistas desaparezcan debido a RoundedCorners y clipsToBounds

Probé mi aplicación con iOS 10 Beta 7 y Xcode 8 beta y todo funcionó bien. Sin embargo, hace solo unos minutos instalé las versiones de GM disponibles de ambos y me enfrenté a un problema extraño.

Estoy usando celdas de vista de tabla personalizadas en mi aplicación y en celdas personalizadas estoy usando cornerRadius y clipsToBounds para crear vistas networkingondeadas.

 - (void)awakeFromNib { [super awakeFromNib]; self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2; self.tag2label.clipsToBounds=YES; } 

Esto parecía estar bien antes, sin embargo, en el nuevo GM, se liberaron todas las vistas que tenían las esquinas networkingondeadas. Esto sucedió con UIView , UILabels y UIButtons .

Solucioné esto a continuación.

No estoy seguro de si este es un nuevo requisito, pero solucioné esto agregando [self layoutIfNeeded]; antes de hacer cualquier cosa de cornerRadius . Entonces, mi nuevo awakeFromNib personalizado de awakeFromNib ve así:

 - (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded]; self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2; self.tag2label.clipsToBounds=YES; } 

Ahora todos parecen estar bien.

Para arreglar vistas invisibles con cornerRadius = altura / 2 crear categoría UIView + LayoutFix

En el file UIView + LayoutFix.m agregue el código:

 - (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded]; } 

agregue categoría al file YourProject.PCH.

Funcionará solo si usó [super awakeFromNib] en sus vistas:

MyView.m

 - (void)awakeFromNib { [super awakeFromNib]; ... } 

cornerRadius sí funciona bien, pero el tamaño en el marco se informa incorrectamente. por lo que layoutIfNeeded corrige el problema.

Me he enfrentado al mismo problema al cambiarme a TVOS 10. Eliminar las restricciones de layout automático y usar las nuevas configuraciones de Autoresisado en guiones charts lo resolvió para mí.

Panel de configuración de autenticación

Mi observación es que iOS 10 / TVOS 10 no está presentando vistas basadas en layout automático antes de llamar a awakeFromNib, sino que está presentando vistas utilizando máscaras de autoría antes de llamar al mismo método.

Puedes crear una subclass de tu vista así:

 @implementation RoundImageView - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { self.layer.masksToBounds = YES; self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; [self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(self)]; } return self; } -(void)dealloc { [self removeObserver:self forKeyPath:@"bounds" context:(__bridge void * _Nullable)(self)]; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"]) { self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; } } @end 

por lo que siempre tendrá esquinas correctamente networkingondeadas.

Utilizo este enfoque y no tuve problemas para actualizar a Xcode8 y iOS10.

También puede ver la vista en la jerarquía de vista de debugging , pero no puede verla en la aplicación.

Tiene que llamar a layoutIfNeeded en la vista enmascarada / recortada afectada.

(Por ejemplo, si tienes una UIImageView y haces masksToBounds en su capa y no puedes ver la vista en la aplicación, etc.)