2015-02-07 13 views
5

UIKit 다이나믹으로 플레이 할 때 UIView를 사용하지 않고 대신 물리 속성, 앵커, 힘 등을 하나의 UIView 내에 모두 CALayers에 바인딩 할 수 있습니까? 애쉬 패로우이 페이지에 따르면 UIKit 다이나믹과 CALayers가 UIView에서 분리됨

:

UIDynamicItem는 센터, 경계를 정의하는 프로토콜이며, 변환 (두 차원 변환이 사용된다). UIView는이 프로토콜에 을 따르며 UIDynamicBehaviour의 가장 일반적인 용도입니다. UICollectionViewLayoutAttributes를 UIDynamicBehaviours와 함께 사용할 수도 있지만, 지금은 다루지 않을 것입니다.

이것은 프로토콜 UIDynamicItem을 준수하도록 만들 수있는 것으로 보이는 것 같지만 CALayers를 만드는 데있어 다른 사람들을 찾을 수는 없습니다. CALayer 이러한 방법에 대한 충돌 유형이 링크 된 문서 노트로

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

+0

큰 질문입니다! 행운? –

답변

3

, 그래서 직접 UIDynamicItem을 준수 할 수 없습니다

은이 방법보다 더 직접 수행 할 수 있습니다. 필요한 것은 CALayer 메소드를 UIDynamicItem이 필요로하는 유형과 의미로 변환하는 일종의 어댑터 레이어 일 것입니다.

다행히도 UIKit은 이러한 어댑터 계층을 정확하게 제공합니다. UIView이라고합니다. 각 레이어를 뷰에 배치하고 뷰를 중첩하면됩니다.

저는 오랫동안 OS X 세계에서 온 매우 중량감있는 전망을 오래 생각했습니다. 그래서 저는 항상 "당신이 이것을 빨리하기를 원한다면, 당신은 레이어로 더 잘 할 것"이라고 생각했습니다. 그러나보기가 실제로는 매우 얇아서 대부분의 경우에 오버 헤드와 레이어가 많지 않습니다. 특히 iOS에서 말하는 숫자의 경우 더욱 그렇습니다. 많은 수십 개의보기가 문제없이 UIKItDynamics를 수행하는 예제는 TearOff 데모를 참조하십시오.

정말로 레이어가 필요한 경우 그렇습니다. 확실히 계속 할 수 있습니다. 어댑터를 직접 만드십시오. 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) 
     } 
    } 
} 

이 개체를 움직이면 레이어가 동등하게 애니메이션됩니다.

+0

당신이 UIViews에 소비하는이 단락은 저를위한 생각의 자유입니다. 대부분 친절 하네. 고맙습니다!!! – Confused