J'ai testé mon application avec iOS 10 Beta 7 et Xcode 8 beta et tout a bien fonctionné. Cependant, il y a quelques minutes à peine, j'ai installé les versions GM GM maintenant disponibles des deux) et j'ai rencontré un problème étrange.
J'utilise des cellules de vue de tableau personnalisées dans mon application et dans mes cellules personnalisées, j'utilise cornerRadius
et clipsToBounds
pour créer des vues arrondies.
- (void)awakeFromNib {
[super awakeFromNib];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
Cela paraissait correct auparavant cependant dans le nouveau GM libère toutes les vues qui avaient les coins arrondis disparus. Cela est arrivé à UIView
, UILabels
et UIButtons
.
J'ai résolu cela ci-dessous.
Je ne sais pas s'il s'agit d'une nouvelle exigence, mais j'ai résolu cela en ajoutant [self layoutIfNeeded];
avant de faire quelque chose cornerRadius
. Donc, mon nouveau awakeFromNib
personnalisé ressemble à ceci:
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
Maintenant, ils semblent tous bien.
Pour corriger des vues invisibles avec cornerRadius = height/2, créez la catégorie UIView + LayoutFix
Dans le fichier UIView + LayoutFix.m, ajoutez le code:
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
}
ajouter une catégorie au fichier YourProject.PCH.
Cela ne fonctionnera que si vous avez utilisé [super awakeFromNib] dans vos vues:
MyView.m
- (void)awakeFromNib {
[super awakeFromNib];
...
}
cornerRadius
lui-même fonctionne très bien mais la taille sur le cadre n'est pas indiquée correctement. c'est pourquoi layoutIfNeeded
résout le problème.
J'ai rencontré le même problème en passant à TVOS 10. La suppression des contraintes de mise en page automatique et l'utilisation des nouveaux paramètres de redimensionnement automatique dans les storyboards l'ont résolu pour moi.
Mon observation est que iOS 10/TVOS 10 ne dispose pas de vues basées sur la mise en page automatique avant d'appeler awakeFromNib, mais qu'il dispose de vues à l'aide de masques de redimensionnement automatique avant d'appeler la même méthode.
Vous pouvez également voir la vue dans la hiérarchie des vues de débogage, mais vous ne pouvez pas la voir dans l'application.
Vous devez appeler layoutIfNeeded
sur la vue masquée/tronquée affectée.
(Par exemple, si vous avez un UIImageView
et que vous faites masksToBounds
sur son calque et que vous ne pouvez pas voir la vue dans l'application, etc.)
Vous pouvez créer une sous-classe de votre vue comme ceci:
@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
vous aurez donc toujours des coins correctement arrondis.
J'utilise cette approche et je n'ai pas eu de problèmes de mise à niveau vers Xcode8 et iOS10.