ios - 仅使用代码(无 Segue)呈现带有自定义动画的 View Controller

标签 ios swift segue core-animation

这就是我想做的事情:

实现侧边导航,该导航将通过自定义动画从左到右滑入

我指的是:https://www.thorntech.com/2016/03/ios-tutorial-make-interactive-slide-menu-swift/

但是本教程和所有其他实现此功能的教程都使用 segues 来呈现 View 。

所以他们的代码在这里:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
        if let destinationViewController = segue.destinationViewController as? MenuViewController {
            destinationViewController.transitioningDelegate = self
        }
} 

但这对我来说不是一个选择!

我的整个 View Controller 都是由代码创建的。现在它是一个虚拟 View Controller ,我只是想让它从左向右滑入。

import UIKit

class SideNavVC: UIViewController {

    static let sideNav = SideNavVC()

    override func viewDidLoad() {
        super.viewDidLoad()

        let dummyView = UIView(frame: CGRect(x: 10, y: 200, width: 100, height: 100))
        dummyView.backgroundColor = accentColor

        view.addSubview(dummyView)

        let closeBtn = UIButton(frame: CGRect(x: 4, y: 30, width: 200, height: 20))
        closeBtn.addTarget(self, action: #selector(closeViewTapped), for: .touchUpInside)
        closeBtn.setTitle("Close", for: .normal)

        view.addSubview(closeBtn)

        view.backgroundColor = confirmGreen
    }

    @objc func closeViewTapped(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
}

我被困在教程的这一步:https://www.thorntech.com/2016/03/ios-tutorial-make-interactive-slide-menu-swift/#four

这就是我尝试将委托(delegate)设置为 self 的方式:

func addSlideGesture() {

    let edgeSlide = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(presentSideNav))
    edgeSlide.edges = .left
    view.addGestureRecognizer(edgeSlide)
}

@objc func presentSideNav() {

    if presentedViewController != SideNavVC.sideNav {
        SideNavVC.sideNav.transitioningDelegate = self
        SideNavVC.sideNav.modalPresentationStyle = .custom
        self.present(SideNavVC.sideNav, animated: true, completion: nil)
    }
}

这是我实现委托(delegate)的地方(MainVC 是用户向右滑动的地方)

extension MainVC: UIViewControllerTransitioningDelegate {
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        print("Source: \(source)")
        print("Destination \(presenting)")

        if source == self && presenting == SideNavVC.sideNav {
            print("PRESENTING SIDE NAV")
            return RevealSideNav()
        }

        return nil
    }

    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        //Added a break point here. It is hitting.
        return nil
    }

}

由于我的代表没有调用,我决定添加 presentationController(forPresented,presenting,source) 并在其中放置一个断点。所以我怀疑我遗漏了需要放入其中的代码的某些部分。

当我用谷歌搜索时,我发现了这个 UIPresentationController 教程 https://www.raywenderlich.com/915-uipresentationcontroller-tutorial-getting-started

但是当我经历它时,它开始让我越来越困惑。

我确信我遗漏了一些小部分。因为如果它在 delegte 设置为准备转场时有效,那么它在调用 present(_,animated,completion)

时也应该有效

有人能指出我正确的方向吗?如何获取要触发的自定义动画和要调用的委托(delegate)方法?有谁知道一个教程,教如何仅使用代码而不使用 Storyboard来做到这一点?

最佳答案

我引用了@Womble 的回答

"UIViewControllerTransitioningDelegate method not called in iOS 7 "

事实证明我使用的方法是错误的,并且 Xcode 没有对此发出警告。有点奇怪。

 func animationController(forPresented presented: UIViewController,
                             presenting: UIViewController,
                             source: UIViewController)
        -> UIViewControllerAnimatedTransitioning?
    {
        print("Source: \(source)")
        print("Destination \(presenting)")
        // ... return your cached controller object here.
        return RevealSideNav()
    }

关于ios - 仅使用代码(无 Segue)呈现带有自定义动画的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52562132/

相关文章:

ios - 如何在打开新窗口时在钛合金中实现滑动过渡

swift - 未打开的 NSWindow isVisible 属性设置为 true

ios - 使用 Swift 5 时出现 didFinishPickingMediaWithInfo 错误

ios - 自定义segue到同级 View Controller

ios - 保存一个充满自定义对象的 NSMutableArray

ios - 如何在 Phonegap iOS 中更改键盘

ios - 如何在自定义单元格中使用其他 didSet 变量的首选项?

ios - 以编程方式添加按钮

swift - iOS QR 代码扫描仪多次触发操作

ios - 是否可以创建从右到左过渡的自定义 Segue