ios objective-c ios10

iOS 10 GM con xcode 8 GM hace que desaparezcan las vistas debido a los redondeosCorners y clipsToBounds



objective-c ios10 (6)

Me enfrenté al mismo problema al mudarme a TVOS 10. Eliminé las restricciones de diseño automático y el uso de las nuevas configuraciones de Autoresizing en guiones gráficos me lo resolvió.

Mi observación es que iOS 10 / TVOS 10 no está diseñando vistas basadas en el diseño automático antes de llamar a awakeFromNib, sino que está diseñando vistas usando máscaras de autocalibración antes de llamar al mismo método.

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 para ambos y me enfrenté a un problema extraño.

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

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

Esto se veía bien antes, sin embargo, en los nuevos lanzamientos de GM desaparecieron todas las vistas que tenían las esquinas redondeadas. Esto le sucedió a UIView , UILabels y UIButtons .

Lo resolví a continuación.


No estoy seguro de si este es un nuevo requisito, pero lo resolví agregando [self layoutIfNeeded]; antes de hacer cualquier cosa de cornerRadius . Así que mi nueva y personalizada 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 = height / 2 crea la categoría UIView + LayoutFix

En el archivo UIView + LayoutFix.m agrega el código:

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

agregue categoría al archivo YourProject.PCH.

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

MyView.m

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


Podrías crear una subclase 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

para que siempre tengas las esquinas redondeadas correctamente

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


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

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

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


cornerRadius funciona bien, pero el tamaño en el marco se informa incorrectamente. por eso layoutIfNeeded soluciona el problema.