2017-05-31 84 views
0

我使用UIViewControllerAnimatedTransitioning進行了自定義模態轉換。轉換完成後,模態顯示的視圖控制器將填充父視圖的一部分,即父視圖控制器的某些部分仍然可見。通過點擊視圖控制器的外部關閉部分顯示的模態視圖控制器

我需要知道如何在顯示的視圖控制器(或部分顯示的父視圖控制器)外部檢測到水龍頭,以便我可以使用它關閉模式。我瞭解如何向視圖添加手勢,但我無法找到添加手勢的視圖。

我通過stackoverflow查看,但沒有特別爲自定義模式轉換的示例。

下面是自定義轉換代碼

class PartialSlideInAnimationController: NSObject, UIViewControllerAnimatedTransitioning { 

    var direction: SlideAnimationDirectionStyle 

    var duration: TimeInterval = 0.125 
    var presentedControllerWidth: CGFloat  = 250 

    let fadeAlpha: CGFloat = 0.5 

    init(direction: SlideAnimationDirectionStyle) { 
     self.direction = direction 
     super.init() 
    } 

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

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 

     // Setup Views 
     guard let presentedFromVC = transitionContext.viewController(forKey: .from) else {transitionContext.completeTransition(false); return } 
     guard let presentingToVC = transitionContext.viewController(forKey: .to) else {transitionContext.completeTransition(false); return } 
     let contrainerView = transitionContext.containerView // アニメーションはこのViewで行われる、アニメーションを実裝する presenter, presenteeをこの上に載せないとアニメーションが動かない 

     // Setup Frames 
     let positionHidden = CGRect(x: contrainerView.frame.width + 1, y: 0, width: presentedControllerWidth, height: contrainerView.frame.height) 
     let positionShown = CGRect(x: contrainerView.frame.width - presentedControllerWidth, y: 0, width: presentedControllerWidth, height: contrainerView.frame.height) 

     switch direction { 

     case .slideIn: 

      contrainerView.addSubview(presentingToVC.view) 
      presentingToVC.view.frame = positionHidden 

      UIView.animate(withDuration: duration, animations: { 
       presentingToVC.view.frame = positionShown 
       presentedFromVC.view.alpha = self.fadeAlpha 

      }, completion: { success in 
       transitionContext.completeTransition(success) 
      }) 

     case .slideOut: 

      contrainerView.addSubview(presentedFromVC.view) 
      presentedFromVC.view.frame = positionShown 

      UIView.animate(withDuration: duration, animations: { 
       presentedFromVC.view.frame = positionHidden 
       presentingToVC.view.alpha = 1.0 

      }, completion: { success in 
       transitionContext.completeTransition(success) 

      }) 
     } 
    } 

} 

回答

2

您是否嘗試過使用UIGestureRecognizer了嗎? UIGestureRecognizer可用於識別輕敲事件,無論是在子視圖控制器還是父視圖控制器內。對於swift 3,應該有UIRecognizerDelegatehandleTapBehind函數,它應該允許你做你正在尋找的東西。

若見什麼記錄here

見「雨燕3.1的解決方案,在縱向和橫向的作品」的鏈接後。

+0

鏈接中的解決方案完美工作! – Bigair

相關問題