2017-08-16 35 views
0

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

storyboard picture here

有些事,当我轻敲关闭按钮是在外面白色的半视怪异。当我点击该按钮时,会显示一些黑色的工件,并且只有当关闭按钮的位置与图片上的位置相同并且存在白色视图时才会出现。如果我将按钮向上移动并且完全处于白色视图中,则不会出现黑色伪像。另外,当我为这个白色视图设置清晰的颜色时,所有我的viewcontroller都将具有透明背景 - 不会有任何工件。

也许任何人有过这个问题吗?

+0

尝试设置一个破发点中的密切FUNC和检查帧(如果你不熟悉的图标通过去菜单调试>查看调试>捕获视图层次结构)。查看哪个视图变黑。如果这没有帮助,请发布您的视图控制器的演示和解雇流程。 – moni15

回答

1

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

这里的代码演示和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) 
      } 
    } 
}