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获得,并加以修改成自己的动画效果,测试可以正常工作。

相关推荐
程高兴12 分钟前
中性点不接地系统单相接地故障Matlab仿真
开发语言·matlab
AI很强16 分钟前
matlab常见的配图代码实现1
开发语言·算法·matlab
鲤籽鲲37 分钟前
C# Enumerable类 之 数据排序
开发语言·c#·c# 知识捡漏
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧37 分钟前
C语言_数据结构总结6:链式栈
c语言·开发语言·数据结构·算法·链表·visualstudio·visual studio
IT猿手1 小时前
2025最新群智能优化算法:云漂移优化(Cloud Drift Optimization,CDO)算法求解23个经典函数测试集,MATLAB
开发语言·数据库·算法·数学建模·matlab·机器人
至暗时刻darkest1 小时前
go mod文件 项目版本管理
开发语言·后端·golang
SunshineBrother1 小时前
shell脚本,怎么查找项目中的重复图片
ios
月未央1 小时前
HarmonyOS Next 开发系列:Provider和Consumer状态修饰器实践
ios·harmonyos
sakoba1 小时前
spring IOC(实现原理)
java·开发语言
MZWeiei1 小时前
Scala:在哪里写类的属性?类的属性必须私有吗?类的必须初始化吗?
开发语言·scala