从UINavigationController移除动画push Unwind?



我有一个简单的push segue从一个视图控制器到另一个。我希望这两个segue (original和unwind)都是非动画的。

在附加的playground中,为segue指定false确实会移除PUSH动画,但不会移除UNWIND动画。

是否有一种方法来删除隐式动画在UNWIND segue?

import UIKit
import PlaygroundSupport
class SourceViewController : UIViewController {
@objc func goDestination(_: Any) {
navigationController?.pushViewController(DestinationViewController(), animated: false)
}

override func loadView() {
view = UIView()
navigationItem.title = "SOURCE"
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(goDestination(_:)))
}
}
class DestinationViewController : UIViewController {
override func loadView() {
view = UIView()
view.backgroundColor = .yellow
navigationItem.title = "DESTINATION"
}
}
PlaygroundPage.current.liveView = UINavigationController(rootViewController: SourceViewController())

这些动画是完全可以从UINavigationControllerDelegate中定制的,看看第一个"支持自定义过渡动画"方法

https://developer.apple.com/documentation/uikit/uinavigationcontrollerdelegate

这里有一些细节https://www.youtube.com/watch?v=jWckfDNUJVY23分钟

我正在greenchecking @glotcha的答案。这让我想到了这个Medium post,这让我想到了这个解决方案(我真的很想要一个渐变过渡):

import UIKit
import PlaygroundSupport
class TransitioningAnimatorInOut: NSObject, UIViewControllerAnimatedTransitioning {
var presenting: Bool = false

func transitionDuration(using: UIViewControllerContextTransitioning?) -> TimeInterval { 0.75 }

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromView = transitionContext.view(forKey: .from),
let toView = transitionContext.view(forKey: .to) else { return }
let container = transitionContext.containerView

if presenting {
container.addSubview(toView)
toView.alpha = 0.0
} else {
container.insertSubview(toView, belowSubview: fromView)
}

UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
if self.presenting {
toView.alpha = 1.0
} else {
fromView.alpha = 0.0
}
}) { _ in
let success = !transitionContext.transitionWasCancelled
if !success {
toView.removeFromSuperview()
}
transitionContext.completeTransition(success)
}
}

init(presenting inPresenting: Bool) { presenting = inPresenting }
}
extension UINavigationController: UINavigationControllerDelegate {
public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if operation == .push {
return TransitioningAnimatorInOut(presenting: true)
} else {
return TransitioningAnimatorInOut(presenting: false)
}
}
}
class SourceViewController : UIViewController {
@objc func goDestination(_: Any) {
navigationController?.pushViewController(DestinationViewController(), animated: true)
}

override func loadView() {
view = UIView()
view?.backgroundColor = .yellow
navigationItem.title = "SOURCE"
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(goDestination(_:)))
}
}
class DestinationViewController : UIViewController {
override func loadView() {
view = UIView()
view?.backgroundColor = .red
navigationItem.title = "DESTINATION"
}
}
PlaygroundPage.current.liveView = UINavigationController(rootViewController: SourceViewController())

最新更新