Tüm cevapları okuyun ve doğru çözümü göremiyorum. Bunu yapmanın doğru yolu, sunulan VC temsilcisi için özel UIViewControllerAnimatedTransitioning yapmaktır.
Bu nedenle, daha fazla adım atılacağını varsayar, ancak sonuç daha özelleştirilebilir ve sunulan görünümle birlikte görünümden hareket etmek gibi bazı yan etkileri yoktur.
Bu nedenle, bazı ViewController'ınız olduğunu ve sunum yapmak için bir yöntem olduğunu varsayalım.
var presentTransition: UIViewControllerAnimatedTransitioning?
var dismissTransition: UIViewControllerAnimatedTransitioning?
func showSettings(animated: Bool) {
let vc = ... create new vc to present
presentTransition = RightToLeftTransition()
dismissTransition = LeftToRightTransition()
vc.modalPresentationStyle = .custom
vc.transitioningDelegate = self
present(vc, animated: true, completion: { [weak self] in
self?.presentTransition = nil
})
}
presentTransition
ve dismissTransition
görünüm denetleyicilerinize animasyon uygulamak için kullanılır. Böylece ViewController'ınızı aşağıdakilere uyarlarsınız UIViewControllerTransitioningDelegate
:
extension ViewController: UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return presentTransition
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return dismissTransition
}
}
Dolayısıyla son adım, özel geçişinizi oluşturmaktır:
class RightToLeftTransition: NSObject, UIViewControllerAnimatedTransitioning {
let duration: TimeInterval = 0.25
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let container = transitionContext.containerView
let toView = transitionContext.view(forKey: .to)!
container.addSubview(toView)
toView.frame.origin = CGPoint(x: toView.frame.width, y: 0)
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: {
toView.frame.origin = CGPoint(x: 0, y: 0)
}, completion: { _ in
transitionContext.completeTransition(true)
})
}
}
class LeftToRightTransition: NSObject, UIViewControllerAnimatedTransitioning {
let duration: TimeInterval = 0.25
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let container = transitionContext.containerView
let fromView = transitionContext.view(forKey: .from)!
container.addSubview(fromView)
fromView.frame.origin = .zero
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseIn, animations: {
fromView.frame.origin = CGPoint(x: fromView.frame.width, y: 0)
}, completion: { _ in
fromView.removeFromSuperview()
transitionContext.completeTransition(true)
})
}
}
Kod görünümü denetleyicisinin mevcut bağlam üzerinden sunulması, bu noktadan itibaren özelleştirmelerinizi yapabilirsiniz. Ayrıca özelin UIPresentationController
de yararlı olduğunu görebilirsiniz (kullanmaya devam edin UIViewControllerTransitioningDelegate
)