1

이것은 한 사람이 부정적으로 간주 할 수있는 많은 버그와 관련이 있습니다.일반적으로 UIView 애니메이션을 통해 Core Animation을 사용하는 것이 적절한 경우

내가 더 많이 알아 차렸던 것은 모든 맛을 UIView animateWithDuration:으로 사용할 때 사실상 불필요하게 여러 가지 속성 (내보기의 여러 속성)을 수정하고 간단한 숨기기/공개 스타일 애니메이션 등을하는 것입니다.

UINavigationBar가 특정 회전 전환에 대해 제대로 위치에 애니메이션을 적용하지 않거나 헤더 업데이트가 프레임 업데이트시 상태 표시 줄과 함께 움직이지 않는 경우,보기의 하위 레이어가 암시 적으로 다르게 애니메이션을 적용 할 때 상위 뷰의 속성이 변경됩니다.

이렇게 많은 부분을 다시 살펴보고 CAAnimations로 변환했기 때문에 그들은 관리하기가 더 쉬워 보이는 데 실제로 뷰의 대상 속성 값을 수정하지 않습니다.

간단한 예제로 [view setHidden:]을 사용한 다음 애니메이션을 적용하거나 보이지 않지만 애니메이션이 실행되는 동안보기가 실제로 표시되거나 숨겨집니다.

UINavigationController의 뷰를 수정하면 UINavigationBar가 올바른 위치로 이동하지 않기 때문에 UINavigationController의 뷰를 변형/회전/확대/축소하고 CAAnimation을 사용하여 필요에 따라 또 하나의 뷰가 필요합니다. 뷰의 변환 프로퍼티 값.

결론적으로이 질문에 대해 필자는 앞뒤로왔다 갔다하며 내 상황에 대해 다른 것보다 적절한 장소를 찾고 있었지만 주로 다른 사람들이이 시나리오에 대해 어떻게 생각하는지 듣고 싶습니다. 애플이 제공 한 것에 대한 통찰력이 있다면 내 접근 방식에 대해 더 잘 느낄 수있을 것이다.

미리 감사드립니다.

답변

5

하루가 끝날 때 모든 UIKit 스타일의 애니메이션은 Core Animation 스타일의 애니메이션으로 변환됩니다. 즉, 모든 것이 실제로 Core Animation을 사용하여 애니메이션됩니다. API 간의 차이점은 대부분 편의성 중 하나입니다. UIKit 스타일의 애니메이션 함수는 모델 값을 업데이트하고, 프리젠 테이션 레이어에서 시간에 따른 변화를 반영하도록 애니메이션을 커밋합니다.

UIKit에서 애니메이션을 적용 할 수 있다고 말하는 속성에 애니메이션을 적용 할 때주의해야합니다. 예를 들어, 기술적으로 UIScrollView의 속성을 contentSizecontentOffset과 같이 애니메이트 할 수는 있지만 공식적으로 지원되지 않으므로 잠재적으로 부작용을 처리해야합니다.

는 또한, frame은 실제로 (노출하지 않습니다 UIViewCALayeranchorPoint 이외에,) 파생 center, transform 구성 특성, 및 bounds 때문에 특별한 경우이다. 보기의 frame에 애니메이션을 적용하면 일반적으로 순환 게재가 포함 된 의도하지 않은 문제가 발생할 수 있습니다. frameCALayer에 명시 적으로 애니메이션을 적용 할 수있는 속성이 아니기 때문에 코어 애니메이션에는이 문제가 없습니다. UIKit 스타일의 애니메이션에서 boundscenter을 사용하려고하면 해당보기의 아핀 변환 (예 : 축척, 변환, 회전)과 관련된 이상한 동작이 발생합니다.

애니메이션을 추가하는 것 외에도 모델 값을 업데이트하기 때문에 UIKit의 특정보기에 애니메이션을 적용하면 의도하지 않은 부작용이나 버그가 발생할 수 있습니다.반면 Core Animation은 좀 더 유연합니다. 모델 레이어 또는 프리젠 테이션 레이어를 업데이트하는 방법과시기를 세부적으로 제어 할 수 있기 때문입니다.

하지만 UIKit이 불필요한 수정 작업에 동의하지 않습니다. 요청한 애니메이션 변경 사항을 커밋하고 모델 값을 업데이트하기 위해 수정해야 할 사항을 수정합니다. frame과 같은 속성에 애니메이션을 적용하면 현재 실행 루프 이후에 해당 뷰에서 layoutSubviews()을 암시 적으로 호출합니다.이 뷰는 다른 하위 뷰로 캐스케이드 할 수 있습니다.

애니메이션을 만들기 전에 UIKit의 모든 레이아웃 논리를 수행하려면 애니메이션 블록을 호출하기 전에 layoutIfNeeded()과 함께 setNeedsLayout()을 호출하십시오. 애니메이션이 커밋되는 동시에 UIKit에서 전체 하위 뷰 계층 구조의 변경 사항을 실제로 애니메이션화하려면 UIViewAnimationOptions.layoutSubviews 옵션을 지정하십시오. 그러면 애니메이션 블록 내에서 하위 뷰 레이아웃이 즉시 트리거되므로 해당 값도 애니메이션으로 표시됩니다. 그렇지 않으면 애니메이션에 의해 변경된 모델 값이 다음 실행 루프에서 레이아웃 업데이트를 트리거합니다.

일반적으로 UIKit 스타일의 애니메이션 기능을 사용할 때 거의 문제가 발생하지 않습니다. 따라서 iOS에서 많은 시간을 애니메이션으로 보냈다면 다음과 같이 말할 수 있습니다.

정말 편리한 기능이므로 모든 장소에서 UIKit 스타일의 애니메이션을 사용하십시오. 코어 애니메이션 스타일 애니메이션은 UIKit 스타일의 애니메이션에 문제가 있거나 레이어의 모델 및 프레젠테이션 값을 업데이트해야하는 방식을 구체적으로 제어해야하는 경우에 사용해야합니다.