摇一个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师添加附件行为以查看当前位置。 这将推动完成后,它会回弹。 你必须玩弄
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];
就我个人而言,我对这个特定的animation并不感冒(这个阻尼曲线对我来说并不完全正确)。 我会倾向于使用基于块的animation来移动它一个方向(使用UIViewAnimationOptionCurveEaseOut
),完成后启动另一个向相反的方向移动它(使用UIViewAnimationOptionCurveEaseInOut
),然后完成后,使用usingSpringWithDamping
呈现移动它回到原来的位置。 恕我直言,这产生一个曲线,感觉更像是“动摇如果错误”的经验。