Представление контроллера представления с пользовательской анимацией с использованием только кода (без перехода) - PullRequest
0 голосов
/ 28 сентября 2018

Вот что я пытаюсь сделать:

Реализация боковой навигации, которая будет скользить с пользовательской анимацией слева направо

Я ссылаюсь на это:https://www.thorntech.com/2016/03/ios-tutorial-make-interactive-slide-menu-swift/

Но этот и все другие учебники, которые реализуют эту функцию, используют segues для представления представления.

Так что их код здесь:

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

Но это не вариант для меня!

Весь мой контроллер представления создается кодом,Прямо сейчас это фиктивный контроллер вида, и я просто пытаюсь заставить его скользить слева направо.

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

Вот как я пытаюсь установить делегата на себя:

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)
    }
}

Здесь я реализовывал свой делегат (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, представляя, источник) и поставил точку останова, которая била.Поэтому я подозреваю, что мне не хватает какой-то части кода, которая должна быть там введена.

Когда я его погуглил, я нашел это руководство по UIPresentationController https://www.raywenderlich.com/915-uipresentationcontroller-tutorial-getting-started

Но по мере того, как я проходил через это, все больше и больше это начинало меня смущать.

Я уверен, что есть небольшая часть, которую мне не хватает.Потому что, если он работает, когда делегат настроен на подготовку к переходу, он также должен работать при вызове present (_, анимированный, завершение)

Может кто-нибудь указать мне правильное направление?Как получить пользовательские анимации для запуска и методы делегата для вызова?Кто-нибудь знает учебник, который учит, как сделать это, используя только код и без раскадровки?

1 Ответ

0 голосов
/ 28 сентября 2018

Я сослался на ответ @Womble

" Метод UIViewControllerTransitioningDelegate, не вызванный в 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()
    }
...