2017-08-16 73 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) 
      } 
    } 
}