Подтвердить что ты не робот

Анимация/перемещение просмотров при использовании Autolayout

Я хочу переместить представление из одного положения в другое, я могу реализовать его, используя

self.view.center = CGPointMake(100, 200);

однако, если проект использует Autolayout, после запуска будет возвращено в исходное положение:

[self.view.superview setNeedsLayout];

то как на самом деле переместить представление в новую позицию?

4b9b3361

Ответ 1

Вы должны изменить ограничения, если используете autoLayout. Предлагаемый способ заключается в том, чтобы сделать выход в вашем контроллере представления ограничения, затем вы изменяете константу ограничения. Если у вас есть время, я бы определенно рекомендовал здесь и посмотрел "Автоматический макет по примеру" или "Лучшие практики для мастеринга авто макета". Они очень помогли мне. Я предполагаю, что убрать это с помощью autoLayout, вы больше не думаете о кадрах. Таким образом, настройка центра просто не работает с автоматической компоновкой. Все это о том, как представления связаны друг с другом.

Ответ 2

С включенным AutoLayout мы должны FORGET FRAMES и только CONSIDER CONSTRAINTS. Да, для анимации вы больше не можете изменять рамку или центр, представление вернется в исходное положение, когда вызывается макет.

Вместо этого вы должны consider changing the constant value of the constraint получить тот же эффект.

Рассмотрим пользовательский интерфейс, например изображение, приведенное ниже. У меня есть представление изображения с 20 points leading space from it superview, что означает, что у него есть ограничение по горизонтали с ним. Также у меня есть еще три ограничения, связанные с этим представлением изображения, сверху, шириной и высота.

Я покажу вам, как мы можем анимировать изображение слева направо, как показано на изображении.

Создайте IBOutlet для ограничения, которое нам нужно для анимации. Здесь мы берем только ограничение по горизонтальному пространству, этого достаточно, чтобы переместить это представление слева направо.

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalSpaceConstraint;

enter image description here

Внутри действия Go Away нам нужно обновить постоянное значение этого ограничения.

- (IBAction)moveFrontAction:(id)sender {
    self.horizontalSpaceConstraint.constant = 220;

    [UIView animateWithDuration:0.5 animations:^{
         [self.imageView layoutIfNeeded];
    }];
}

Теперь представление должно быть перенесено в правый конец. Я просто делаю это внутри блока анимации, чтобы мы могли видеть приятную анимацию слева направо и наоборот. В Production нам не нужно жестко кодировать такие значения. Просто делайте это здесь, чтобы сделать концепцию понятной.

enter image description here

Внутри действия Come Back мы снова возвращаем константу обратно к исходному значению, чтобы вы могли видеть анимированное оранжевое изображение в исходное местоположение.

- (IBAction)moveBackAction:(id)sender {
    self.horizontalSpaceConstraint.constant = 20;

    [UIView animateWithDuration:0.5 animations:^{
        [self.imageView layoutIfNeeded];
    }];
}