https://developer.apple.com/documentation/uikit/uifocusanimationcoordinator
"A coordinator of focus-related animations during a focus update."
포커스 업데이트가 발생하는 동안 포커스 관련 애니메이션의 조정자입니다.
@MainActor class UIFocusAnimationCoordinator : NSObject
UIFocusAnimationCoordinator
인스턴스는 항상 시스템에 의해 생성되고 포커스 업데이트 동안 앱에 제공됩니다. 그리고 이 인스턴스는 업데이트 완료 후 사라집니다. UIFocusAnimationCoordinator
객체를 직접 인스턴스화 하는 것은 유용하지 않습니다. 관련 클래스와 프로토콜을 포함하는 UIFocus.h 헤더 파일은 포커스 기반 입력을 사용하는 앱에서 포커스를 제어하기 위한 단일 고수준 소프으웨어 인터페이스를 생성합니다. 이 프로그래밍 인터페이스는 스크린에서 포커스 동작을 제어하는 것을 돕기도 합니다.
포커스 업데이트가 발생하면 두 가지 주요 애니메이션이 생깁니다. 이전에 초점이 맞춰진 뷰는 초점이 맞춰지지 않은 상태로 애니메이션 처리되고, 다음으로 초점이 맞춰진 뷰가 초점이 맞춰진 상태로 애니메이션 처리됩니다. 애니메이션 조정자의 목적은 다른 뷰가 이전에 초점이 맞춰졌던 혹은 다음으로 초점이 맞춰지는 뷰의 주요 애니메이션을 따라 애니메이션을 조정하는 것입니다. 조정자에 추가된 모든 애니메이션은 같은 애니메이션 블록에서 같은 타이밍과 옵션으로 함께 실행됩니다.
예를 들어 UI가 제목 아래에 초점이 맞춰질 수 있는 이미지의 구성이라고 가정하겠습니다. 이미지에 초점이 맞춰지면, 애니메이션을 따라 크기가 더 커지고 초점이 맞춰진 상태가 됨으로써, 포커스 업데이트 동안 제공된 UIFocusAnimationCoordinator
인스턴스를 사용해 애니메이션을 스케줄링합니다. 이미지가 확장되고 있기 때문에 제목은 확장되는 이미지의 bottom edge로부터 고정된 길이를 유지할 수 있도록 위치가 애니메이션 처리되어야 하며, 또한 조정자를 사용해 이 애니메이션을 스케줄링해야 합니다. 두 애니메이션이 조정자를 사용해 스케줄링되었기 때문에 이들이 정확히 동시에 일어남을 보장하기 위해 업데이트의 끝에 함께 동작될 것입니다.
UIFocusAnimationCoordinator
를 사용해 애니메이션을 스케줄링 하는 것은 중요합니다. 오내ㅑ하면 애니메이션의 속성은 특정 시스템 수준 동작을 달성하기 위해 시스템에 의해 정의되기 때문입니다. 예를 들어 포커스가 빠르게 움직인다면, 애니메이션의 타이밍은 사용자의 움직임을 유지하기 위해 속도를 올려야 합니다. 덧붙여 포커싱 애니메이션은 언포커싱 애니메이션보다 빠르게 움직이며, 이는 사용자가 움직일 때 트레일 이펙트를 생성하기 위함입니다. 다중 포커스 업데이트 시 고정 듀레이션을 가정하지 않아야 하고, 뷰 계층 구조의 다른 브랜치에서 다른 뷰에 대한 애니메이션의 타이밍이 같지 않도록 해야 합니다.
포커스 관련 애니메이션에 대한 더 많은 제어가 필요한 경우 조정된 애니메이션 내부에 중첩된 애니메이션 블록을 추가할 수 있습니다. 이는 일반적인 중첩 애니메이션과 같은 규칙을 따르며, 이는 애니메이션 듀레이션과 속성이 상속된다는 것을 의미합니다. 편집이 필요한 경우 options-
의 UIView.AnimationOptions-
집합을 사용해야 합니다. 만약 애니메이션의 타이밍을 변경시키길 원한다면, inheritedAnimationDuration
에서 상속된 듀레이션에 상대적인 듀레이션을 구체화하길 권장하는 바입니다. 이렇게 함으로써 앱은 타이밍 동작의 이점을 유지합니다.
예를 들어 아래 코드에서 절반의 시스템 정의 듀레이션에서 작동해야만 하는 조정된 애니메이션 추가 방법을 보여주고 있습니다.
override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
coordinator.addCoordinatedAnimations({
let duration : NSTimeInterval = UIView.inheritedAnimationDuration();
UIView.animateWithDuration((0.5*duration), delay: 0.0, options: UIViewAnimationOptions.OverrideInheritedDuration, animations: {
//add your animations
}, completion: nil)
}, completion: nil)
그러나 다른 듀레이션의 애니메이션을 중첩시키려면, addCoordinatedAnimations(_:completion:)
메소드의 컴플리션 블록이 메인 애니메이션 완료 후에만 동작될 수 있음을 기억하시기 바랍니다.