2017-03-13 2 views
1

Ich arbeite mit ein paar Standard-Sequenzen im Storyboard und sie haben jeweils die gleiche Hintergrundfarbe. Das Problem, das ich habe, ist, dass, wenn der Übergang des Übergangs kurz vor dem Abschluss steht, ein dunkler Schatten wie Hintergrund um den gesamten Rahmen erscheint.Swift segue Übergang Schatten

Image showing transition

Es ist sehr schwach, aber genug, um ein Problem zu verursachen. Ist jemand schon einmal darauf gestoßen?

+0

Ja. Dies ist der Fall, wenn der verlassende View-Controller animiert wird. Mit Push und Present. Nicht wenn man einen Controller modal von unten präsentiert. – user7684436

+0

Aus einer Perspektive ist es so, als würde das Segment eine Schatten-Überlagerung auf den ausgehenden View-Controller für Ästhetik hinzufügen. Nicht sicher, wie Sie es entfernen können. – user7684436

+0

Ja, der Standard-Push/Pop scheint die Ansicht zu verdunkeln, aus der du schiebst, und die, auf die du schießt. Wenn Ihnen das nicht gefällt, müssen Sie wahrscheinlich Ihre eigene benutzerdefinierte Navigations-Controller-Animation definieren. – Rob

Antwort

3

Die Push/Pop-Animationen des Standardnavigationscontrollers verdunkeln die Ansicht, aus der Sie drücken, und die, auf die Sie gerade zugreifen. Wenn Sie das nicht möchten, können Sie den Übergang anpassen, um eine Animation verwenden, die nur gleitet Ansichten in und aus, aber hat kein Dimmen von etwas:

// this is the view controller you are pushing from 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     navigationController?.delegate = self 
    } 

} 

// make the view controller conform to `UINavigationControllerDelegate` 

extension ViewController: UINavigationControllerDelegate { 
    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return PushPopAnimator(operation: operation) 
    } 
} 

// The animation controller 

class PushPopAnimator: NSObject, UIViewControllerAnimatedTransitioning { 
    let operation: UINavigationControllerOperation 

    init(operation: UINavigationControllerOperation) { 
     self.operation = operation 
     super.init() 
    } 

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

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

     let rightTransform = CGAffineTransform(translationX: transitionContext.containerView.bounds.size.width, y: 0) 
     if operation == .push { 
      to.view.transform = rightTransform 
      transitionContext.containerView.addSubview(to.view) 
      UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { 
       to.view.transform = .identity 
      }, completion: { finished in 
       transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
      }) 
     } else if operation == .pop { 
      to.view.transform = .identity 
      transitionContext.containerView.insertSubview(to.view, belowSubview: from.view) 
      UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { 
       from.view.transform = rightTransform 
      }, completion: { finished in 
       from.view.transform = .identity 
       transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
      }) 
     } 
    } 
} 

Informationen zu benutzerdefinierten Übergänge mit Blick Controllern finden WWDC 2013 video Custom Transitions Using View Controllers.

+0

Danke, habe die Animation in deiner Antwort für jeden, der sie benötigt, in den Standard-Modus geändert. Das Segment berücksichtigt keine Navigationsleiste, die ich installiert habe, und verschiebt die Ansichten um 64 Punkte. Gibt es eine Möglichkeit, dies zu lösen? – user7684436

+0

Ja, Sie können die 'animate (withDuration: ...)' Parameter auf das ändern, was Sie wollen. Nachdem ich das gesagt habe, habe ich Ihre Bearbeitung abgelehnt, weil Sie die gesamte 'PushPopAnimator'-Klassendefinition weggeworfen haben, was diese Antwort für Leute, die mit benutzerdefinierten Übergängen nicht vertraut sind, ziemlich schwer verständlich macht. Es ist schwer genug wie es ist ...;) – Rob

+0

Keine Sorgen. Danke für Ihre Hilfe. – user7684436

Verwandte Themen