web-dev-qa-db-fra.com

iOS 10 GM avec xcode 8 GM provoque la disparition des vues en raison des coins arrondis et des clipsToBounds

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.

38
Pranoy C

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.

75
Pranoy C

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];
    ...
}
2
ealee

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.

1
olx

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.

Autoresizing settings panel

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.

1
Apurva

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.)

0
Jakub Truhlář

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.

0
andrey.krukovskiy