具有现有仿射变换的UIKit Dynamics

时间:2013-10-12 19:59:03

标签: ios uikit cgaffinetransform

我的视图有一些比例变换。当我在它上面应用一些UIKit Dynamics时,它会将它们归零。 /: 如何让它在跳转时保持视图上的现有转换? :P

感谢。 :)

4 个答案:

答案 0 :(得分:15)

看看UIDynamicAnimator的updateItemUsingCurrentState

  

动态动画师会自动读取您添加到其中的每个动态项目的初始状态(位置和旋转),然后负责更新项目的状态。如果在将动态项目添加到动态动画师后主动更改动态项目的状态,请调用此方法以请求动画师阅读并合并新状态。

因此,只要您将正在转换的项目添加到动画制作工具后更改转换,就可以立即调用updateItemUsingCurrentState

id <UIDynamicItem> dynamicItem; // whatever your item is, probably a UIView
UIGravityBehavior *behavior = [[UIGravityBehavior alloc] initWithItems:@[dynamicItem]];
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; // or however you're getting your animator

[animator addBehavior:behavior];

view.transform = CGAffineTransformMakeScale(1.5, 1.5);
[animator updateItemUsingCurrentState:view];

答案 1 :(得分:3)

这是一个教程http://www.raywenderlich.com/50197/uikit-dynamics-tutorial。 作者说,在动态控制下,我们不能使用变换来缩放对象。 我希望这篇文章可以帮助你。

答案 2 :(得分:0)

受到https://www.toadworld.com/platforms/oracle/w/wiki/11698.apex-5-1-interactive-grid-compared答案的启发,我有一个解决方案:更新动画每一帧的变换

let attachment = UIAttachmentBehavior(item: item, attachedTo: item) // Workaround - attach the item to itself
attachment?.action = { () in
    item.transform = item.transform.scaledBy(x: 1.5, y: 1.5)
}

animator.addBehavior(attachment)

答案 3 :(得分:0)

我发现解决此问题的最简单方法是将UIKitDynamics行为应用于容器视图,并将缩放/变换应用于该容器内的子视图。

这样,您还可以在保持动态行为的同时为转换设置动画。