Ios 如何推动,;具有滑动动画效果的弹出视图控制器?

Ios 如何推动,;具有滑动动画效果的弹出视图控制器?,ios,swift,animation,uinavigationcontroller,Ios,Swift,Animation,Uinavigationcontroller,我想在导航视图控制器上推动视图控制器以及下面的动画效果 我使用导航控制器委托方法尝试了这个示例,但未能获得滑动效果 请检查下面的示例GIF,了解我到底需要哪种类型的动画。 请看一下导航栏,我只是在左/右滑动,它正在执行视图控制器的推/弹出 有人能帮我吗?我怎样才能做到这一点。另外,请让我知道是否可以使用UIPageViewController?如果是,那么如何保持顶部导航栏与GIF相同。这可能对您有所帮助。你可以试试这个例子 创建SecondViewController并设置其标识符名称。然

我想在导航视图控制器上推动视图控制器以及下面的动画效果

我使用导航控制器委托方法尝试了这个示例,但未能获得滑动效果

请检查下面的示例GIF,了解我到底需要哪种类型的动画。

请看一下导航栏,我只是在左/右滑动,它正在执行视图控制器的推/弹出


有人能帮我吗?我怎样才能做到这一点。另外,请让我知道是否可以使用UIPageViewController?如果是,那么如何保持顶部导航栏与GIF相同。

这可能对您有所帮助。你可以试试这个例子

创建SecondViewController并设置其标识符名称。然后从主ViewController中单击按钮将其加载

ViewController.swift

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func gotoNextPage(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
        vc.view.backgroundColor = .yellow
        GlobalVariable.transitionViewFrom(from: self, to: vc, subtype: .fromRight)
    }
}

class GlobalVariable: NSObject {
    private static var sharedManager: GlobalVariable!
    public var allViewInstantController: [UIViewController]=[UIViewController]()
    public static let NUMBER_OF_VIEWCONTROLLER_OPEN_AT_A_TIME:Int = 5

    static func shared() -> GlobalVariable {
        if(sharedManager==nil){
            sharedManager=GlobalVariable()
        }
        return sharedManager
    }
    override private init() {
    }

    static func transitionViewFrom(from:UIViewController, to:UIViewController, subtype:CATransitionSubtype) -> Void {
        let timeDelay:Double=0.5
        GlobalVariable.checkPreviousView(_view:to)
        GlobalVariable.splashViewFrom(from: from, to:to, isAdd:true, subtype:subtype, timeDelay: timeDelay)
    }

    static func checkPreviousView(_view:UIViewController) -> Void {
        GlobalVariable.shared().allViewInstantController.append(_view)
        if(GlobalVariable.shared().allViewInstantController.count>GlobalVariable.NUMBER_OF_VIEWCONTROLLER_OPEN_AT_A_TIME){
            let myViewController = GlobalVariable.shared().allViewInstantController.first
            myViewController?.view.removeFromSuperview()
            GlobalVariable.shared().allViewInstantController.removeFirst()
        }
    }

    static func splashViewFrom(from:UIViewController, to:UIViewController, isAdd:Bool, subtype:CATransitionSubtype, timeDelay:Double) -> Void {
        do {
            let transition = CATransition()
            transition.duration = 0.25
            transition.isRemovedOnCompletion = true;
            transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
            transition.type = CATransitionType.push
            transition.subtype  = subtype
            from.view.layer.add(transition, forKey: kCATransition)
            if(!isAdd){
                from.view.removeFromSuperview()
                if(GlobalVariable.shared().allViewInstantController.count>0){
                    GlobalVariable.shared().allViewInstantController.removeLast()
                }
            }else{
                from.view.addSubview(to.view)
            }
        }
    }

    static func dismissViewFrom(viewController:UIViewController, subtype:CATransitionSubtype) -> Void {
        let timeDelay=0.5
        GlobalVariable.splashViewFrom(from: viewController, to: UIViewController(), isAdd:false, subtype:subtype, timeDelay: timeDelay)
    }
}
import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func gotoPreviousPage(_ sender: Any) {
        GlobalVariable.dismissViewFrom(viewController: self, subtype: CATransitionSubtype.fromLeft)
    }
}
斯威夫特

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func gotoNextPage(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
        vc.view.backgroundColor = .yellow
        GlobalVariable.transitionViewFrom(from: self, to: vc, subtype: .fromRight)
    }
}

class GlobalVariable: NSObject {
    private static var sharedManager: GlobalVariable!
    public var allViewInstantController: [UIViewController]=[UIViewController]()
    public static let NUMBER_OF_VIEWCONTROLLER_OPEN_AT_A_TIME:Int = 5

    static func shared() -> GlobalVariable {
        if(sharedManager==nil){
            sharedManager=GlobalVariable()
        }
        return sharedManager
    }
    override private init() {
    }

    static func transitionViewFrom(from:UIViewController, to:UIViewController, subtype:CATransitionSubtype) -> Void {
        let timeDelay:Double=0.5
        GlobalVariable.checkPreviousView(_view:to)
        GlobalVariable.splashViewFrom(from: from, to:to, isAdd:true, subtype:subtype, timeDelay: timeDelay)
    }

    static func checkPreviousView(_view:UIViewController) -> Void {
        GlobalVariable.shared().allViewInstantController.append(_view)
        if(GlobalVariable.shared().allViewInstantController.count>GlobalVariable.NUMBER_OF_VIEWCONTROLLER_OPEN_AT_A_TIME){
            let myViewController = GlobalVariable.shared().allViewInstantController.first
            myViewController?.view.removeFromSuperview()
            GlobalVariable.shared().allViewInstantController.removeFirst()
        }
    }

    static func splashViewFrom(from:UIViewController, to:UIViewController, isAdd:Bool, subtype:CATransitionSubtype, timeDelay:Double) -> Void {
        do {
            let transition = CATransition()
            transition.duration = 0.25
            transition.isRemovedOnCompletion = true;
            transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
            transition.type = CATransitionType.push
            transition.subtype  = subtype
            from.view.layer.add(transition, forKey: kCATransition)
            if(!isAdd){
                from.view.removeFromSuperview()
                if(GlobalVariable.shared().allViewInstantController.count>0){
                    GlobalVariable.shared().allViewInstantController.removeLast()
                }
            }else{
                from.view.addSubview(to.view)
            }
        }
    }

    static func dismissViewFrom(viewController:UIViewController, subtype:CATransitionSubtype) -> Void {
        let timeDelay=0.5
        GlobalVariable.splashViewFrom(from: viewController, to: UIViewController(), isAdd:false, subtype:subtype, timeDelay: timeDelay)
    }
}
import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func gotoPreviousPage(_ sender: Any) {
        GlobalVariable.dismissViewFrom(viewController: self, subtype: CATransitionSubtype.fromLeft)
    }
}

您使用的是故事板还是代码?此外,虽然您可以使用页面视图进行导航,但它实际上没有push/pop功能(即它自己的堆栈)。但是你可以(至少在代码中)通过(1)使用子VC(导航VC)和(2)底部的页面视图来“指示”当前显示的VC-所有这些都是主VC的一部分来实现你想要的。是的,我使用的是故事板。另外,你可以提供我任何样本或只是简单的工作过程,所以这将是非常有帮助的我。谢谢你的示例代码,但这不会是工作。没有,在代码中没有问题。但它无法提供所需的输出。想象一下页面视图控制器是如何工作的,你会有一个想法。确切地说,你可以想象页面视图控制器是如何工作的。是的,但正如你提到的,我不想通过单击根视图控制器中第一个视图控制器的任何按钮来按下第二个视图控制器。我想用刷卡效果来做。