ios - 呈现带有过渡的 viewController
问题描述
当我实例化并呈现视图控制器时,是否可以定义一种过渡类型?
这段代码会生成一个默认的淡入淡出类型过渡,但我需要它从左到右出现,这可能吗?
谢谢!
@IBAction func botonVolverFamilias(_ sender: Any) {
let sw = revealViewController()
self.view.window?.rootViewController = sw
let viewControllerModelos = storyboard!.instantiateViewController(withIdentifier: "vc_catalogo_familias") as! VC_catalogo
let navigationController = UINavigationController(rootViewController: viewControllerModelos)
navigationController.navigationBar.isHidden=false
navigationController.setNavigationBarHidden(true, animated: false)
sw!.setFront(navigationController, animated: true)
}
解决方案
你需要用来改变 a 的转换是在你的堆栈UINavigationController
中找到第一个。UIViewController
您应该将此扩展UIViewController
为 anUIViewControllerTransitioningDelegate
和 an UINavigationControllerDelegate
。
然后,您可以调用func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
来定义您想要呈现新的过渡类型UIViewControllers
。
因此,为了做到这一点,我们必须创建一个自定义UIViewControllerAnimatedTransitioning
类并在此UIViewControllerTransitioningDelegate
方法中返回它。这是我使用的示例。
import UIKit
class SimpleOver: NSObject, UIViewControllerAnimatedTransitioning {
var direction: TransitionDirection!
init(direction: TransitionDirection) {
self.direction = direction
}
var popStyle: Bool = false
func transitionDuration(
using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.20
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
if popStyle {
animatePop(using: transitionContext)
return
}
let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
let f = transitionContext.finalFrame(for: tz)
let fOff = f.offsetBy(dx: f.width, dy: 0)
tz.view.frame = fOff
transitionContext.containerView.insertSubview(tz.view, aboveSubview: fz.view)
UIView.animate(
withDuration: transitionDuration(using: transitionContext),
animations: {
tz.view.frame = f
for subview in fz.view.subviews {
subview.alpha = 0
}
}, completion: {_ in
transitionContext.completeTransition(true)
})
}
func animatePop(using transitionContext: UIViewControllerContextTransitioning) {
let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
let f = transitionContext.initialFrame(for: fz)
let fOffPop = f.offsetBy(dx: f.width, dy: 0)
transitionContext.containerView.insertSubview(tz.view, belowSubview: fz.view)
UIView.animate(
withDuration: transitionDuration(using: transitionContext),
animations: {
fz.view.frame = fOffPop
for subview in tz.view.subviews {
subview.alpha = 1
}
}, completion: {_ in
transitionContext.completeTransition(true)
})
}
}
enum TransitionDirection {
case left
case right
}
然后,在我们的func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
方法中,我们可以简单地返回它UIViewControllerAnimatedTransitioning
:
extension YourViewController: UIViewControllerTransitioningDelegate, UINavigationControllerDelegate {
func navigationController(
_ navigationController: UINavigationController,
animationControllerFor operation: UINavigationController.Operation,
from fromVC: UIViewController,
to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
//This tells our navigation controller the style that we want to animate our transition between view controllers
let simpleOver = SimpleOver(direction: .right)
simpleOver.popStyle = (operation == .pop)
return simpleOver
}
}
推荐阅读
- reporting-services - SSRS - 批量打印分组问题?报告似乎随机弄乱了 PO 编号和页码
- python - 如何获取每个用户说话的时间戳?
- c# - 在方法执行之前和之后注入行为以记录输入和输出
- jmeter - Jmeter如何修改BeanShell中的变量
- javascript - 为什么这个 setState 是这样的,它是如何工作的?
- c# - Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息
- javascript - 在 Angular lib 中使用 Angular highchart
- android - 使用 Google Maps 和 Jetpack Compose 时如何添加地图工具栏
- vuejs3 - vuejs3 unMounted 表现良好,watch 表现不佳
- php - 通过纯枚举实现 JsonSerializable