簡體   English   中英

UIViewControllerAnimatedTransitioning:在自定義視圖下,屏幕不斷變黑

[英]UIViewControllerAnimatedTransitioning: screen keeps getting black under custom view

我已經找到了許多有關SO(及其他)的相關主題,但仍然找不到解決我問題的方法。 我想使用UIViewControllerTransitioningDelegate在視圖上顯示自定義警報。 所以首先,在我的初始視圖控制器中,這是調用:

@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()之后出現黑屏,如下所示:

在此處輸入圖片說明

謝謝你的幫助...

我認為您需要像這樣設置背景顏色:

self.view.backgroundColor = .clear

這樣可以確保您看到的背景不僅是模態的背景色。

或通過使模式表示樣式overCurrentContext來防止將顯示視圖控制器從屏幕上overCurrentContext

self.modalPresentationStyle = .overCurrentContext

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM