Così sto cercando di animare alcuni vincoli di layout e sto avendo misera fortuna, io non basta vedere qualsiasi cosa e poi ricevo un messaggio di errore che dice come esso non può soddisfare contemporaneamente tutte vincoli eccprogrammatico NSLayoutConstraint problemi di animazione
Sto usando una classe chiamata PullableView la cui animazione utilizza il vecchio stile [UIView commitAnimation]
così l'ho sottoclassata e aggiunta nel mio codice per quello che credo sarebbe stato per i vincoli di animazione ... Non ho avuto tanta fortuna e ho cercato di animarlo o persino di farlo molto di qualsiasi cosa si sta rivelando difficile ho appena ottenuto "Incapace di soddisfare simultaneamente i vincoli" .. Il problema è che sono abbastanza nuovo a questo business dei vincoli quindi non saprei da dove cominciare.
ecco l'errore l'altro è praticamente lo stesso ma per centroY.
"<NSLayoutConstraint:0x7c8a3a0 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX>", "<NSLayoutConstraint:0x7c6b480 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX + 128>"
Io naturalmente fare [pullRightView setTranslatesAutoresizingMaskIntoConstraints:NO];
prima di chiamare questo
alcun aiuto apprezzato.
- (void)setOpenedForConstraints:(BOOL)op animated:(BOOL)anim
{
opened = op;
if (anim)
{
NSLayoutConstraint *constraintX = [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:_parentView
attribute:NSLayoutAttributeCenterX
multiplier:1
constant:0];
NSLayoutConstraint *constraintY = [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:_parentView
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0];
[_parentView addConstraint:constraintX];
[_parentView addConstraint:constraintY];
constraintX.constant = opened ? self.openedCenter.x : self.closedCenter.x;
constraintY.constant = opened ? self.openedCenter.y : self.closedCenter.y;
}
if (anim)
{
// For the duration of the animation, no further interaction with the view is permitted
dragRecognizer.enabled = NO;
tapRecognizer.enabled = NO;
//[UIView commitAnimations];
[UIView animateWithDuration:animationDuration
animations:^
{
[self layoutIfNeeded];
}];
}
else
{
if ([delegate respondsToSelector:@selector(pullableView:didChangeState:)])
{
[delegate pullableView:self didChangeState:opened];
}
}
}
Grazie per la risposta, ho approfondiranno attraverso queste ... tolgo anche tutti i vincoli prima di aggiungere quelle nuove ... Anche se lo faccio nella funzione init ... – Genhain
@Genhain penso che sia molto più facile cambiare i vincoli che aggiungere e rimuovere. E sii molto attento a quali vincoli hai definito per la vista in primo luogo. Ad esempio, se dovessi farlo scorrere a sinistra, lo avrei definito con top, bottom, left e width (ma non con il tasto destro!), Quindi posso eseguire l'animazione modificando la costante del vincolo di sinistra . Vedi la risposta rivista. Devo confessare che non ero in grado di decifrare quale fosse l'UX desiderata dal tuo esempio di codice, quindi se chiarisci cosa stai cercando di ottenere, potrei essere più utile. – Rob
Ottima risposta, ma il punto 2 nella tua prima lista è sbagliato. Solo layoutIfNeeded deve trovarsi all'interno del blocco di animazione. – jrturton