我在下面有这段代码,他将我的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(超级视图的中心(,当我启动我的应用程序时,我的 UIView 向左开始并转到中心,而不是中心并转到右侧,为什么会发生这种情况?
如何让我的 UIView 从中心开始 (x=91( 然后向右 (91+100(,而不是从左到中心?
[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");
}];
自动布局和帧动画不是好朋友。尝试对约束进行动画处理,而不是直接对帧进行动画处理。
可以创建约束的出口,并在代码中设置约束的 constant
属性以移动视图。
还可以调用 -[view layoutIfNeeded]
以在动画块中刷新约束。
否则,您可以消除所有视图约束并无所畏惧地为其框架添加动画效果。
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/情节提要中对视图的框架进行动画处理。
相反,您必须对附加到视图的约束进行动画处理。
您要做的是创建一个约束(或多个约束(并将其连接到IBOutlet。然后,在动画代码中,计算对约束的更改,并更改相应约束的常量。
例如,如果要移动视图的垂直位置,请设置一个约束来设置视图的垂直位置,并将其链接到名为 viewConstraint 的 IBOutlet。然后,您将使用如下代码:
[myView animateWithDuration: .25
animations: ^
{
viewConstraint.constant -= shiftAmount;
[self.view layoutIfNeeded];
}
];