Puis-je désactiver autolayout pour une sous-vue spécifique lors de l’exécution?

J’ai une vue qui doit avoir son cadre manipulé par programmation – c’est une sorte de vue de document qui enveloppe son contenu et qui est ensuite défilée et agrandie autour d’une vue en manipulant l’origine du cadre. Autolayout se bat avec ceci à l’exécution.

Désactiver complètement autolayout semble un peu difficile car il pourrait raisonnablement être utilisé pour gérer la présentation des autres vues. Il me semble que ce que je voudrais est une sorte de “contrainte nulle”.

    J’ai eu le même problème. Mais je l’ai résolu.
    Oui, vous pouvez désactiver la mise en page automatique à l’exécution pour une UIView spécifique, au lieu de la désactiver pour l’ensemble xib ou storyboard défini par défaut dans Xcode 4.3 et versions ultérieures.

    Définissez translatesAutoresizingMaskIntoConstraints sur YES avant de définir le cadre de votre sous-vue:

     self.exampleView.translatesAutoresizingMaskIntoConstraints = YES; self.exampleView.frame = CGRectMake(20, 20, 50, 50); 

    J’ai eu un problème similaire où Autolayout était en train de remplacer certains de mes réglages d’image au moment de l’exécution (j’avais une vue dynamic qui dans certains cas poussait un nouveau contrôleur de vue … en poussant puis en appuyant sur Retour réinitialisait la vue initiale).

    J’ai contourné cela en plaçant mon code de manipulation dans viewDidLayoutSubviews de mon View Controller. Cela semble être appelé après toute contrainte appelée par mojo, mais avant viewDidAppear, l’utilisateur n’est donc pas plus sage.

    Peut-être que simplement définir translatesAutoresizingMaskIntoConstraints à YES (et ne pas append de contraintes supplémentaires affectant cette vue) vous permettra de définir le cadre sans combattre le système de présentation automatique.

    Dans iOS 8, vous pouvez définir une NSLayoutConstraint active ou non. Donc, si j’utilise le générateur d’interface, j’ajoute toutes mes contraintes à un OutletCollection, puis j’active ou désactive en utilisant:

     NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad) NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad) 

    L’application que j’utilise pour cela est d’avoir différentes contraintes en mode portrait et paysage et je l’activer / désactiver en fonction de la rotation de l’appareil. Cela signifie que je peux créer des modifications de mise en page complexes tout dans le générateur d’interface pour les deux orientations, tout en utilisant la mise en page automatique sans le code de présentation automatique détaillé.

    Ou vous pouvez activer / désactiver en utilisant removeConstraints et addConstraints.

    Je ne sais pas si cela aidera quelqu’un d’autre, mais j’ai écrit une catégorie pour que cela soit pratique, car je me trouve souvent en train de le faire.

    UIView + DisableAutolayoutTemporarily.h

     #import  @interface UIView (DisableAutolayoutTemporarily) // the view as a parameter is a convenience so we don't have to always // guard against strong-reference cycles - (void)resizeWithBlock:(void (^)(UIView *view))block; @end 

    UIView + DisableAutolayoutTemporarily.m

     #import "UIView+DisableAutoResizeTemporarily.h" @implementation UIView (DisableAutoResizeTemporarily) - (void)resizeWithBlock:(void (^)(UIView * view))block { UIView *superview = self.superview; [self removeFromSuperview]; [self setTranslatesAutoresizingMaskIntoConstraints:YES]; __weak UIView *weakSelf = self; block(weakSelf); [superview addSubview:self]; } @end 

    Je l’utilise comme ceci:

     [cell.argumentLabel resizeWithBlock:^(UIView *view) { [view setFrame:frame]; }]; 

    J’espère que cela aide.

    Vous pouvez définir le type translatesAutoresizingMaskIntoConstraints Boolean , Value Yes dans les atsortingbuts d’exécution définis par l’utilisateur de la vue UIV souhaitée dans xib / storyboard.

    • Projet ouvert en 4.5
    • Sélectionnez le storyboard
    • Ouvrez l’inspecteur de fichiers
    • Sous Interface Builder Document, décochez l’option “Utiliser Autolayout”

    Vous pouvez fractionner plusieurs storyboards si vous souhaitez utiliser autolayout pour certaines vues.

    Pour moi, cela a fonctionné pour créer la sous-vue par programmation, dans mon cas la mise en page automatique était en train de jouer avec une vue que je devais faire pivoter autour de son centre mais une fois que j’ai créé cette vue par programmation, cela fonctionnait.

    À mon avis, j’avais une étiquette et un texte. L’étiquette avait un geste panoramique. L’étiquette se déplace très bien pendant le déplacement. Mais lorsque j’utilise le clavier de zone de texte, l’étiquette rétablit sa position à l’emplacement d’origine défini dans la mise en page automatique. Le problème a été résolu lorsque j’ai ajouté les éléments suivants en un clin d’œil pour le label. J’ai ajouté ceci dans viewWillAppear mais il peut être ajouté à peu près partout où vous avez access au champ cible.

     self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true 

    Cela m’est arrivé dans un projet sans storyboards ou fichiers xib. Tout 100% code. J’avais une bannière publicitaire en bas et je voulais que les limites de la vue s’arrêtent à la bannière publicitaire. La vue se redimensionnerait automatiquement après le chargement. J’ai essayé chaque résolution sur cette page mais aucune n’a fonctionné.

    J’ai fini par créer une sous-vue avec la hauteur raccourcie et l’ai placée dans la vue principale du contrôleur. Ensuite, tout mon contenu est allé dans la vue secondaire. Cela résolvait très facilement le problème sans rien faire qui semblait aller à contre-courant.

    Je pense que si vous voulez une vue qui ne correspond pas à la taille normale qui remplit la fenêtre, vous devez utiliser une vue secondaire pour cela.

    J’ai rencontré un scénario similaire, dans lequel j’ai rejoint un projet initié avec la mise en page automatique, mais je devais apporter des ajustements dynamics à plusieurs vues. Voici ce qui a fonctionné pour moi:

    1. N’aurez PAS de vues ou de composants dans le générateur d’interface.

    2. Ajoutez vos vues purement par programmation en commençant par alloc / init et en définissant leurs frameworks de manière appropriée.

    3. Terminé.

    Au lieu de désactiver l’autolayout, je calculerais simplement la nouvelle contrainte avec l’image que vous remplacez. Cela me semble être le moyen approprié. Si vous ajustez des composants qui reposent sur des contraintes, ajustez-les en conséquence.

    Par exemple, si vous avez une contrainte verticale de 0 entre deux vues (myView et otherView) et que vous avez un geste panoramique ou quelque chose qui ajuste la hauteur de myView, vous pouvez recalculer la contrainte avec les valeurs ajustées.

     self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height); [self.myView needsUpdateConstraints]; 

    Pour ceux d’entre vous qui utilisent la mise en page automatique, veuillez consulter ma solution ici . Vous devriez faire les @IBOutlet des contraintes que vous voulez ajuster et ensuite changer leurs constantes.

    si c’est un fichier xib:

    1. sélectionnez le fichier .xib
    2. sélectionnez le “propriétaire du fichier”
    3. montrer les utilitaires
    4. cliquez sur: “File Inspector”
    5. Sous “Document du générateur d’interface”, désactivez: “Utiliser Autolayout”