2015-02-07 15 views
5

È possibile non utilizzare UIViews quando si gioca con UIKit Dynamics, e invece legare le proprietà fisiche, le ancore, le forze ecc. A CALayers all'interno di un unico UIView?UIKit Dynamics e CALayers disaccoppiati da UIView

Secondo questa pagina Ash Farrow:

UIDynamicItem è un protocollo che definisce un centro, un limite e una trasformazione (solo trasformate bidimensionali vengono utilizzati). UIView è conforme a a questo protocollo ed è l'uso più comune di UIDynamicBehaviour. Puoi anche utilizzare UICollectionViewLayoutAttributes con UIDynamicBehaviours, ma non lo copriremo oggi.

Che sembra indicare che qualsiasi cosa può essere fatta per conformarsi al protocollo UIDynamicItem, ma non riesco a trovare nulla sugli altri che si divertono a fare CALayers.

può essere fatto in modo più diretto di questo approccio:

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

+0

Ottima domanda! Qualche fortuna? –

risposta

3

Come osserva articolo collegato, CALayer ha tipi contrastanti di questi metodi, quindi non può direttamente conformarsi alle UIDynamicItem. Quello di cui avresti bisogno sarebbe una sorta di adattatore che convertisse i metodi CALayer nei tipi e nei significati richiesti da UIDynamicItem.

Fortunatamente, UIKit offre esattamente questo tipo di adattatore. Si chiama UIView. Basta mettere ciascun livello in una vista e nidificare le viste.

Da molto tempo pensavo a visualizzazioni come molto pesanti, in particolare provenienti dal mondo OS X. Così ho sempre pensato "se vuoi che questo sia veloce, faresti meglio a farlo con uno strato". Ma risulta che le viste sono in realtà piuttosto sottili e nella maggior parte dei casi non c'è molto overhead rispetto a un layer, in particolare per i numeri di cui si parla in iOS. Guarda la demo TearOff per un esempio che fa UIKItDynamics con molte dozzine di viste senza problemi.

Se davvero hai bisogno di livelli, allora sì, puoi sicuramente farlo ancora. Crea tu stesso l'adattatore. Ha solo bisogno di tenere un CALayer e conforme allo UIKitDynamics. Non deve fare nient'altro. Qualcosa del genere dovrebbe funzionare:

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) 
     } 
    } 
} 

Faresti solo animare questo oggetto, e che fa sì che lo strato di animare in modo equivalente.

+0

Questo paragrafo che spendi su UIViews è una liberazione di pensiero anche per me. Molto gentile. Grazie!!! – Confused