使用UIKit Dynamics为Anola Autolayout支持视图

时间:2014-10-09 06:21:48

标签: ios objective-c swift autolayout uikit-dynamics

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

据我所知,在应用UIKitDynamics强制时,我需要暂时禁用按钮的自动布局约束。我正在考虑以下过程...

  1. 在基于自动布局的转换之前获取按钮的目标中心/边界(但在触发后)。保存这个价值。
  2. 暂时停用按钮的所有自动布局/约束
  3. 申请UISnapBehaviour。使用保存的目标中心或自动布局的边界值(从步骤1开始)提供它。
  4. 当UIKitDynamics动画完成时重新启用约束以准备进一步的布局更改
  5. 这是正确的方法吗?

    哪些代表/布局应该用于那些相应的步骤+如何从实际基于自动布局的动画之前获取自动布局中的视图的目标中心 /过渡发生了吗?

1 个答案:

答案 0 :(得分:2)

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

对于视图捕捉到的弹跳效果,您可以将animateWithDurationusingSpringWithDamping参数一起使用,例如:

// 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,而是非常接近它。您可以使用关键帧动画中的旋转时间和旋转量以及弹簧阻尼系数。但这说明了一种使用基于块的动画获得类似捕捉行为的方法。