UIDynamicItem手动更新转换

时间:2013-12-17 10:16:09

标签: ios objective-c uikit-dynamics uidynamicbehavior

我知道在center初始化后,boundstransformUIDynamicItem的外部更改将被忽略。

但我需要手动更改transform系统中UIView的{​​{1}}。

每次我更改UIDynamicAnimator时,都会立即进行修改。

所以任何想法?谢谢。

3 个答案:

答案 0 :(得分:15)

每次更改其中一个动画属性时,都需要调用[dynamicAnimator updateItemUsingCurrentState:item]让动态动画师知道你做了它。它会更新它的内部表示以匹配当前状态。


编辑:我从下面的代码中看到,您正在尝试修改比例。 UIDynamicAnimator仅支持旋转和位置,而不支持缩放(或任何其他类型的仿射变换)。遗憾的是,为了实现正常轮换,它会接管transform。我认为这是UIDynamicAnimator中的一个错误(但后来我发现很多UIKit Dynamics的实现被归类为“错误”)。

你可以做的是修改你的界限(在调用updateItem...之前)并自己重绘。如果您需要仿射变换的性能,您有几个选择:

  • 将您的实际绘图逻辑移动到CALayer或子视图中并修改其比例(如果您需要碰撞行为仍然有效,请更新您的bounds以匹配。)
  • 不是将视图附加到行为,而是附加一个代理对象(只需在<UIDyanamicItem>上实现NSObject),然后将转换更改传递给您。然后,您可以将请求的转换与您自己的转换组合在一起。

答案 1 :(得分:10)

您还可以使用UIDynamicBehavior的.action属性在动画的每个刻度处设置所需的变换。

UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center];
attachment.damping = 0.8f;
attachment.frequency = 0.8f;
attachment.action = ^{
    CGAffineTransform currentTransform = item.transform;
    item.transform = CGAffineTransformScale(currentTransform, 1.2, 1.2)
};

您需要在操作块中添加逻辑以确定何时应更改比例,以及确定更改时间,否则您的视图将始终为120%。

答案 2 :(得分:0)

解决此问题的另一种方法(我认为应该把它称为bug)是重写所用UIView的transform属性。像这样:

override var transform: CGAffineTransform {
    set (value) {

    }
    get {
        return super.transform
    }
}

var ownTransform: CGAffineTransform. {
    didSet {
        super.transform = ownTransform
    }
}

这是一种技巧,但如果您不使用UIKitDynamics中的旋转功能,则可以正常工作。