iOS Swift开发 navigation模式自定义pop和push动画

在基于navigation的跳转涉及到pop和push操作,这个时候,如果想要自定义画面切入的动画可以按如下操作

添加如下类:

Swift 复制代码
import UIKit

class SimpleOver: NSObject, UIViewControllerAnimatedTransitioning {
        
        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: 0, dy: f.height)
            //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
            }, 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: 0, dy: f.height)
            //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
            }, completion: {_ in
                    transitionContext.completeTransition(true)
            })
        }
    }

在第一个载入的界面中添加

Swift 复制代码
class ViewController: UIViewController,UIViewControllerTransitioningDelegate, UINavigationControllerDelegate {
    let simpleOver = SimpleOver()
    ...
    func navigationController(
        _ navigationController: UINavigationController,
        animationControllerFor operation: UINavigationController.Operation,
        from fromVC: UIViewController,
        to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        simpleOver.popStyle = (operation == .pop)
        return simpleOver
    }
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        navigationController?.delegate = self
        ...
    }
    ...
}

之后正常使用pop和push命令,即可使用我们自定义的动画效果了。

此方法从stackoverflow获得,并加以修改成自己的动画效果,测试可以正常工作。

相关推荐
aramae3 小时前
模拟实现strcmp()(C语言)
c语言·开发语言·后端
泡海椒4 小时前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外5 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55235 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
黑化旺仔7 小时前
【OC】KVO
macos·ios·objective-c·cocoa
Bruce_Liuxiaowei8 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
HouWan9 小时前
SwiftUI 小技巧:如何读取 SwiftUI Font 的详细信息
ios·swiftui·apple
李游Leo9 小时前
HarmonyOS 7 实战开发 05:把页面做到可上线状态
ios·harmonyos
aramae9 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
码行山野赴时序归途12 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表