Question

Xcode, Interface Builder problème
Personnellement, je n'aime pas la façon dont cette interface builder travaille dans Xcode.Dans cet exemple, je suis en train de créer une assez complexe-vue-contrôleur.Sur le viewDidLoad de la vue-contrôleur-je montrer une alerte personnalisée de vue (comme tel).Il n'est pas réellement une alerte de vue, mais plus d'un point de vue qui montre à l'utilisateur de l'information.J'ai un arrière-plan estompé vue et une vue sur le dessus de cela.Si j'essaie de créer cette interface builder ça devient trop compliqué que vous ne pouvez pas sélectionner les points de vue à l'arrière-plan et de les déplacer ... sans tomber dans les sous-vues les vues erronées, et ainsi de suite...

Scénario
Ce que j'essaie de faire est de créer une Vue qui détient certaines des étiquettes et un bouton.Le point de vue du contrôleur, la difficulté de propriété sur cette base, il aura un texte différent dans les étiquettes/quantité d'étiquettes.
I. e.Facile -- 3 étiquettes
Dur -- 4 étiquettes

J'ai créer le dimmedView et d'alerte(de style)Afficher comme ceci:

// Setup the dimmedView
UIView *dimmedView = [[UIView alloc] initWithFrame:self.view.frame];
dimmedView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];

// Setup the startingAlertView
UIView *startingAlertView = [[UIView alloc] init];
startingAlertView.backgroundColor = [UIColor whiteColor];

J'ai ensuite créer les trois/quatre étiquettes basées sur la logique et ajouter le necassary des étiquettes à l' startingAlertView basé sur la logique aussi.

Le problème évident est que, à aucun moment, un cadre pour l'affichage est défini.Cela signifie qu'il est de retour 0,0,0,0.Ce que je voudrais arriver, c'est la vue de prendre de la hauteur requise basée sur les étiquettes ajoutées.

Je suis bâtiment pour IOS7 et en utilisant la Mise en page Automatique.Dois-je mettre en place des contraintes qui seraient ensuite ajuster pertinentes des hauteurs et des emplacements en vue éventuellement?

Était-ce utile?

La solution

Je suis bâtiment pour IOS7 et en utilisant la Mise en page Automatique.Dois-je mettre en place des contraintes qui seraient ensuite ajuster pertinentes des hauteurs et des emplacements en vue éventuellement?

Oui.vous n'utilisez pas initWithFrame: en vertu de la disposition automatique, ou plutôt, vous pouvez, mais la trame est ignorée.Créez votre gradation de vue avec un cadre de CGRectZero, réglage translatesAutoresizingMasksToConstraints NON, l'ajouter à votre écran principal et de créer des contraintes épingler à tous les bords de la superview.

Ajoutez ensuite votre alerte de vue, encore une fois avec un cadre de zéro et de la translates... propriété définie sur NON.Créer des contraintes pour le centre de ce point de vue dans votre gradation de vue.Cette vue d'obtenir sa taille de ses sous-vues, car les étiquettes ont une taille intrinsèque.

Ajoutez vos étiquettes comme des sous-vues de ce point de vue, avec cadre de zéro et translates... la valeur NO.En fonction de leur contenu que vous souhaitez mettre privilégiées max largeur de présentation ou une largeur de contrainte.

Créer des contraintes épingler vos étiquettes pour les bords gauche et droit de la superview, et la doublure de vos étiquettes en un vertical "pile".Dans chaque cas, vous pourriez ajouter un rembourrage pour donner votre alerte un peu d'une frontière.

Cela peut ressembler à une grande quantité de code, de sorte que vous voudrez peut-être lire les articles que j'ai écrits sur format visuel pour la mise en page automatique et la création de contraintes dans le code, avec les associés mise en page automatique de la commodité de la catégorie pour rendre votre vie plus facile.

Autres conseils

Si vous allez à la disposition automatique de l'itinéraire, puis vous pouvez ajouter des contraintes qui permettra de conserver le bon espace entre chaque étiquette, et le bon espace entre le haut et le bas de la vue à la première et la dernière étiquette.Toutefois, si vous ne faites pas ceci dans Interface Builder, vous pouvez aussi sauter à l'aide de disposition automatique aussi, parce que c'est assez simple il suffit de régler la hauteur de la vue que vous ajoutez des étiquettes.

Vous commencez par le réglage de la hauteur de la vue de la taille du haut et du bas des espaces que vous voulez avoir autour de les étiquettes.Ensuite, chaque fois que vous ajoutez une étiquette, ajoutez-y la hauteur de l'étiquette en plus de la hauteur de l'espace que l'on met entre les étiquettes.

Vous pouvez aussi attendre jusqu'à ce que vous ayez ajouté toutes les étiquettes que vous souhaitez, puis réglez la hauteur de la partie inférieure de l'étiquette de position y de plus sa hauteur, plus le fond de l'espace que vous souhaitez avoir autour de les étiquettes.

Oui, en utilisant la mise en forme automatique, vous pouvez obtenir les limites de la vue parent.

Voici un exemple rapide, notez que nous ne sommes pas à l'aide de cadre, et à l'aide de CGRectZero pour notre UILabels, le positionnement vient de updateConstraints au lieu de cela.Je suis à l'aide de Format Visuel De La Langue pour la mise en page des étiquettes que je recommande si vous êtes de le faire par programmation.

Ici nous faisons les étiquettes de la largeur de la vue parent et puis juste empilés les uns sur les autres.

#import "View.h"

@implementation View{
    UILabel *_label1;
    UILabel *_label2;
    UILabel *_label3;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _label1 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label1.translatesAutoresizingMaskIntoConstraints = NO;
        _label1.text = @"LABEL 1";

        _label2 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label2.translatesAutoresizingMaskIntoConstraints = NO;
        _label2.text = @"LABEL 2";

        _label3 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label3.translatesAutoresizingMaskIntoConstraints = NO;
        _label3.text = @"LABEL 3";

        [self addSubview:_label1];
        [self addSubview:_label2];
        [self addSubview:_label3];
    }


    [self updateConstraintsIfNeeded];

    return self;
}

-(void)updateConstraints
{
    [super updateConstraints];

    NSDictionary *_viewsDictionary = NSDictionaryOfVariableBindings(_label1,_label2,_label3);


    // Set the contraintsto span the entire width of the super view
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label1]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];

    [self addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label2]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];
    [self addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label3]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];

    [self addConstraints:constraints];


    // Last setup the vertical contraints other wise they will end up in a random place
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label1]-[_label2]-[_label3]"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];
    [self addConstraints:constraints];
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top