如何将UIView移动到最终位置,但在接近它时使其变慢?

时间:2014-07-25 12:49:11

标签: objective-c uiview uiviewanimation

我正试图将一个方框从A =(0,0)移动到B =(0,1000),但我想在接近B点时减速。我试过 UIViewAnimationOptionCurveEaseOut 但它似乎在以恒定的速度移动。

UIView *box = [[UIView alloc] init];
box.frame = CGRectMake(0, 0, 500, 500);
box.backgroundColor = [UIColor redColor];
[self.view addSubview:box];

// Animation
[UIView animateWithDuration:0.3
                  delay:0.0
                options:UIViewAnimationOptionCurveEaseOut
             animations:^{

                 box.frame = CGRectMake(0, 1000, box.frame.size.width, box.frame.size.height);
             } completion:nil];

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

最简单的解决方案是以不同的速度在多个阶段进行动画,例如:像这样:

// Animation stage 1
[UIView animateWithDuration:0.1 //First half is fast
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{

                     box.frame = CGRectMake(0, 500, box.frame.size.width, box.frame.size.height);
                 } completion:^(BOOL finished) {

                     // Animation stage 2
                     [UIView animateWithDuration:0.2 //Second half slower
                                           delay:0.0
                                         options:UIViewAnimationOptionCurveEaseOut
                                      animations:^{

                                          box.frame = CGRectMake(0, 1000, box.frame.size.width, box.frame.size.height);
                                      } completion:nil];

                 }];

应该可以通过稍微玩一下来获得平滑的动画。

答案 1 :(得分:1)

如果这是iOS 7+,请使用弹簧动画。将此代码添加到viewDidAppear:以测试它,并查看使用弹簧与简单缓出曲线之间的区别。

另请注意,Apple非常鼓励使用弹簧动画,因为iOS 7+中几乎所有(或所有?)动画都是用弹簧完成的。

UIView *fooView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 50, 50)];
fooView.backgroundColor = [UIColor redColor];
[self.view addSubview:fooView];

[UIView animateWithDuration:1
                      delay:1
     usingSpringWithDamping:1
      initialSpringVelocity:1
                    options:0
                 animations:^{
                     fooView.frame = CGRectMake(50, 400, 50, 50);
                 }
                 completion:nil];

UIView *barView = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 50, 50)];
barView.backgroundColor = [UIColor redColor];
[self.view addSubview:barView];

[UIView animateWithDuration:1
                      delay:1
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     barView.frame = CGRectMake(200, 400, 50, 50);
                 }
                 completion:nil];

答案 2 :(得分:0)

如果您对内置缓动功能不满意,可以创建自己的缓动功能。您需要与CAMediaTimerFunction或CAKeyframeAnimation相关的内容。您可以阅读herehere。还有一些很好的答案here