2017-12-31 20 views
1

Ich möchte meine ViewController zu einem alten ViewController mit Animation zu entlassen. Aber wenn ich CATransition verwende, blendet mein viewController und alter viewController schwarz aus. Kann ich irgendwie dafür sorgen, dass es nicht verblasst?Verstecken Sie eine schwarze Fade wenn self.dismiss mit CATransion

let transition = CATransition() 
transition.duration = 1.0 
transition.type = kCATransitionPush 
transition.subtype = kCATransitionFromLeft 
view.window!.layer.add(transition, forKey: kCATransition) 
self.dismiss(animated: false, completion: nil) 
+0

was meinst du für 'fades black'? Ich habe einen solchen Code ausprobiert, und ich konnte nichts dergleichen bemerken –

Antwort

0

Lesen Sie mehr über Übergang here und versuchen verfügbaren Parameter zu ändern gewünschten Effekte zu erzielen.

Gute undokumentierte Informationen über den Übergang available here.

Falls Sie eine gute Lösung wollen - Sie sollten benutzerdefinierte Übergang für Ihren Bildschirm vorbereiten - Aktivieren Sie diese WWDC video

Alternative schnell (aber nicht die beste) Lösung manuelle Steuerung der Präsentation sein kann/in Ihre Viewcontroller entlassen:

import UIKit 

final class AnimatableViewController: UIViewController { 

    private var panStartLocation:CGPoint = CGPoint.zero 
    private var panPrevLocation:CGPoint = CGPoint.zero 

    var onClose:(()->())? 

    // MARK: - LifeCycle 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     openAnimation() 
    } 

    // MARK: - IBAction 

    @objc private func closeButtonAction(_ sender: UIButton) { 
     dismiss(animated: true, completion: { [weak self] in 
      self?.onClose?() 
     }) 
    } 

    // MARK: - Gestures 

    @IBAction private func didDetectPan(_ sender: UIPanGestureRecognizer) { 
     switch sender.state { 
      case .began: 
       panStartLocation = sender.location(in: navigationController?.view) 
       panPrevLocation = panStartLocation 
      case .cancelled, .ended: 
       finishAnimation() 
      case .changed: 
       let newPoint:CGPoint = sender.location(in: navigationController?.view) 
       let dy:CGFloat = newPoint.y - panPrevLocation.y 
       var newPosition:CGPoint = view.center 

       if (newPoint.y - panStartLocation.y > 0) { 
        newPosition.y += dy 
       } else { 
        newPosition.y = self.view.bounds.height/2 
       } 
       view.center = newPosition 
       panPrevLocation = newPoint 
      default: 
       break 
     } 
    } 

    //MARK: Animation 

    private func finishAnimation() { 
     let center:CGPoint = view.center 
     if (center.y > self.view.bounds.height/2 * 1.35) { 
      closeAnimation() 
     } else { 
      openAnimation() 
     } 
    } 

    private func closeAnimation() { 
     let fullAnimTime:CGFloat = 0.5 
     let endPoint:CGPoint = CGPoint(x:view.center.x, y:view.bounds.height/2 * 3) 
     let animTime:CGFloat = ((endPoint.y - view.center.y)/self.view.bounds.height) * fullAnimTime 

     UIView.animate(withDuration: TimeInterval(animTime), animations: { [weak self] in 
      self?.view.center = endPoint 
      }, completion: { [weak self] _ in 
       self?.dismiss(animated: false, completion: { 
        self?.onClose?() 
       }) 
     }) 
    } 

    private func openAnimation() { 
     let fullAnimTime:CGFloat = 0.5 
     let endPoint:CGPoint = CGPoint(x: view.center.x, y:self.view.bounds.height/2) 
     let animTime:CGFloat = ((view.center.y - endPoint.y)/(self.view.bounds.height/2)) * fullAnimTime 
     UIView.animate(withDuration: TimeInterval(animTime)) { [weak self] in 
      self?.view.center = endPoint 
     } 
    } 
} 

extension AnimatableViewController: UIGestureRecognizerDelegate { 
    // MARK: - UIGestureRecognizerDelegate 

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     if gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is UIPanGestureRecognizer { 
      return false 
     } 
     return true 
    } 
} 

In Storyboard vergessen Sie nicht, wie Sie segue Parameter einstellen:

enter image description here

Und panGesture zu Ihrer Stammansicht oder zusätzliche Pfanne Gesture fügt die meisten Blick nach oben, die für die Pfanne verwendet werden können - in meinem Fall - ich fügen Sie einfach Pfanne RootView:

enter image description here

Ergebnis:

enter image description here

Verwandte Themen