UIKit Dynamics和CALayers与UIView脱钩

时间:2015-02-07 20:13:25

标签: ios uiview uikit calayer microsoft-dynamics

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

根据Ash Farrow的这一页:

  

UIDynamicItem是一种定义中心,边界和a的协议   变换(仅使用二维变换)。 UIView符合   这个协议,是UIDynamicBehaviour最常用的。   您也可以使用UICollectionViewLayoutAttributes   UIDynamicBehaviours,但我们今天不打算这样做。

这似乎表明任何事情都可以符合UIDynamicItem协议,但我找不到其他人在制作CALayers时所做的一切。

可以比这种方法更直接地完成:

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

1 个答案:

答案 0 :(得分:5)

如链接文章所述,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)
        }
    }
}

您只需为此对象设置动画,这会使图层等效地生成动画。