5 votes

Appliquer des NSLayoutConstraints à une sous-classe de UIView

J'ai déjà essayé d'utiliser des contraintes AutoLayout dans IB et je comprends comment elles fonctionnent et qu'elles doivent être non ambiguës, etc ...

Mais lorsque vous avez plus de quelques vues, cela devient un peu compliqué et tend à se casser.

Alors, je viens de lire un blog où un gars avait le même problème et utilisait le code ASCII pour créer les contraintes à la place.

J'ai une UITableView avec une UITableViewCell personnalisée qui a une taille dynamique basée sur la quantité de contenu. Un candidat idéal pour Auto Layout.

J'ai donc essayé plusieurs façons de le faire et maintenant j'ai réduit le contenu pour qu'il n'y ait qu'une seule étiquette dans la cellule.

Je voudrais que l'étiquette remplisse la cellule avec une bordure autour.

c'est-à-dire la taille standard pointe à partir de chaque bord de la cellule.

Je l'ai fait comme ça...

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
        _label.textColor = [UIColor colorWithWhite:0.53 alpha:1.0];
        _label.backgroundColor = [UIColor yellowColor];
        [self addSubview:_label];

        NSDictionary *views = NSDictionaryOfVariableBindings(_label);

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label]-|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:views]];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[_label]-|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:views]];

        self.backgroundView = [[UIView alloc] initWithFrame:CGRectZero];
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

Mais lorsque la cellule est affichée, l'étiquette est dans le coin supérieur gauche exactement comme le CGRect que j'ai utilisé pour l'initialiser et je reçois cette série d'erreurs concernant les contraintes...

Impossible de satisfaire simultanément les contraintes.
    Probablement au moins l'une des contraintes de la liste suivante est une que vous ne voulez pas. Essayez ceci : (1) examinez chaque contrainte et essayez de comprendre laquelle vous n'attendez pas ; (2) trouvez le code qui a ajouté la ou les contraintes non désirées et corrigez-le. (Remarque : si vous voyez des NSAutoresizingMaskLayoutConstraints que vous ne comprenez pas, consultez la documentation de la propriété UIView translatesAutoresizingMaskIntoConstraints) 
(
    "",
    ""
)

Tentative de récupération en cassant la contrainte 

Interrompez objc_exception_throw pour capturer cela dans le débogueur.
Les méthodes de la catégorie UIConstraintBasedLayoutDebugging sur UIView répertoriées dans  peuvent également être utiles.
2013-03-07 11:56:14.841 unasys[13082:907] Impossible de satisfaire simultanément les contraintes.
    Probablement au moins l'une des contraintes de la liste suivante est une que vous ne voulez pas. Essayez ceci : (1) examinez chaque contrainte et essayez de comprendre laquelle vous n'attendez pas ; (2) trouvez le code qui a ajouté la ou les contraintes non désirées et corrigez-le. (Remarque : si vous voyez des NSAutoresizingMaskLayoutConstraints que vous ne comprenez pas, consultez la documentation de la propriété UIView translatesAutoresizingMaskIntoConstraints) 
(
    "",
    ""
)

Tentative de récupération en cassant la contrainte 

Interrompez objc_exception_throw pour capturer cela dans le débogueur.
Les méthodes de la catégorie UIConstraintBasedLayoutDebugging sur UIView répertoriées dans  peuvent également être utiles.
2013-03-07 11:56:14.854 unasys[13082:907] Impossible de satisfaire simultanément les contraintes.
    Probablement au moins l'une des contraintes de la liste suivante est une que vous ne voulez pas. Essayez ceci : (1) examinez chaque contrainte et essayez de comprendre laquelle vous n'attendez pas ; (2) trouvez le code qui a ajouté la ou les contraintes non désirées et corrigez-le. (Remarque : si vous voyez des NSAutoresizingMaskLayoutConstraints que vous ne comprenez pas, consultez la documentation de la propriété UIView translatesAutoresizingMaskIntoConstraints) 
(
    "",
    "",
    "",
    ""
)

Tentative de récupération en cassant la contrainte 

Interrompez objc_exception_throw pour capturer cela dans le débogueur.
Les méthodes de la catégorie UIConstraintBasedLayoutDebugging sur UIView répertoriées dans  peuvent également être utiles.
2013-03-07 11:56:14.858 unasys[13082:907] Impossible de satisfaire simultanément les contraintes.
    Probablement au moins l'une des contraintes de la liste suivante est une que vous ne voulez pas. Essayez ceci : (1) examinez chaque contrainte et essayez de comprendre laquelle vous n'attendez pas ; (2) trouvez le code qui a ajouté la ou les contraintes non désirées et corrigez-le. (Remarque : si vous voyez des NSAutoresizingMaskLayoutConstraints que vous ne comprenez pas, consultez la documentation de la propriété UIView translatesAutoresizingMaskIntoConstraints) 
(
    "",
    "",
    "",
    ""
)

Tentative de récupération en cassant la contrainte 

et je ne sais pas du tout par où commencer pour déboguer cela. Les contraintes sont absolument minimales mais cela échoue complètement.

Est-ce que quelqu'un peut me donner des indications sur la bonne manière de faire fonctionner cette contrainte?

13voto

iain Points 3778

Après la ligne

_label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

ajouter

[_label setTranslatesAutoresizingMaskIntoConstraints:NO];

Par défaut, le masque de redimensionnement automatique est également converti en contraintes, ce qui entre en conflit avec les contraintes que vous avez définies, le rendant ambigu

La documentation est ici : setTranslatesAutoresizingMaskIntoConstraints

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X