2016-12-22 3 views
1

Я пытаюсь анимировать UICollectionViewController над оригиналом UIViewController с оригиналом UIViewController размытым как фон, однако каждый раз, когда анимация заканчивается, я могу видеть ясно из-за размытого представления о том, что исходный контроллер представления отклонен, что я делаю, чтобы избежать отклонения первого UIViewController?Как модерировать представление контроллера, не отпуская контроллер родительского/первого представления

код в первом контроллере представления, чтобы представить второе:

let VC = storyboard?.instantiateViewController(withIdentifier: "PopoverCollectionVC") as! PopoverCollectionVC 
VC.setDataSource(with: .calcDPSItems) 
VC.collectionView?.backgroundColor = UIColor.clear 
VC.transitioningDelegate = self 
self.present(VC, animated: true, completion: nil) 

код в объекте аниматора для пользовательской анимации:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
    let containerView = transitionContext.containerView 
    let fromView = transitionContext.view(forKey: .from)! 
    let toView = transitionContext.view(forKey: .to)! 

    if presenting { 
     // configure blur 
     effectView.frame = fromView.bounds 
     containerView.addSubview(effectView) 
     // configure collection view 
     toView.frame = CGRect(x: 0, y: fromView.frame.height, width: fromView.frame.width, height: fromView.frame.height/2) 
     containerView.addSubview(toView) 

     UIView.animateKeyframes(withDuration: duration, delay: 0, options: .calculationModeCubic, animations: { 

      UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.6) { 
       toView.center.y = fromView.center.y 
      } 

      UIView.addKeyframe(withRelativeStartTime: 0.1, relativeDuration: 1) { 
       self.effectView.effect = UIBlurEffect(style: .dark) 
      } 

     }) { _ in 
      transitionContext.completeTransition(true) 
     } 
    } else { 

     ... 
    } 
+0

попробовать 'VC.modalPresentationStyle = .overCurrentContext 'before' self.present (VC, animated: true, completion: noil)' – Aladin

+0

@Aladin он разбился на строке: let fromView = transitionContext.view (forKey: .from) !, говоря, что значение равно nil –

+1

'// Получите представление из ViewController, потому что является ошибкой в ​​iOS при использовании некоторых значений modalPresentationStyle, которые заставляют viewForKey возвращать нуль для UITransitionContextFromViewKey // www.splinter.com.au/2015/04/17/ios8-view-controller-transitioning-bug/ let fromVC = transitionContext.viewController (forKey: UITransitionContextViewControllerKey.from) let fromView = fromVC? .view' – Aladin

ответ

0

Вы должны указать, что модальный стиль презентации будет над текущим контекстом:

VC.modalPresentationStyle = .overCurrentContext 

Затем, чтобы получить представленный вид, что нужно

// Get the from view from The ViewController because there is a bug in iOS when 
// using some modalPresentationStyle values 
// that causes the viewForKey to returm nil for UITransitionContextFromViewKey 
// www.splinter.com.au/2015/04/17/ios8-view-controller-transiti‌​oning-bug/ 

let fromVC = transitionContext.viewController(forKey: .from) 
let fromView = fromVC?.view 
0

Вы должны вместо этого сделать снимок из предыдущий вид, затем размыть и использовать его в качестве фона на новом VC.

let oldView = view_to_copy.snapshotView(afterScreenUpdates: false) 

Затем размыть это и добавить в качестве подсмотра в свой контроллер коллекцииViewView.

EDIT:

Просто добавить, если вы используете VC внутри что-то вроде UITabbar или UINavigationController вам может понадобиться снимок этой точки зрения, чтобы обеспечить все UI внутри снимка.

Смежные вопросы