viewController Присутствует, когда я отклонил его - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть viewcontroller, который передается tableViewController, и я хочу представить его с переходом, и в качестве sideMenu сверху я нахожу некоторый код, и он работает нормально, но я не могу понять ту часть, когда я отклоняю ViewController, он представляет себя

//
//  ViewController.swift
//  ProTansition
//
//  Created by Teodik Abrami on 11/1/18.
//  Copyright © 2018 Teodik Abrami. All rights reserved.
//

import UIKit

class ViewController: UIViewController, MenuTransitionManagerDelegate {

    func dismiss() {
        dismiss(animated: true, completion: nil)
        print("dismiss run")
    }
    var menuTransition = MenuTransitionManager()

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

    override func viewDidAppear(_ animated: Bool) {
        print("ViewController Appear")
    }

    override func viewDidDisappear(_ animated: Bool) {
        print("viewcontroller disapear")
    }


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destinaion = segue.destination
        destinaion.transitioningDelegate = menuTransition
        menuTransition.delegate = self
    }
}

tableView - это обычное табличное представление с 5 строками и без специального кода

и переход

//
//  MenuTransitionManager.swift
//  ProTansition
//
//  Created by Teodik Abrami on 11/1/18.
//  Copyright © 2018 Teodik Abrami. All rights reserved.
//

import Foundation
import UIKit
@objc protocol MenuTransitionManagerDelegate {

    func dismiss()
}

class MenuTransitionManager: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {
    let duration = 2.0
    var isPresenting = false
    var delegate: MenuTransitionManagerDelegate?
    var snapShot: UIView? {
        didSet {
            if let delegate = delegate {
                let tap = UITapGestureRecognizer(target: delegate, action: #selector(delegate.dismiss))
                snapShot?.addGestureRecognizer(tap)
            }
        }
    }

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return duration
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let fromView = transitionContext.view(forKey: UITransitionContextViewKey.from) else {
            return
        }

        guard let toView = transitionContext.view(forKey: UITransitionContextViewKey.to) else {
            return
        }
        let container = transitionContext.containerView
        let moveDown = CGAffineTransform.init(translationX: 0, y: container.frame.height - 150)
        if isPresenting {
            container.addSubview(toView)
            snapShot = fromView.snapshotView(afterScreenUpdates: true)
            container.addSubview(snapShot!)
        }

        UIView.animateKeyframes(withDuration: duration, delay: 0, options: [], animations: {
            if self.isPresenting {
                self.snapShot?.transform = moveDown
            } else {
                self.snapShot?.transform = CGAffineTransform.identity
            }
        }) { (finished) in
            transitionContext.completeTransition(true)
            if !self.isPresenting {
                self.snapShot?.removeFromSuperview()
            }
        }
    }

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        isPresenting = true
        return self
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        isPresenting = false
        return self
    }

}

Я добавляю tapgesture к снимку, и когда его протокол сработал, и отклонил его в viewcontroller, когда появился viewController. Я не понимаю, почему и даже почему коды выполняются на контроллере, который не представлен

это контроллер представления, который я не могу понять, почему он присутствует, когда я отклоняю его

это происходит при нажатии кнопки меню

1 Ответ

0 голосов
/ 02 ноября 2018

Вся ваша стратегия установки isPresenting = true или isPresenting = false обречена на провал, так как оба фрагмента кода будут выполняться в обоих случаях. Вы должны отличать представление от отклонения, используя два разных объекта animationController (вместо того, чтобы возвращать self оба раза) или просматривая, какой контроллер представления является контроллером представления from, а какой - контроллер представления to.

...