Переместить UIView с начальной точкой

У меня есть этот код ниже, который перемещает мой UIView влево:

- (void)viewDidLoad {
    [super viewDidLoad];

    [UIView beginAnimations:nil context:NULL];

        [UIView setAnimationDuration:4];

        int xOriginal = 91;

        CGRect rect = imagem.frame;

        int x = rect.origin.x;
        int y = rect.origin.y;
        int w = rect.size.width;
        int h = rect.size.height;

        if(x == xOriginal){

            imagem.frame = CGRectMake(x+100, y, w, h);
        }else{

            imagem.frame = CGRectMake(x-100, y, w, h);
        }

        [UIView commitAnimations];

}

Моя координата моего вида: x = 91 (центр superView). Когда я запускаю свое приложение, мой UIView запускается влево, а затем в центр, а не в центр и вправо. Почему это происходит?

Как сделать так, чтобы мой UIView начинался в центре (x=91) и шел направо (91+100), а не слева по центру?

4 ответа

Решение

Автопоставка и покадровая анимация не являются хорошими друзьями. Попробуйте анимировать ограничения вместо непосредственно кадра.

Вы можете создать выходы ваших ограничений, и установить constant свойство ограничения в вашем коде для перемещения ваших представлений.
Вы также звоните -[view layoutIfNeeded] чтобы обновить ваши ограничения в анимационном блоке.

В противном случае вы можете удалить все ваши ограничения просмотра и безбоязненно анимировать его кадр.

[UIImageView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{
                imagem.frame=CGRectMake(imagem.frame.origin.x+100, imagem.frame.origin.y, imagem.frame.size.width, imagem.frame.size.height);

   } completion:^(BOOL finished) {
                //code for completion
                NSLog(@"Animation complete");
            }];
Initially image.frame = CGRectMake(91,100,20,20);
So imageview starting point is 0

[UIView animateWithDuration:5.0
  animations:^{
    //Animation code goes here
   image.frame = CGRectMake(191,100,20,20); //Now imageview moves from 0 to 100
  } completion:^(BOOL finished) {
    //Code to run once the animation is completed goes here
}];

Как говорит другой автор, вы не можете анимировать кадр представления в XIB / раскадровках, которые используют AutoLayout.

Вместо этого вы должны анимировать ограничение, которое прикреплено к представлению.

Что вы делаете, это создаете ограничение (или несколько ограничений) и подключаете его к IBOutlet. Затем в коде анимации вы вычисляете изменения в ограничении (ях) и изменяете константу для соответствующих ограничений.

Например, если вы хотите сместить вертикальное положение представления, установите ограничение, которое устанавливает вертикальное положение вашего представления, и свяжите его с IBOutlet с именем viewConstraint. Тогда вы будете использовать такой код:

[myView animateWithDuration: .25
  animations: ^
  {
    viewConstraint.constant -= shiftAmount;
    [self.view layoutIfNeeded];
  }
];
Другие вопросы по тегам