摇一个UIView …但使用UIKitdynamic

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

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

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

所以你必须..

  • 采取的观点,说在0,0

  • 添加一个spring的概念

  • 给它一个微调,说到“左”

  • 它应该在spring前后摆动,最终再次回到0,0

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

请注意,正如尼尔斯在下面巧妙地解释的那样,在这些情况下,spring并不一定是你想要的“物理感觉”:在其他情况下,它可能是完美的。 据我所知,iOS自己的应用程序中的所有物理(如消息等)现在使用UIKitdynamic,所以对我来说,值得处理“UIView弹簧弹跳”。


只是要清楚,当然你可以做一些“类似”,只是一个animation。 例…

但是现在,这与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]; } 

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

  • 首先,定义一个pipe理animation师:

     @property (nonatomic, strong) UIDynamicAnimator *animator; 

    并实例化它:

     self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 
  • 其次,向该animation师添加附件行为以查看当前位置。 这将推动完成后,它会回弹。 你必须玩弄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]; 

就我个人而言,我对这个特定的animation并不感冒(这个阻尼曲线对我来说并不完全正确)。 我会倾向于使用基于块的animation来移动它一个方向(使用UIViewAnimationOptionCurveEaseOut ),完成后启动另一个向相反的方向移动它(使用UIViewAnimationOptionCurveEaseInOut ),然后完成后,使用usingSpringWithDamping呈现移动它回到原来的位置。 恕我直言,这产生一个曲线,感觉更像是“动摇如果错误”的经验。