J'ai créé un UIView par programme et j'y ajoute NSLayoutConstraint et cela fonctionne, puis je l'ajoute comme sous-vue de la vue du controller de vue. En ce moment je dois enlever cette vue de superview et un peu plus tard l'append encore. Mais la disposition ne fonctionnera plus si je l'ajoute à nouveau en utilisant self.view addSubview
. Comment faire pour que la layout fonctionne à nouveau?
Vous devez prendre soin de certains points tout en ajoutant et en supprimant des vues de la layout automatique.
Il existe deux methods disponibles dans la class UIView.h
// Allows you to perform layout before the drawing cycle happens. // -layoutIfNeeded forces layout early - (void)setNeedsLayout; - (void)layoutIfNeeded;
Utilisez ces methods selon vos besoins. Donc, je suggère quand vous supprimez sous-vue de la vue, Mettre à jour la contrainte de vue supérieure si cela est nécessaire. Puis appelez la méthode ci-dessous pour refléter les changements de layout.
[self.view layoutIfNeeded];
La plupart des cas ci-dessus la méthode résoudra tous les problèmes liés à la layout. Cependant, un certain time si la structure complexe est là, je veux dire le comportement changeant de l'exécution des vues.
UIViewController
ensuite la méthode ci-dessous dans votre UIViewController
, Effectuez toutes les modifications liées à l'image dans cette méthode.
- (void)viewDidLayoutSubviews
Le problème est que la sous-vue n'hérite pas de la taille / du cadre de la vue d'origine et ajoute la vue comme si elle était bloquée dans la taille Any + Any de 600×600. Ma solution, est de définir le cadre de la vue d'origine, puis laissez iOS faire le rest du travail.
[self.myOtherView setFrame:self.view.frame]; //Replace frame size with already resized view [self.myOtherView setNeedsLayout]; //Tell iOS to autolayout the new sub view [self.addSubView:self.myOtherView]; //Add it
Lorsque vous créez des contraintes, atsortingbuez-le aux variables
@property (nonatomic, strong)NSLayoutConstraint *viewConstraintTop; self.viewConstraintTop = [Your Constraint];
Lorsque vous souhaitez le supprimer de la vue d'set, supprimez les contraintes
[self.viewConstraintTop autoRemove];
Supprimez votre vue et à nouveau en ajoutant la contrainte comme
self.viewConstraintTop = [Your Constraint];