Mise en page automatique par programmation sur une sous-vue d'un sous-classé UIView

J'ai sous-classé UIView pour faire un custom groupView-je utiliser pour ajouter un peu de choses à ma mise en page d'une manière simple. Cette groupView comprend un UILabel qui est utilisé comme un titre et une UIView qui dessine un roundRect sur c'est CALayer avec une couleur d'arrière-plan. Pensez UITableView de sections. J'ajoute cette groupView à la table de montage séquentiel par la suppression d'une UIView et de le changer de classe à mon sous-classe. Tout fonctionne bien, je passe la tête par l'Utilisateur défini exécution des attributs dans Xcode. Tout fonctionne très bien, j'ai ajouter UILabels de ce point de vue sur le storyboard et il crée l'en-tête de l'étiquette et roundrect lorsqu'il s'exécute.

la structure de ma groupView:

  1. groupView: (UIView)clipToBounds:AUCUN;
    • rubrique: (UILabel) positionné
      au-dessus de la groupView.
    • contentView:(UIView) crée le roundRect
      et la couleur via CALayer, devrait être de la même taille que le groupView.

Quel est donc le problème? Ainsi, en traitant avec mise en page automatique est une douleur pour commencer, mais pour ce sous-classé UIView de travail, j'ai besoin de mettre la contentView contraintes de la programmation. Je ne peux pas comprendre la syntaxe de cette disposition automatique ASCII chaîne de format. Actuellement, j'ai:

 _contentView = [[UIView alloc]initWithFrame:self.bounds];

    _contentView.layer.cornerRadius = 5.0f;
    _contentView.layer.masksToBounds=YES;
    _contentView.backgroundColor=_backgroundColor;
    _contentView.layer.borderWidth=_borderWidth;
    _contentView.layer.borderColor=_borderColor.CGColor;
    [self insertSubview:_contentView atIndex:0];
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self,_contentView);
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[self]-0-[_contentView]-0-[self]" options:0 metrics:nil views:viewsDictionary];

    for (NSLayoutConstraint *constraint in constraints) {
        [_contentView addConstraint:constraint];
    }

Qui se bloque avec: * Résiliation d'application en raison de uncaught exception 'NSGenericException', la raison: "Impossible d'installer contrainte sur la vue. La contrainte de référence de quelque chose de l'extérieur de la sous-arborescence de la vue? C'est illégal. contrainte: vue:>'

J'ai essayé cette première et il ne fonctionne toujours pas:

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];

Qui se bloque avec: * Résiliation d'application en raison de uncaught exception 'NSGenericException', la raison: "Impossible d'installer contrainte sur la vue. La contrainte de référence de quelque chose de l'extérieur de la sous-arborescence de la vue? C'est illégal. contrainte: vue:>'

Coup de gueule: d'une certaine façon cette mise en page automatique est supposer pour nous sauver de travail, mais
Je ne vois pas comment les avantages poids de la surcharge droit maintenant. Pourquoi
sur la terre ont-ils passer de l'aide de références et de méthodes ou de même type
defs à ce archaïque chaîne de format? Comment beaucoup plus facile serait de faire:
[_contentView contrainte:NSLayoutFormatAlignLeading toView:auto
withDistance:0.0 f]; OU quelque chose de similaire? Je voudrais tellement plutôt traiter
avec des ressorts et des jambes de suspension à ce point.

Toute aide à la compréhension, ou en me montrant la syntaxe pour contraindre la contentView à la taille de l'auto serait utile.

Concernant votre coup de gueule : mise en page automatique a une courbe d'apprentissage et vous ont tendance à les détester au premier abord mais une fois que vous pensez entièrement dans les contraintes au lieu de cadres, il est plus facile. Et le "format visuel" est assez inutile, sauf si vous êtes juste la pose de choses dans une rangée. L'autre méthode (constraintWithItem...) est fondamentalement la syntaxe, vous êtes après dans ton délire ci-dessus.
Si quelqu'un d'autre est d'avoir des problèmes de compréhension de cette ASCII-Art chaîne de format, j'ai trouvé ce tutoriel utile. Je sais que c'est pour Ruby, mais la chaîne de format est le même que dans le cas d'Objective-C. seanlilmateus.github.com

OriginalL'auteur brucemartin | 2012-11-20