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

相关推荐
云和数据.ChenGuang18 分钟前
人工智能 机器学习期末考试题
开发语言·人工智能·python·机器学习·毕业设计
lllsure3 小时前
Python基础语法
开发语言·python
zxctsclrjjjcph5 小时前
【高并发内存池】从零到一的项目之centralcache整体结构设计及核心实现
开发语言·数据结构·c++·链表
zm5 小时前
服务器多客户端连接核心要点(1)
java·开发语言
炯哈哈5 小时前
【上位机——MFC】单文档和多文档视图架构
开发语言·c++·mfc·上位机
FuckPatience5 小时前
关于C#项目中 服务层使用接口的问题
java·开发语言·c#
编程轨迹_6 小时前
使用 Spring 和 Redis 创建处理敏感数据的服务
java·开发语言·restful
赵和范6 小时前
C++:书架
开发语言·c++·算法
boooo_hhh6 小时前
第J7周:对于ResNeXt-50算法的思考
开发语言·python·深度学习
LSL666_7 小时前
Java——多态
java·开发语言·多态·内存图