Переместить 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];
}
];