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.