Buona giornata, amici!iOS: set di vincoli a modifica di programma da Interface Builder
Non è stato possibile tentare di animare le viste impostate in IB dal codice. App blocca con seguente motivazione:
La gerarchia vista non è preparato per il vincolo ...
Ho visto alcune domande simili qui e il motivo era sempre che la vista che è stato creato a livello di codice, è non ancora aggiunto a superview. Ma ho creato tutte le viste in IB!
La console dice anche:
View non trovato in gerarchia del contenitore: (qui va è superview)
Non ha alcun senso per me perché in realtà si tratta di una sottoview della superview appropriata, e xcode lo sa: stampa subito la gerarchia delle viste e si adatta.
Quale potrebbe essere il motivo? Grazie!
Edit: il codice che uso:
- (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];
}
}
Anche io eliminare tutti i vincoli che ho impostato in IB prima di installare nuovo:
- (NSDictionary *)constraintsFromIB
{
if (!_constraintsFromIB) {
_constraintsFromIB = @{@"view1":self.view1.referencingConstraintsInSuperviews,
@"view2":self.view2.referencingConstraintsInSuperviews,
@"view3":self.view3.referencingConstraintsInSuperviews };
}
return _constraintsFromIB;
}
E poi:
- (void)updateViewConstraints
{
[super updateViewConstraints];
// clear all constraints
for (NSString *viewName in self.constraintsFromIB.allKeys) {
for (NSLayoutConstraint *constraint in self.constraintsFromIB[viewName]) {
[constraint remove];
}
} }
UPDATE 2: metodo che uso invocare il cambiamento: quando l'utente tocca la vista, questo si chiama:
- (void)animateConstraintsForState:(LDYEditingLabel)state
{
self.editingLabel = state;
[UIView animateWithDuration:0.3 animations:^{
[self updateViewConstraints];
[self.view layoutIfNeeded];
}];
}
Più tardi nel updateViewConstraints:
c'è un codice che fa scattare il mio metodo setEditingConstraintsForView:(UIView *)view
Puoi mostrare un po 'di codice? – Paulw11
Da quale metodo si richiama questo codice? 'ViewDidAppear'? 'ViewDidAppear'? o qualche altro metodo? – Paulw11
Appena aggiunto un altro edit. Si innesca dal tocco sullo schermo utilizzando il blocco di animazione. –