J'ai une vue qui doit avoir son cadre manipulé par programme - c'est une sorte de vue de document qui s'enroule sur son contenu qui est ensuite fait défiler et zoomé autour d'une vue supervisée en manipulant l'origine du cadre. Autolayout se bat avec cela au moment de l'exécution.
La désactivation complète de la mise en page automatique semble un peu difficile car elle pourrait raisonnablement être utilisée pour gérer la mise en page des autres vues. Il semble que je pourrais souhaiter une sorte de "contrainte nulle".
la source
J'ai eu un problème similaire où la mise en page automatique remplaçait certains de mes paramètres de trame au moment de l'exécution (j'avais une vue dynamique qui, dans certains cas, poussait un nouveau contrôleur de vue ... pousser puis appuyer sur Retour réinitialiserait la vue initiale).
J'ai contourné ce problème en insérant mon code de manipulation dans
viewDidLayoutSubviews
mon View Controller. Cela semble être appelé après l'appel de la contrainte mojo, mais avant viewDidAppear, donc l'utilisateur n'est pas le plus sage.la source
Peut-être que simplement définir
translatesAutoresizingMaskIntoConstraints
surYES
(et ne pas ajouter de contraintes supplémentaires affectant cette vue) vous permettra de définir le cadre sans lutter contre le système de disposition automatique.la source
Dans iOS 8, vous pouvez définir un NSLayoutConstraint pour qu'il soit actif ou non. Donc, si j'utilise le constructeur d'interface, j'ajoute toutes mes contraintes à un OutletCollection puis j'active ou je désactive en utilisant:
L'application particulière pour laquelle je l'utilise ici a des contraintes différentes en mode portrait et paysage et j'active / désactive en fonction de la rotation de l'appareil. Cela signifie que je peux créer des modifications de mise en page complexes dans le générateur d'interface pour les deux orientations, et continuer à utiliser la mise en page automatique sans le code de mise en page automatique détaillé.
Ou vous pouvez activer / désactiver en utilisant removeConstraints et addConstraints.
la source
Je ne sais pas si cela aidera quelqu'un d'autre, mais j'ai écrit une catégorie pour rendre cela pratique parce que je me retrouve à faire cela beaucoup.
UIView + DisableAutolayoutTemporately.h
UIView + DisableAutolayoutTemporately.m
Je l'utilise comme ça:
J'espère que ça aide.
la source
Vous pouvez définir le
translatesAutoresizingMaskIntoConstraints
typeBoolean
, Valeur Oui dans les attributs d'exécution définis par l'utilisateur de l'UIView que vous voulez dans le xib / storyboard.la source
Vous pouvez diviser en plusieurs storyboards si vous souhaitez utiliser la disposition automatique pour certaines vues.
la source
Pour moi, cela fonctionnait pour créer la sous-vue par programme, dans mon cas, la mise en page automatique perturbait une vue dont je devais faire pivoter autour de son centre, mais une fois que j'ai créé cette vue par programme, cela fonctionnait.
la source
À mon avis, j'avais une étiquette et un texte. L'étiquette avait un geste panoramique. L'étiquette se déplace bien pendant le glissement. Mais lorsque j'utilise le clavier de la zone de texte, l'étiquette réinitialise sa position à l'emplacement d'origine défini dans la disposition automatique. Le problème a été résolu lorsque j'ai ajouté ce qui suit dans Swift pour l'étiquette. J'ai ajouté ceci dans viewWillAppear mais il peut être ajouté à peu près partout où vous avez accès au champ cible.
la source
Cela m'est arrivé dans un projet sans storyboards ni fichiers xib. Tous les codes à 100%. J'avais une bannière publicitaire en bas et je voulais que les limites de vue s'arrêtent à la bannière publicitaire. La vue se redimensionnerait automatiquement après le chargement. J'ai essayé toutes les résolutions de cette page mais aucune n'a fonctionné.
J'ai fini par créer une vue secondaire avec la hauteur raccourcie et je l'ai placée dans la vue principale du contrôleur. Ensuite, tout mon contenu est entré dans la vue secondaire. Cela a résolu le problème très facilement sans rien faire qui semblait aller à contre-courant.
Je pense que si vous voulez une vue qui n'est pas la taille normale qui remplit la fenêtre, vous devriez utiliser une vue secondaire pour cela.
la source
J'ai rencontré un scénario similaire, dans lequel j'ai rejoint un projet initié avec la mise en page automatique, mais j'avais besoin de faire des ajustements dynamiques sur plusieurs vues. Voici ce qui a fonctionné pour moi:
N'ayez PAS de vues ou de composants présentés dans le générateur d'interface.
Ajoutez vos vues de manière purement programmatique en commençant par alloc / init et en définissant leurs cadres de manière appropriée.
Terminé.
la source
Au lieu de désactiver la mise en page automatique, je calculerais simplement la nouvelle contrainte avec le cadre que vous remplacez. Cela me semble être la manière appropriée. 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 mouvement de panoramique ou quelque chose qui ajuste la hauteur de myView, vous pouvez recalculer la contrainte avec les valeurs ajustées.
la source
Pour ceux d'entre vous qui utilisent la mise en page automatique, veuillez consulter ma solution ici . Vous
@IBOutlet
devez définir les contraintes que vous souhaitez ajuster, puis modifier leurs constantes.la source
s'il s'agit d'un fichier xib:
la source