TransitionController
介绍
您可以使用 TransitionController 来取消 animated transition,以及在不同类型的 ViewController(如 UIViewController, UINavigationController, UITabBarController, UICollectionViewController, 和 UITableViewController)之间进行切换。
接受 ViewController 的 delegate 用于 willPresent、didPresent、willDismiss 和 didDismiss 的事件。
![]() |
![]() |
---|---|
![]() |
![]() |
要求
TransitionController
使用 Swift 5.0 编写。兼容 iOS 8.0 及以上版本。
安装
TransitionController 可通过 CocoaPods 获取。要安装,只需将以下行添加到您的 Podfile 中
pod 'TransitionController'
使用方法
import TransitionController
class ImageViewController {
@IBOutlet private weak var imageView: UIImageView!
@IBAction private func transitionTap(_ sender: UIButton) {
guard let viewController = UIStoryboard(name: "Image", bundle: nil).instantiateViewController(withIdentifier: "ImageTransitionController") as? ImageTransitionController else { return }
// let viewController = ImageTransitionController()
viewController.transitionDelegate = self
viewController.imageView.image = self.imageView.image
self.present(viewController, animated: true, completion: nil)
}
}
// MARK: TransitionDelegate
extension ImageViewController: TransitionDelegate {
var transitionSuperview: UIView {
return self.view
}
func transitionPresentFromView(_ base: BaseTransition) -> UIView? {
return self.imageView
}
func transitionPresentFromImage(_ base: BaseTransition) -> UIImage? {
return self.imageView.image
}
func transitionDismissToView(_ base: BaseTransition) -> UIView? {
return self.imageView
}
}
TransitionController
import UIKit
import TransitionController
class ImageTransitionController: TransitionViewController {
@IBOutlet weak var imageView: UIImageView!
override var presentToView: UIView? {
let view = UIView(frame: self.imageView.frameForImageInImageViewAspectFit)
view.contentMode = .scaleAspectFit
return view
}
override var dismissFromView: UIView? {
return self.imageView
}
override var dismissFromImage: UIImage? {
return self.imageView.image
}
}
extension UIImageView {
var frameForImageInImageViewAspectFit: CGRect {
if let img = self.image {
let imageRatio = img.size.width / img.size.height
let viewRatio = self.frame.size.width / self.frame.size.height
if(imageRatio < viewRatio) {
let scale = self.frame.size.height / img.size.height
let width = scale * img.size.width
let topLeftX = (self.frame.size.width - width) * 0.5
return CGRect(x: topLeftX, y: 0, width: width, height: self.frame.size.height)
} else {
let scale = self.frame.size.width / img.size.width
let height = scale * img.size.height
let topLeftY = (self.frame.size.height - height) * 0.5
return CGRect(x: 0, y: topLeftY, width: self.frame.size.width, height: height)
}
}
return CGRect(x: 0, y: 0, width: 0, height: 0)
}
}
已完成!
超类
class ExampleViewController: TransitionViewController {
}
class ExampleNavigationController: TransitionNavigationController {
}
class ExampleTabBarController: TransitionTabBarController {
}
class ExampleTableViewController: TransitionTableViewController {
}
class ExampleCollectionViewController: TransitionCollectionViewController {
}
基本Transition Controller 协议
// indexPath or sequence or etc
var key: Any? { set get }
// transitionContext.containerView
// Top-level view of a transition
var containerView: UIView? { get }
// duration when present
var presentDuration: TimeInterval { get }
// destination view when present
var presentToView: UIView? { get }
// duration when dismiss
var dismissDuration: TimeInterval { get }
// Start point view when dismiss
var dismissFromView: UIView? { get }
// Start point image when dismiss
var dismissFromImage: UIImage? { get }
// gesture enabled
// UINavigationController Back Swipe: UIScreenEdgePanGestureRecognizer
// Transition Gesture: UIPanGestureRecognizer
func transitionRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
代表
// MARK: TransitionDelegate
extension ViewController: TransitionDelegate {
var transitionSuperview: UIView {
return self.view
}
func transitionPresentFromView(_ base: BaseTransition) -> UIView? {
return self.imageView
}
func transitionPresentFromImage(_ base: BaseTransition) -> UIImage? {
return self.imageView.image
}
func transitionDismissToView(_ base: BaseTransition) -> UIView? {
return self.imageView
}
func transitionWillPresent(_ base: BaseTransition, viewController: UIViewController) {
print("transitionWillPresent")
}
func transitionDidPresent(_ base: BaseTransition, viewController: UIViewController) {
print("transitionDidPresent")
}
func transitionWillDismiss(_ base: BaseTransition, viewController: UIViewController) {
print("transitionWillDismiss")
}
func transitionDidDismiss(_ base: BaseTransition, viewController: UIViewController) {
print("transitionDidDismiss")
}
func transitionGesture(_ base: BaseTransition, viewController: UIViewController, gesture: UIPanGestureRecognizer, progress: CGFloat) {
switch gesture.state {
case .began:
base.transitionView.backgroundColor = .black
case .changed:
base.transitionView.backgroundColor = UIColor.black.withAlphaComponent(progress / 3)
default:
break
}
}
}
更多示例
作者
pikachu987, [email protected]
许可证
版权所有(c)2019 pikachu987 [email protected]
特此授予任何人获取本软件及其相关文档资料(以下简称“软件”)副本的自由许可,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许软件的提供者进行上述操作,前提是遵守以下条件
以上版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和无侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他原因,由此软件或其使用或与其他方式联系而产生的。