用起点移动UIView

时间:2014-12-19 10:51:21

标签: ios objective-c uiview commitanimations beginanimations

我有以下代码将我的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)开始,而不是从左到中?

4 个答案:

答案 0 :(得分:2)

[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");
            }];

答案 1 :(得分:1)

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
}];

答案 2 :(得分:1)

Autolayout和框架动画不是好朋友。尝试动画约束而不是直接框架。

您可以创建约束的出口,并在代码中设置约束的constant属性以移动您的视图。
您还可以在动画块中调用-[view layoutIfNeeded]来刷新约束。

否则,您可以删除所有视图约束并无畏地为其框架设置动画。

答案 3 :(得分:1)

正如另一张海报所说,您无法在使用AutoLayout的XIB /故事板中为视图框架制作动画。

相反,您必须为附加到视图的约束设置动画。

您要做的是创建约束(或多个约束)并将其连接到IBOutlet。然后,在动画代码中,计算约束的更改并更改适当约束的常量。

例如,如果要移动视图的垂直位置,请设置一个约束来设置视图的垂直位置,并将其链接到名为viewConstraint的IBOutlet。然后你就可以使用这样的代码了:

[myView animateWithDuration: .25
  animations: ^
  {
    viewConstraint.constant -= shiftAmount;
    [self.view layoutIfNeeded];
  }
];