Так я пытаюсь оживить некоторые ограничения макета, и я с жалким везением, я просто не вижу ничего, и тогда я получаю сообщение об ошибке, говорящее, как он не может одновременно удовлетворить все Сдерживает и т.д.Programatic NSLayoutConstraint вопросы анимации
Я использую класс под названием PullableView, чья анимация использует старый стиль [UIView commitAnimation]
, поэтому я подклассифицировал его и добавил в свой код для того, что, по моему мнению, будет для анимации ограничений ... Нет такой удачи и попытки оживить его или даже заставить его делать многое что-то сложно, я просто получаю «Невозможно одновременно удовлетворить ограничения». Проблема в том, что я довольно новичок в этом бизнесе с ограничениями, поэтому я не знаю, с чего начать.
вот ошибка, другая - почти такая же, но для centerY.
"<NSLayoutConstraint:0x7c8a3a0 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX>", "<NSLayoutConstraint:0x7c6b480 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX + 128>"
Я, конечно, сделать [pullRightView setTranslatesAutoresizingMaskIntoConstraints:NO];
перед вызовом этого
помощь оценили.
- (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];
}
}
}
Спасибо за ответ, я буду копаться через них ... Я также удалить все ограничения, прежде чем добавлять новые ... Хотя я это сделать в функции инициализации ... – Genhain
@Genhain Я думаю, что это гораздо легче изменить ограничения, чем добавлять и удалять. И будьте очень осторожны, какие ограничения вы определили для представления в первую очередь. Например, если бы я собирался сдвинуть его влево, я бы определил его сверху, снизу, слева и ширине (но не правильно!), А затем я смогу анимировать, изменив константу левого ограничения , См. Пересмотренный ответ. Должен признаться, что я не смог расшифровать то, что ваш желаемый UX был из вашего образца кода, поэтому, если вы уточните, что вы пытаетесь выполнить, я мог бы быть более полезным. – Rob
Отличный ответ, но точка 2 в вашем первом списке неверна. В блоке анимации должен находиться только layoutIfNeeded. – jrturton