我想使用UIKitDynamics UISnapBehaviour 来增加按钮的动画(外观+旋转位置更改),该按钮本身位于使用自动布局的视图中。
据我所知,在应用UIKitDynamics强制时,我需要暂时禁用按钮的自动布局约束。我正在考虑以下过程...
这是正确的方法吗?
哪些代表/布局应该用于那些相应的步骤+如何从实际基于自动布局的动画之前获取自动布局中的视图的目标中心 /过渡发生了吗?
答案 0 :(得分:2)
我可能建议采用一种近似UISnapBehavior
的不同方法,但避免尝试将UIKit Dynamics与自动布局结合,您可以依靠自动布局引擎来确定视图的最终位置。 (显然,如果您知道最终目的地,那么您只需暂停自动布局,捕捉,并且当快照完成后,您就会应用约束。)
对于视图捕捉到的弹跳效果,您可以将animateWithDuration
与usingSpringWithDamping
参数一起使用,例如:
// create the view
UIView *view = ...;
view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:view];
// add all of the constraints for the final position
NSDictionary *views = NSDictionaryOfVariableBindings(view);
[self.view addConstraints:...];
// animate the application of those constraints with low `withSpringWithDamping`
[UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:0.0 options:0 animations:^{
[view layoutIfNeeded];
} completion:nil];
如果你想要一些轮换,你可以使用animateKeyframesWithDuration
:
[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:0 animations:^{
[UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{
view.transform = CGAffineTransformMakeRotation(M_PI_4 / 2);
}];
[UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.25 animations:^{
view.transform = CGAffineTransformMakeRotation(-M_PI_4 / 4);
}];
[UIView addKeyframeWithRelativeStartTime:0.75 relativeDuration:0.125 animations:^{
view.transform = CGAffineTransformMakeRotation(M_PI_4 / 16);
}];
[UIView addKeyframeWithRelativeStartTime:0.875 relativeDuration:0.125 animations:^{
view.transform = CGAffineTransformMakeRotation(0);
}];
} completion:nil];
这不是UISnapBehavior
,而是非常接近它。您可以使用关键帧动画中的旋转时间和旋转量以及弹簧阻尼系数。但这说明了一种使用基于块的动画获得类似捕捉行为的方法。