2017-10-04 5 views
0

CAShapeLayer (그리기, 애니 메이팅, 사용자 상호 작용) 대 : 어떻게 당신은 내가 약 textfields, switches 등을 이야기하고 있지 않다 (모양을 그릴 할 때 UIViewCAShapeLayer를 사용하여 선택할 수행을 컨트롤, 그냥 그림)?사용 UIView의 나는 아주 기본적인 질문이

(UIKit의 일부로) UIView은 내용을 그릴 때 보통 CALayer을 사용합니다. 이것이 맞다면 CAShapeLayer (또는 일반적으로 CALayer)은 엑스트라가없는 경우와 완전히 똑같습니다. UIKit이 제공합니다.

그런 다음 UIView을 사용하는 것이 의미가 있으며 언제 CAShapeLayer을 사용하는 것이 의미가 있습니까?

CAShapeLayer이 더 빠릅니까? UIKit은 일반적으로 제스처 인식이나 사용자 상호 작용에 더 최적화되어 있습니까?


가 당신에게 더 많은 컨텍스트를 제공하기 위해, 여기에 내가이 문제가 왔을 때 일을하려고 한 내용은 다음과 같습니다

Illustration

내가이 빨간색 원은 센터 서클 주위를 회전합니다. 그러나 사용자는 회전하는 동안 빨간색 원을 탭할 수 있어야합니다.

  1. 가하는 UIView 만들기의 레이어의 CornerRadius를 조작하고 CGAffineTransform를 사용하여 회전 : 여기

    , 나는 그 빨간색 원 중 하나를 추가 (더있을 수 있습니다) 두 가지 옵션을 참조하십시오.

  2. 으로 CAShapeLayer을 만듭니다. 나는 그것을 회전시킬 수 있었다 CATransform3D

내가 여기있는 유일한 문제는 user interaction이다. 끊임없이 움직이기 때문에 (회전) 올바른 프레임에 액세스해야합니다. 나는 presentation layer을 사용하여이를 수행 할 수있다. (나는 UIView도 사용하고있다).

UIView 또는 CAShapeLayer을 사용할 지 잘 모르겠습니다. 또한,이 방법으로 애니메이션을 적용하는 것이이 경우 정확한 방법인지는 잘 모르겠습니다. 사용할 옵션에 대한 질문을 지울 수있는 더 나은 옵션이있을 수 있습니다.

감사합니다. 애플의 문서에서 인용

답변

1

레이어 앱의 전망 - 즉, 당신이 레이어 객체만을 기준으로 시각적 인터페이스를 만들 수 없습니다를 대체하지 않습니다. 레이어 은보기에 대한 인프라를 제공합니다. 특히, 레이어는 보기의 내용을 그려서 애니메이트하고 더 높은 효율을 유지하면서 더 높은 프레임 속도를 유지하면서 더 쉽고 효율적으로 만듭니다. 그러나 레이어가 수행하지 않는 많은 것들이 있습니다 ( ). 레이어는 이벤트를 처리하지 않으며 콘텐츠를 그리거나 응답 체인에 참여하거나 다른 많은 작업을 수행합니다. 이러한 이유로 모든 앱에는 이러한 종류의 상호 작용을 처리하기 위해 하나 이상의보기가 있어야합니다.

iOS에서 모든보기는 해당 레이어 객체로 백업되지만 OS X에서는 어떤보기에 레이어가 있어야하는지 결정해야합니다. OS X v10.8 및 에서는 모든보기에 레이어를 추가하는 것이 좋습니다. 그러나 이렇게 할 필요는 없으며 오버 헤드가 부당하고 불필요한 경우 경우에도 레이어를 비활성화 할 수 있습니다. 레이어는 으로 앱의 메모리 오버 헤드를 다소 늘리지 만, 이점이 종종 불리한 점보다 의 편익보다 큽니다. 따라서 레이어 지원을 사용 중지하기 전에 앱 성능을 항상 테스트 해 보는 것이 가장 좋습니다.

보기에 대해 계층 지원을 사용하면 을 계층 지원보기로 만듭니다. 레이어 기반보기에서 시스템은 으로 기본 레이어 개체를 만들고 해당 레이어를보기와 동기화하여 유지합니다. 모든 iOS보기는 레이어로 백업되며 OS X의 대부분보기도 마찬가지입니다. 그러나 OS X에서는 객체를 직접 제공하는보기 인 레이어 호스팅보기를 으로 만들 수도 있습니다. 레이어 호스팅 뷰의 경우 AppKit은 레이어 관리와 함께 접근 방식을 사용하고 뷰 변경에 대한 응답으로 레이어를 수정하지 않습니다.

