我知道在center
初始化后,bounds
,transform
和UIDynamicItem
的外部更改将被忽略。
但我需要手动更改transform
系统中UIView
的{{1}}。
每次我更改UIDynamicAnimator
时,都会立即进行修改。
所以任何想法?谢谢。
答案 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中的旋转功能,则可以正常工作。