【问题标题】:Black artifacts when presenting modally UIViewController with white and transparent background以白色和透明背景呈现模态 UIViewController 时出现黑色伪影
【发布时间】:2018-01-24 05:46:41
【问题描述】:

我正在使用 UIModalPresentationCustom 呈现模态 UIViewController,所以我也在使用 UIPresentationController。我正在展示的 ViewController 为背景设置了清晰的颜色(在故事板图片中,我设置了蓝色以显示哪个视图是透明的),但也有一个白色的 UIView。

当我点击处于半白色视图外的关闭按钮时,有些奇怪。当我点击该按钮时,会显示一些黑色伪影,并且仅当关闭按钮具有图片上的位置并且有白色视图时才会发生。如果我向上移动按钮并且它完全位于白色视图上,则不会出现黑色伪影。此外,当我为这个白色视图设置清晰的颜色时,我的所有视图控制器都将具有透明背景 - 不会有伪影。

也许以前有人遇到过这个问题?

【问题讨论】:

  • 尝试在关闭函数中设置断点并检查帧(如果您不熟悉图标,请通过菜单调试 > 视图调试 > 捕获视图层次结构)。看看哪个视图变黑了。如果这没有帮助,请发布您的视图控制器的演示和关闭过程。

标签: ios swift uikit


【解决方案1】:

@moni15,我之前试图调试视图层次结构,但没有可见的黑色伪影,当我打开视图框架时,一切看起来都很好。这看起来像一些渲染问题,或者可能是 iOS 错误?

这是 Presentation 和 Dimiss 转换的代码:

    class TransitionPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning {

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

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
        let containerView = transitionContext.containerView

        let animationDuration = self .transitionDuration(using: transitionContext)

        toViewController.view.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
        toViewController.view.layer.shadowColor = UIColor.black.cgColor
        toViewController.view.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
        toViewController.view.layer.shadowOpacity = 0.3
        toViewController.view.layer.cornerRadius = 4.0
        toViewController.view.clipsToBounds = true

        containerView.addSubview(toViewController.view)

        UIView.animate(withDuration: animationDuration, animations: { () -> Void in
            toViewController.view.transform = CGAffineTransform.identity
        }, completion: { (finished) -> Void in
            transitionContext.completeTransition(finished)
        })
    }
}

class TransitionDismissAnimator : NSObject, UIViewControllerAnimatedTransitioning {

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

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

        UIView.animate(withDuration: animationDuration, animations: { () -> Void in
            fromViewController.view.alpha = 0.0
            fromViewController.view.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
        }) { (finished) -> Void in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}

已解决!问题出在 TransitionPresentationAnimator 类和 CGAffineTransform 做错了什么。现在我不再使用它了。如果有人遇到类似问题,我将粘贴我的代码:

class TransitionPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning {

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

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        to = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
            from = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
            let container = transitionContext.containerView
            container.addSubview(to.view)

            to.view.bounds.origin = CGPoint(x: 0, y: -from.view.bounds.size.height)
            UIView.animate(withDuration: 0.6, delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0, options: [.curveEaseOut], animations: {
                self.to.view.bounds = self.from.view.bounds
            }) { (completed) in
                transitionContext.completeTransition(completed)
            }
    }
}

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多