Chuyển đổi chế độ xem tùy chỉnh – Hoạt hình mờ dần

Tram Ho

Môi trường phát triển:

  • Swift Language Version: Swift 5.0
  • Xcode: Version 11.1
  • Deployment Target: 11.2

Ý tưởng:

Bài viết hôm nay mình sẽ chia sẻ về cách sử dụng custom transition animation đối với các subviews (hay còn gọi là các view con). Ta sẽ sử dụng container view cho animations để tránh những lỗi có khả năng xảy ra khi ta animating các subviews và mainview đồng thời.

  1. Tạo snapshots của subviews thuộc “from” view và sau đó ẩn subviews đó.
  2. Tạo snapshots của subviews thuộc “to” view và sau đó ẩn subviews đó.
  3. Convert tất cả các frame’s values sang tọa độ của container view và add tất cả snapshots vào container view.
  4. Start những “to” snapshots với giá trị alpha = 0 (fade in)
  5. Animate những thay đổi của “to” snapshots từ alpha = 0 đến 1.
  6. Đồng thời animate những “from” snapshot đến vị trị cuối cùng của “to” view và animate giá trị alpha của chúng từ 1 đến 0 (fade out). Kết hợp với bước 4 để tạo nên hiệu ứng cross dissolve.
  7. Khi tất cả các bước trên đã thực hiện, remove tất cả snapshots và unhide các subviews mà snapshots của chúng đã animated.

Bước 1: Khởi tạo màn hình

Bước 2: Khởi tạo protocols

  • fromAnimatedSubviews: chứa các subviews thuộc “from” view được animated.
  • toAnimatedSubviews: chứa các subviews thuộc “to” view được animated.

Bước 3: Extension UIView

  • Hàm zo_snapshot() trả về snapshot kiểu UIImage.
  • Hàm snapshotView() trả về snapshotView kiểu UIView.

Bước 4: Subviews animation transition

UIKit cho phép tuỳ chỉnh view controller’s presentation thông qua UIViewControllerAnimatedTransitioning delegate với hai function chính:

  • transitionDuration(using: ): Hàm lấy thông tin về thời gian diễn ra transition animations. Giá trị trả về phải giống với giá trị bạn sử dụng để config animations trong hàm animateTransition(using: ).
  • animateTransition(using: ): Hàm cho phép config transition animations và được gọi khi presenting hoặc dismissing view controller.

Trong đó:

  • fromView: là view xuất hiện ở phần mở đầu của transition, hoặc ở phần kết thúc của canceled transition. Ví dụ khi presenting thì fromView là view của viewController1, còn khi dismissing thì fromView là view của viewController2.
  • toView: là view xuát hiện ở phần kết thúc của completed transition.
  • container: hoạt động như một superview chứa các views tham gia vào transition.
  • TransitionType: enum thể hiện các kiểu transitions.
  • completeTransition(): Hàm thông báo cho system rằng transition animation đã hoàn thành.

Bước 5: Custom navigation controller

  • Hàm navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) sẽ trả về đúng view controller’s presentation ở trường hợp push hoặc dismiss.

Bước 6: MainViewController và DetailViewController

Hai viewController áp dụng thực thi CustomTransitionOriginatorCustomTransitionDestination để chọn ra những subviews được animated khi custom transition được thực thi.

Kết quả

Tài liệu tham khảo

https://stackoverflow.com/questions/46596481/view-controller-transition-animate-subview-position

Link github

https://github.com/oNguyenDucHuyB/CustomTransitionVC/tree/navigationTransition

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo