我知道外部更改为center
,bounds
并且在s inittransform
之后将被忽略。UIDynamicItem
但我需要在系统transform
中手动更改它。UIView
UIDynamicAnimator
每次更改时transform
,它都会立即覆盖。
那么有什么想法吗?谢谢。
我知道外部更改为center
,bounds
并且在s inittransform
之后将被忽略。UIDynamicItem
但我需要在系统transform
中手动更改它。UIView
UIDynamicAnimator
每次更改时transform
,它都会立即覆盖。
那么有什么想法吗?谢谢。
每当您更改其中一个动画属性时,您都需要调用[dynamicAnimator updateItemUsingCurrentState:item]
以让动态动画师知道您所做的。它将更新其内部表示以匹配当前状态。
编辑:我从您下面的代码中看到您正在尝试修改比例。UIDynamicAnimator
仅支持旋转和位置,不支持缩放(或任何其他类型的仿射变换)。不幸的是,它接管了transform
以实现轮换。我认为这是一个错误UIDynamicAnimator
(但后来我发现 UIKit Dynamics 的大部分实现都被归类为“错误”)。
您可以做的是修改您的界限(在调用之前updateItem...
)并重新绘制自己。如果您需要仿射变换的性能,您有几个选择:
CALayer
或子视图中并修改其比例(bounds
如果您需要碰撞行为仍然有效,请更新您的匹配)。<UIDyanamicItem>
在 上实现NSObject
),它将转换更改传递给您。然后,您可以将请求的转换与您自己的转换结合起来。您还可以使用 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%。
解决这个问题的另一种方法(我认为我们应该称之为错误)是覆盖使用的 UIView 的转换属性。像这样的东西:
override var transform: CGAffineTransform {
set (value) {
}
get {
return super.transform
}
}
var ownTransform: CGAffineTransform. {
didSet {
super.transform = ownTransform
}
}
这是一种 hack,但如果您不在 UIKitDynamics 中使用旋转,它可以正常工作。