Сломанный макет при увольнении UIViewController - PullRequest
0 голосов
/ 04 октября 2018

Мы должны реализовать UIViewController, который поддерживает все ориентации интерфейса и может быть отклонен жестом смахивания вниз.

Но представление UIViewController поддерживает только книжную ориентацию.

extension TransitioningDelegate: UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return 0.3
}

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

    let containerView = transitionContext.containerView
    let containerFrame = containerView.frame
    let targetPoint = CGPoint(x: containerFrame.minX, y: containerFrame.maxY).applying(fromView.transform)

    toView.frame = containerView.bounds
    containerView.insertSubview(toView, belowSubview: fromView)

    UIView.animate(withDuration: self.transitionDuration(using: transitionContext),
                   animations: {
                    fromView.frame.origin = targetPoint
    },
                   completion: { (finished) in
                    transitionContext.completeTransition(finished && !transitionContext.transitionWasCancelled)
    })
}
}

@objc func handlePan(_ sender: UIPanGestureRecognizer) {
    guard let mainView = sender.view else { return }

    let translation = max(0, sender.translation(in: mainView).y)
    let percent = translation/mainView.bounds.height

    switch sender.state {
    case .began:
        self.hasStarted = true
        self.presentedViewController?.dismiss(animated: true, completion: {
            print("COMPLETION")
        })
    case .changed:
        self.interactor.update(percent)
    case .cancelled, .failed:
        self.hasStarted = false
        self.interactor.cancel()
    case .ended:
        self.hasStarted = false
        if percent > 0.3 {
            self.interactor.finish()
        } else {
            self.interactor.cancel()
        }
    default:
        break
    }
}

Когда происходит панорамирование, макет представленного UIViewController становится недействительным.Представленный UIViewController меняет свою ориентацию, и жест панорамирования больше не обрабатывается.

enter image description here

enter image description here

enter image description here

ЗАВЕРШЕННЫЙ ПРОЕКТ

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

@ Алекс Бишоп, в классе Navigation Controller мы разрешаем поддерживать только portrait orientation, прямо сейчас.

Попробуйте вернуть ориентации landscape и portrait в supportedInterfaceOrientations.

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return [.portrait, .landscape]
}
0 голосов
/ 04 октября 2018

Попробуйте этот код в представленииWillappear

super.viewWillAppear(true)
self.view.frame = UIScreen.main.bounds
self.view.layoutIfNeeded()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...