Więc próbuję animowanie pewne ograniczenia układu i mam nieszczęśliwy traf, ja po prostu nie widzę niczego, a następnie pojawia się komunikat o błędzie, jak to nie może jednocześnie spełniać wszystkie ograniczenia co itpZautomatyzowane NSLayoutConstraint problemy animacji
Używam klasy o nazwie PullableView, której animacja używa starego stylu [UIView commitAnimation]
, więc podklasowałem ją i dodałem w moim kodzie na to, co moim zdaniem byłoby za animowanie ograniczeń ... Bez takiego szczęścia i próby ożywienia go lub nawet zmusić go do zrobienia wiele czegokolwiek okazuje się być trudnym, po prostu dostaję "Nie można jednocześnie zaspokoić ograniczeń". Problem jest całkiem nowy w tym biznesie ograniczającym, więc nie wiedziałbym, od czego zacząć.
tutaj jest błąd, drugi jest prawie taki sam, ale dla centerY.
"<NSLayoutConstraint:0x7c8a3a0 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX>", "<NSLayoutConstraint:0x7c6b480 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX + 128>"
I oczywiście zrobić [pullRightView setTranslatesAutoresizingMaskIntoConstraints:NO];
przed wywołaniem tej
jakąkolwiek pomoc mile widziana.
- (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];
}
}
}
Dzięki za odpowiedź, będę zagłębiać przez nich ... Ja również usunąć wszystkie ograniczenia przed dodaniem nowych ... Chociaż to zrobić w funkcji init ... – Genhain
@Genhain myślę, że to znacznie łatwiej zmienić ograniczenia niż dodawanie i usuwanie. I bądź bardzo ostrożny, które ograniczenia zdefiniowałeś dla widoku w pierwszej kolejności. Na przykład, gdybym miał go przesunąć w lewo, zdefiniowałbym to z górną, dolną, lewą i szeroką (ale nie prawą!), A następnie mogę animować, zmieniając stałą lewego ograniczenia . Zobacz poprawioną odpowiedź. Muszę wyznać, że nie byłem w stanie odcyfrować, jaki jest twój pożądany UX z próbki kodu, więc jeśli wyjaśnisz, co próbujesz osiągnąć, mogę być bardziej pomocny. – Rob
Świetna odpowiedź, ale punkt 2 na pierwszej liście jest błędny. Tylko layoutIfNeeded musi znajdować się wewnątrz bloku animacji. – jrturton