使用UIKitDynamics为Auto Layout支持的视图设置动画

Ber*_*rnd 6 objective-c ios autolayout uikit-dynamics swift

我想使用UIKitDynamics UISnapBehaviour来增加按钮的动画(外观+旋转位置变化),该按钮本身位于使用自动布局的视图中.

我知道在应用UIKitDynamics力时我需要暂时禁用按钮的自动布局约束.我在考虑以下过程......

  1. 基于自动布局的转换发生之前(但在触发之后)获取按钮的目标中心/边界.保存这个价值.
  2. 暂时禁用按钮的所有自动布局/约束
  3. 申请UISnapBehaviour.使用保存的目标中心或自动布局的边界值(从步骤1开始)输入.
  4. 完成UIKitDynamics动画后,重新启用约束以准备进一步的布局更改

这是正确的方法吗?

哪些委托/布局应该用于那些相应的步骤+如何在实际基于自动布局的动画/转换发生之前从自动布局获取视图的目标中心

Rob*_*Rob 4

我可能会建议采用一种不同的方法来近似UISnapBehavior,但避免尝试将 UIKit Dynamics 与自动布局结合起来,在自动布局中您依赖自动布局引擎来确定视图的最终位置。(显然,如果您知道最终目的地,那么您只需暂停自动布局、捕捉,然后在捕捉完成后应用约束。)

对于视图捕捉到位时的弹跳效果,您可以使用animateWithDurationwithusingSpringWithDamping参数,例如:

// 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];
Run Code Online (Sandbox Code Playgroud)

如果您还希望在卡入到位时进行一些旋转,您可以使用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];
Run Code Online (Sandbox Code Playgroud)

这并不完全是UISnapBehavior,但非常接近。您还可以调整关键帧动画中的旋转时间和旋转量以及弹簧阻尼系数。但这说明了一种使用基于块的动画获得类似快照的行为的方法。