7

我知道外部更改为center,bounds并且在s inittransform之后将被忽略。UIDynamicItem

但我需要在系统transform中手动更改它。UIViewUIDynamicAnimator

每次更改时transform,它都会立即覆盖。

那么有什么想法吗?谢谢。

4

3 回答 3

16

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


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

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

  • 将您的实际绘图逻辑移动到一个CALayer或子视图中并修改其比例(bounds如果您需要碰撞行为仍然有效,请更新您的匹配)。
  • 与其将您的视图附加到行为上,不如附加一个代理对象(仅<UIDyanamicItem>在 上实现NSObject),它将转换更改传递给您。然后,您可以将请求的转换与您自己的转换结合起来。
于 2013-12-17T13:15:00.513 回答
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%。

于 2013-12-20T20:08:10.130 回答
0

解决这个问题的另一种方法(我认为我们应该称之为错误)是覆盖使用的 UIView 的转换属性。像这样的东西:

override var transform: CGAffineTransform {
    set (value) {

    }
    get {
        return super.transform
    }
}

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

这是一种 hack,但如果您不在 UIKitDynamics 中使用旋转,它可以正常工作。

于 2019-11-03T20:03:44.803 回答