iOS: programmation, en modifiant des contraintes d'Interface Builder
Bonne journée les amis!
Je n'ai pas réussi à essayer d'animer les vues qui ont été mis de l'IB à partir du code. Application se bloque avec raison suivante:
Le point de vue de la hiérarchie n'est pas préparé pour la contrainte...
J'ai vu des questions similaires ici et la raison a toujours été que le point de vue qui a été créé par programmation, n'est pas encore ajouté superview. Mais j'ai créé tous les points de vue de l'IB!
La console a également dit:
Vue pas trouvé dans un conteneur de la hiérarchie: (ici c'est superview)
Il ne fait aucun sens pour moi, car en fait, c'est une sous-vue de appropriée superview, et xcode sait - elle imprime afficher la hiérarchie tout de suite et il s'adapte.
Quelle pourrait-être la raison?
Merci!!!!
Edit: le code que j'utilise:
- (void)setEditingConstraintsForView:(UIView *)view
{
//Pin given view to top, fix it height
NSDictionary *givenView = @{@"view":view};
view.translatesAutoresizingMaskIntoConstraints = NO;
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:givenView];
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view(height)]" options:0 metrics:@{@"height":@(viewHeight)} views:givenView];
[self.animatedVIew addSubview:view];
for (NSArray *constraints in @[horizontalConstraints, verticalConstraints]) {
[view addConstraints:constraints];
}
}
Aussi j'ai supprimer toutes les contraintes que j'ai mis dans de l'IB avant d'installer les nouveaux:
- (NSDictionary *)constraintsFromIB
{
if (!_constraintsFromIB) {
_constraintsFromIB = @{@"view1":self.view1.referencingConstraintsInSuperviews,
@"view2":self.view2.referencingConstraintsInSuperviews,
@"view3":self.view3.referencingConstraintsInSuperviews };
}
return _constraintsFromIB;
}
Et puis:
- (void)updateViewConstraints
{
[super updateViewConstraints];
//clear all constraints
for (NSString *viewName in self.constraintsFromIB.allKeys) {
for (NSLayoutConstraint *constraint in self.constraintsFromIB[viewName]) {
[constraint remove];
}
}
}
Mise à JOUR 2: Méthode que j'utilise invoquer le changement: lorsque l'utilisateur touche l'affichage, celui-ci est appelé:
- (void)animateConstraintsForState:(LDYEditingLabel)state
{
self.editingLabel = state;
[UIView animateWithDuration:0.3 animations:^{
[self updateViewConstraints];
[self.view layoutIfNeeded];
}];
}
Plus tard dans updateViewConstraints:
il y a un code qui déclenche ma méthode setEditingConstraintsForView:(UIView *)view
Quelle méthode avez-vous appeler ce code?
viewDidAppear
? viewDidAppear
? ou une autre méthode?Vient d'ajouter un autre modifier. Il déclenche à partir de la appuyez sur l'écran à l'aide de bloc d'animation.
Je ne vois pas le problème de ce que vous avez montré ici. Vous devrez peut-être définir un point d'arrêt, mais j'allais suggérer ce que Charlie Wu viens de mettre dans sa réponse - modifier les contraintes existantes si vous pouvez beaucoup plus facile
Merci en tout cas pour les conseils. On dirait qu'il n'est pas bon de mélanger de l'IB et de coder en dur l'approche.
OriginalL'auteur Aleksandr Shcherbakov | 2015-01-16
Vous devez vous connecter pour publier un commentaire.
si vous utilisez de l'IB pour créer des contraintes, vous pouvez ajouter des contraintes en sortie.
Vous mettez ensuite à jour le contraindre et d'appel [auto updateViewConstraints]; dans le bloc d'animation
si vous utilisez le code, n'avez-vous pas de tonalité de code de la boucle à travers la vue des contraintes et de regarder pour la bonne? il est beaucoup plus difficile à maintenir lorsque la disposition de l'affichage est modifié. Celle-ci, elle pourrait ne pas être le plus propre code, mais il devrait être assez facile à maintenir et à comprendre
OriginalL'auteur Charlie Wu
Si c'était moi, je serais fil les contraintes de IBOutlets et modifier juste les contraintes existantes. Il serait probablement plus facile que l'ajout et la suppression d'un programme.
Vous pouvez aussi avoir besoin d'appeler
setNeedsLayout
après avoir modifié les contraintes.Je garde un tableau de l'évolution des contraintes lors de la définition de la vue et puisque vous ne pouvez modifier la constante de toute façon. Je sous-classe UIVIew et fonctionne très bien pour moi.
OriginalL'auteur skwashua