5

インタラクション ポップ ジェスチャを完全なビューで提供するために、コントローラに UIPanGestureRecognizer を用意しました。これを使用すると、デフォルトの NavigationController ポップ ジェスチャを使用する代わりに、ビュー コントローラの任意の場所で左から右にスワイプしてコントローラをポップできます。

ビューでキーボードを開いた状態でジェスチャを使用すると、キーボードも非表示になり (デフォルトの NavigationController ポップ ジェスチャでは発生しません)、奇妙に見えます。

   func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
     if operation == .pop {
        return PopControllerTransition()//My transition
    }
    return nil
}

カスタム ポップ トランジションで viewController をポップしているときに、キーボードの非表示を防ぐにはどうすればよいですか。

  //transition code
  func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    let containerView = transitionContext.containerView
    let fromController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
    let toController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!

    toController.view.transform = CGAffineTransform(translationX: -(toController.view.bounds.width/3), y: 0)
    containerView.insertSubview(toController.view, belowSubview: fromController.view)

    let view = GradientView(frame: containerView.frame)
    view.horizontal = true
    view.backgroundColor = UIColor.clear
    view.transform = CGAffineTransform(translationX: -toController.view.bounds.width, y: 0)
    view.gradientLayer.colors = [UIColor(white: 0.0, alpha: 0.2).cgColor, UIColor(white: 0.0, alpha: 0.5).cgColor]
    containerView.insertSubview(view, belowSubview: fromController.view)

    let duration = transitionDuration(using: transitionContext)

    UIView.animate(withDuration: duration, animations: {
        toController.view.transform = .identity
        fromController.view.transform = CGAffineTransform(translationX: fromController.view.bounds.width, y: 0)
        view.transform = .identity
        view.alpha = 0.0
    }) { (finish) in
        if !transitionContext.transitionWasCancelled {
            fromController.view.removeFromSuperview()
        }
        view.removeFromSuperview()
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }
}
4

1 に答える 1