4

在很多情况下,您需要“摇动”一个 UIView。

(例如,“将孩子的注意力吸引到控件上”、“连接速度慢”、“用户输入错误”等等。)

使用 UIKit Dynamics 可以做到这一点吗?

所以你必须..

  • 取景,例如在 0,0

  • 添加弹簧概念

  • 轻推一下,说“向左”

  • 它应该在弹簧上前后摆动,最终再次稳定到 0,0

这可能吗?我在 Apple 演示中找不到示例。干杯

请注意,正如 Niels 在下面敏锐地解释的那样,对于某些情况,弹簧不一定是您想要的“物理感觉”:在其他情况下,它可能是完美的。据我所知, iOS 自己的应用程序(例如消息等)中的所有物理特性现在都使用 UIKit 动态,所以对我来说,处理“UIView 在弹簧上弹跳”是值得的。


为了清楚起见,你当然可以做一些“类似”的事情,只需要一个动画。例子...

但这根本没有与 iOS 其他部分相同的“物理感觉”,现在。

-(void)userInputErrorShake
    {
    [CATransaction begin];

    CAKeyframeAnimation * anim =
      [CAKeyframeAnimation animationWithKeyPath:@"transform"];

    anim.values = @[
      [NSValue valueWithCATransform3D:
          CATransform3DMakeTranslation(-4.0f, 0.0f, 0.0f) ],
      [NSValue valueWithCATransform3D:
          CATransform3DMakeTranslation(4.0f, 0.0f, 0.0f) ]
        ];

    anim.autoreverses = YES;
    anim.repeatCount = 1.0f;
    anim.duration = 0.1f;
    [CATransaction setCompletionBlock:^{}];
    [self.layer addAnimation:anim forKey:nil];
    [CATransaction commit];
    }
4

1 回答 1

8

如果你想使用 UIKit Dynamics,你可以:

  • 首先,定义一个管理动画师:

    @property (nonatomic, strong) UIDynamicAnimator *animator;
    

    并实例化它:

    self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
    
  • 其次,将附件行为添加到该动画师以在当前位置查看。这将使它在推动完成时弹回。你必须玩弄dampingfrequency价值观。

    UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:viewToShake attachedToAnchor:viewToShake.center];
    attachment.damping = 0.5;
    attachment.frequency = 5.0;
    [self.animator addBehavior:attachment];
    

    这些值并不完全正确,但也许它是您实验的起点。

  • 应用推送行为 ( UIPushBehaviorModeInstantaneous) 来扰乱它。然后,依附行为将导致其弹回。

    UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[viewToShake] mode:UIPushBehaviorModeInstantaneous];
    push.pushDirection = CGVectorMake(100, 0);
    [self.animator addBehavior:push];
    

就个人而言,我对这个特殊的动画并不着迷(阻尼曲线对我来说感觉不太合适)。我倾向于使用基于块的动画将其向一个方向移动(使用UIViewAnimationOptionCurveEaseOut),完成后启动另一个将其向相反方向移动(使用UIViewAnimationOptionCurveEaseInOut),然后在完成后,使用 的usingSpringWithDamping再现animateWithDuration将其移回其原点。恕我直言,这会产生一条感觉更像是“如果错了就摇晃”体验的曲线。

于 2014-06-23T14:15:52.373 回答