2017-07-28 87 views
0

我在SO(和其他地方)找到了許多相關的主題,但仍找不到解決我的問題的方法。我想使用UIViewControllerTransitioningDelegate在我的視圖中顯示自定義提醒。因此,首先,在我最初的視圖控制器,這裏是電話:UIViewControllerAnimatedTransitioning:屏幕在自定義視圖下不斷變黑

@IBAction func tappedButton(_ sender: Any) { 
    MyAlertViewController.presentIn(viewController: self) 
} 

這裏的MyAlertViewController代碼:

import UIKit 

open class MyAlertViewController: UIViewController, UIViewControllerTransitioningDelegate { 

    @IBOutlet weak var overlayView: UIView? 
    @IBOutlet weak var alertView: UIView? 
    @IBOutlet weak var alertCenterYConstraint: NSLayoutConstraint? 

    public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     super.init(nibName: "MyAlertView", bundle: nil) 
     self.transitioningDelegate = self 
    } 

    required public init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    static func presentIn(viewController: UIViewController) { 
     let alertViewController = MyAlertViewController() 

     if Thread.isMainThread { 
      viewController.present(alertViewController, animated: true, completion: nil) 
     } else { 
      DispatchQueue.main.async { 
       viewController.present(alertViewController, animated: true, completion: nil) 
      } 
     } 
    } 

    public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return MyDismissAlertViewAnimationController() 
    } 

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

class MyPresentAlertViewAnimationController: NSObject, UIViewControllerAnimatedTransitioning { 
    public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return 0.3 
    } 

    public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     let toViewController: MyAlertViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as! MyAlertViewController 
     let duration = self.transitionDuration(using: transitionContext) 

     let containerView = transitionContext.containerView 
     toViewController.view.frame = containerView.frame 
     containerView.addSubview(toViewController.view) 

     toViewController.overlayView?.alpha = 0.0 
     UIView.animate(withDuration: duration, animations: { 
      toViewController.overlayView?.alpha = 0.6 
     }) 

     let finishFrame = toViewController.alertView?.frame 
     var startingFrame = finishFrame 
     startingFrame?.origin.y = -((finishFrame?.height)!) 
     toViewController.alertView?.frame = startingFrame! 

     UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1.0, options: .layoutSubviews, animations: { 
      toViewController.alertView?.frame = finishFrame! 
     }, completion: { result in 
      transitionContext.completeTransition(result) 
     }) 
    } 
} 

class MyDismissAlertViewAnimationController: NSObject, UIViewControllerAnimatedTransitioning { 
    public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return 0.3 
    } 

    public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     let fromViewController: MyAlertViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as! MyAlertViewController 
     let duration = self.transitionDuration(using: transitionContext) 

     UIView.animate(withDuration: duration, animations: { 
      fromViewController.overlayView?.alpha = 0.0 
     }) 

     var finishFrame = fromViewController.alertView?.frame 
     finishFrame?.origin.y = -(finishFrame?.height)! 
     finishFrame?.origin.y = fromViewController.isDismissingByBottom ? fromViewController.view.frame.size.height : -(finishFrame?.height)! 

     UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .layoutSubviews, animations: { 
      fromViewController.alertView?.frame = finishFrame! 
     }, completion: { result in 
      transitionContext.completeTransition(true) 
     }) 
    } 
} 

動畫做工精細,黑色的屏幕只有調用completeTransition()後出現你可以看到如下:

enter image description here

感謝您的幫助...

回答

1

我認爲你需要可以設置背景顏色,像這樣:

self.view.backgroundColor = .clear 

這將確保你看到的背景不只是你的模態的背景顏色。

或阻止呈現視圖控制器從屏幕通過使模態呈現樣式overCurrentContext

self.modalPresentationStyle = .overCurrentContext 
+0

非常感謝被刪除!在'presentIn()'函數中添加'alertViewController.modalPresentationStyle = .overCurrentContext'解決了這個問題。 – Rob