읽기 : 일부 QNA

질문에 대한 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics/CoreAnimationBasics.html#//apple_ref/doc/uid/TP40004514-CH2-SW3

이제 시간 1 :

나의 이해는 (UIKit의 일부로서) UIView의 정상적인 사용한다는 것입니다 후드 아래에서 CALayer가 콘텐츠를 그립니다. 이 정확하다면, 다음 CAShapeLayer (또는 일반의 CALayer)는 는 당신에게

을 제공 UIKit 엑스트라가 다시 애플 문서를

레이어 백업 뷰를 인용하지 않고 만들 똑같은 일이 될 것입니다 기본적으로 CALayer 클래스의 인스턴스 인 이며 대부분의 경우 다른 유형의 레이어 객체가 필요하지 않을 수 있습니다. 그러나 Core Animation은 다양한 레이어 클래스를 제공하며 각각 은 유용 할 수있는 특수 기능을 제공합니다. 다른 레이어 클래스를 선택하는 것은 성능을 개선 할 수 있도록하거나 CALayer에 비해 CAShapeLayer는 성능면에서 유리하다 사용하여 다양한 모양을 그릴 때

분명히 간단한 방법으로 특정 유형의 콘텐츠를 지원할 수 있습니다 .

질문 2

빠른 CAShapeLayer 있습니까? UIKit은 제스처에 대해 더 많이 최적화되어 있습니까? 인식이나 사용자 상호 작용이 일반적입니까?

분명히 레이어는 이벤트를 처리하거나 콘텐츠를 그리거나 응답 체인에 참여하거나 다른 많은 작업을 수행하지 않습니다. 따라서 층의 아무도는 사용자 상호 작용을 상관없이 인식 할 수 있는지 여부는있는 CALayer 또는 CAShapeLayer

이 시점에서 3

질문, 내가 UIViews 사용 여부를 확실하지 않다 또는 CAShapeLayers

질문에 지정했듯이 빨간 원의 사용자 상호 작용을 원하고 CAShapeLayer/CALayer가 사용자 상호 작용에 응답하지 않는다는 사실을 알고 있기 때문에 레이어가 아닌 UIView를 사용해야합니다.

+0

예, 읽었습니다. "(...) 이러한 이유 때문에 모든 앱에는 이러한 종류의 상호 작용 (...)을 처리 할 수있는 뷰가 하나 이상 있어야합니다." 만약 그들이 의미한다면, 레이어는 일반적으로 UIView에 임베디드되어야합니다. 그것은 내 케이스에서 (캐싱 UIView가 상호 작용을 처리 할 수 ​​있기 때문에)'CAShapeLayers'가 가장 좋을 것입니다. 그것들이 의미하는 것이라면, 모든 레이어는 자체 뷰를 필요로합니다 (= 레이어에 의해 지원되는'UIView '를 사용합니다), 나는'UIView'를 사용해야합니다. 나는 이것에 대해 잘 모르겠습니다. 내 말은,이 모든 것을 수행하는'UIView '가 있고,'subviews' 또는'sublayers'를 사용해야하는지 모르겠습니다. – Quantm

+0

@quantm : iOS의 모든 단일보기가 계층으로 백업됩니다. 기본적으로 뷰는 CALayer와 함께 제공되며 추가하는 레이어가 하위 레이어가 될 때 기존 CALayer를 바꿀 수 없으므로 CAShapeLayer를 사용하여 뷰 레이어에 하위 레이어로 추가 할 수 있습니다. 사용자가 서클과 상호 작용하기를 원하기 때문에보기없이 단순한 레이어를 사용할 수 없습니다. –

+0

사용자 상호 작용이없는 간단한 애니메이션 인 경우 CALayers를 사용하여 viewController의보기에 추가하고 다양한 CoreAnimation API를 적용하여 애니메이션을 만들 수 있습니다. 모든 원에 대한 탭을 만들려면 각 원과 각보기에 대해 CAShapeLayer를 하위 레이어로 추가 한 다음 원 뷰를 하위 뷰로 ViewController 뷰에 추가 할 수 있습니다. –

관련 문제