UIDynamicItem 手动更新转换

Posted

技术标签:

【中文标题】UIDynamicItem 手动更新转换【英文标题】:UIDynamicItem update transform manually 【发布时间】:2013-12-17 10:16:09 【问题描述】:

我知道centerboundstransform 的外部更改将在UIDynamicItems 初始化后被忽略。

但我需要在UIDynamicAnimator系统中手动更改UIViewtransform

我每次换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 手动更新转换的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 UIDynamicItem 相互附加

Swift UIImage 不能用重力动画

如何让ClickOnce进行手动更新

Swift 2.0 - stringByAppendingPathComponent 错误转换 [重复]

将dae批量转换为scn

foreach 循环无法转换,但手动转换和 for 循环工作