UIDynamicItem 手动更新转换
Posted
技术标签:
【中文标题】UIDynamicItem 手动更新转换【英文标题】:UIDynamicItem update transform manually 【发布时间】:2013-12-17 10:16:09 【问题描述】:我知道center
、bounds
和transform
的外部更改将在UIDynamicItem
s 初始化后被忽略。
但我需要在UIDynamicAnimator
系统中手动更改UIView
的transform
。
我每次换transform
,都会马上覆盖。
所以有什么想法吗?谢谢。
【问题讨论】:
【参考方案1】:任何时候您更改动画属性之一,您都需要调用[dynamicAnimator updateItemUsingCurrentState:item]
让动态动画师知道您所做的。它将更新其内部表示以匹配当前状态。
编辑:我从您下面的代码中看到您正在尝试修改比例。 UIDynamicAnimator
仅支持旋转和位置,不支持缩放(或任何其他类型的仿射变换)。不幸的是,它接管了transform
,以实现仅旋转。我认为这是UIDynamicAnimator
中的一个错误(但后来我发现 UIKit Dynamics 的大部分实现都被归类为“错误”)。
您可以做的是修改边界(在调用updateItem...
之前)并重新绘制自己。如果您需要仿射变换的性能,您有几个选择:
CALayer
或子视图中并修改其比例(更新您的 bounds
以匹配,如果您需要碰撞行为仍然有效)。
不要将视图附加到行为,而是附加一个代理对象(只需在NSObject
上实现<UIDyanamicItem>
),它会将转换更改传递给您。然后,您可以将请求的转换与您自己的转换相结合。
【讨论】:
我在myView.transform = CGAffineTransformScale(originTransform, 1.2, 1.2);
之后做了updateItemUsingCurrentState:
,然后比例显示立即返回。:(
谢谢哥们,很有帮助。【参考方案2】:
您还可以使用 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%。
【讨论】:
【参考方案3】:解决这个问题的另一种方法(我认为我们应该称之为错误)是覆盖所使用的 UIView 的转换属性。像这样的:
override var transform: CGAffineTransform
set (value)
get
return super.transform
var ownTransform: CGAffineTransform.
didSet
super.transform = ownTransform
这是一种 hack,但如果您不在 UIKitDynamics 中使用旋转,它可以正常工作。
【讨论】:
以上是关于UIDynamicItem 手动更新转换的主要内容,如果未能解决你的问题,请参考以下文章