【问题标题】:UIKit Dynamics and CALayers decoupled from UIViewUIKit Dynamics 和 CALayers 与 UIView 解耦
【发布时间】:2015-04-07 20:07:57
【问题描述】:

在玩 UIKit Dynamics 时是否可以不使用 UIViews,而是在一个 UIView 中将物理属性、锚点、力等绑定到 CALayers?

根据 Ash Farrow 的此页:

UIDynamicItem 是一个协议,它定义了一个中心、一个边界和一个 变换(仅使用二维变换)。 UIView 符合 到这个协议,并且是 UIDynamicBehaviour 最常见的用法。 您还可以将 UICollectionViewLayoutAttributes 与 UIDynamicBehaviours,但我们今天不打算讨论。

这似乎表明任何东西都可以符合 UIDynamicItem 协议,但我找不到任何关于其他人在制作 CALayers 的信息。

是否可以比这种方法更直接:

https://www.invasivecode.com/weblog/uikit-dynamics-layer-constraint/

【问题讨论】:

  • 好问题!运气好吗?

标签: ios uiview uikit calayer microsoft-dynamics


【解决方案1】:

正如链接文章所指出的,CALayer 这些方法的类型有冲突,因此它不能直接符合UIDynamicItem。您需要某种适配器层,将CALayer 方法转换为UIDynamicItem 所需的类型和含义。

幸运的是,UIKit 正好提供了这样一个适配器层。它被称为UIView。只需将每一层放在一个视图中并嵌套视图即可。

长期以来,我一直认为观点是非常重量级的,尤其是来自 OS X 世界的观点。所以我一直在想“如果你想让它快一点,你最好用一个层来做”。但事实证明,视图实际上非常薄,在大多数情况下,与层相比并没有太多开销,尤其是对于您在 iOS 中谈论的数字。请参阅TearOff 演示,了解使用数十个视图执行 UIKItDynamics 的示例。

如果您确实需要图层,那么是的,您绝对仍然可以这样做。只需自己创建适配器。它只需要持有CALayer 并符合UIKitDynamics。它不需要做任何其他事情。像这样的东西应该可以工作:

public class DynamicLayerItem : NSObject, UIDynamicItem {
    let layer: CALayer
    init(layer: CALayer) { self.layer = layer}

    public var center: CGPoint { get {
        return layer.position
        }
        set {
            layer.position = center
        }
    }

    public var bounds: CGRect { return layer.bounds }
    public var transform: CGAffineTransform {
        get {
            return layer.affineTransform()
        }
        set {
            layer.transform = CATransform3DMakeAffineTransform(newValue)
        }
    }
}

您只需为该对象设置动画,这会导致图层等效地设置动画。

【讨论】:

  • 你花在 UIViews 上的这段话对我来说也是一种思想解放。最亲切。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
相关资源
最近更新 更多