在玩UIKit Dynamics时是否可以不使用UIViews,而是将物理属性,锚点,力等等绑定到一个UIView中的CALayers?
根据Ash Farrow的这一页:
UIDynamicItem是一种定义中心,边界和a的协议 变换(仅使用二维变换)。 UIView符合 这个协议,是UIDynamicBehaviour最常用的。 您也可以使用UICollectionViewLayoutAttributes UIDynamicBehaviours,但我们今天不打算这样做。
这似乎表明任何事情都可以符合UIDynamicItem协议,但我找不到其他人在制作CALayers时所做的一切。
可以比这种方法更直接地完成:
https://www.invasivecode.com/weblog/uikit-dynamics-layer-constraint/
答案 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)
}
}
}
您只需为此对象设置动画,这会使图层等效地生成动画。