【问题标题】:Shake a UIView ... BUT using UIKit Dynamics摇一个 UIView ...但使用 UIKit Dynamics
【发布时间】:2014-06-22 21:46:54
【问题描述】:

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

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

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

所以你必须..

  • 取景,比如 0,0

  • 添加弹簧概念

  • 轻推一下,说“向左”

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

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

请注意,正如 Niels 在下文中敏锐地解释的那样,在某些情况下,弹簧不一定是您想要的“物理感觉”:在其他情况下,它可能是完美的。据我所知,iOS 自己的应用程序(例如消息等)中的所有物理现在都使用 UIKit Dynamics,所以对我来说,处理“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];
    }

【问题讨论】:

  • animateWithDuration:delay:usingSpringWithDamping 不是 UIKit 动态。
  • 您的尝试有什么问题?我觉得不错。
  • 用我自己的一个观点尝试一下,我觉得它看起来不错,但也许这是一个品味问题。如果您认为它需要初始动画,为什么不只是初始动画呢?为什么说“不雅”?还是另一种口味?

标签: ios ios7 game-physics user-experience uikit-dynamics


【解决方案1】:

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

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

    @property (nonatomic, strong) UIDynamicAnimator *animator;
    

    并实例化它:

    self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
    
  • 其次,将附件行为添加到该动画师以在当前位置查看。这将使它在推动完成时弹回。您将不得不使用 damping 和 frequency 值。

    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),然后在完成后使用@987654330 @ 复制 animateWithDuration 将其移回原来的位置。恕我直言,这会产生一条感觉更像是“如果错了就摇晃”体验的曲线。

【讨论】:

  • 太棒了,谢谢@Rob。当你说“首先添加附件行为”时......你能给我一个提示吗,呃,我应该使用哪种方法来做到这一点:)?
  • 我想使用物理学会产生一种有弹性的感觉,而我总是将“密码错误”的动作等同于某人的摇头……这是一种更持久、更深思熟虑的动作。
  • @nielsbot 我同意。如果需要,可以来回移动它并在完成后将其弹回。
  • self.animator 是谁? - 没关系。找到了。对于其他人,您需要声明 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
  • @NikhilMathew - 很抱歉; OP 在询问 UIKit Dynamics,所以我认为他对此很熟悉,但为了让不太熟悉该技术的人受益,我已将您的观察纳入我的回答中。
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多