İçeriğe geç

Custom UIStoryboardSegue oluşturmak

Merhabalar bu yazımda iOS ile Custom olarak UIStoryboardSegue oluşturmayı göstereceğim. Böylelikle ViewController arası geçişlerde custom olarak animasyonlar yazabilir ve yönetebilirsiniz.

iOS ile transition işleminin nasıl yürüdüğünü aşağıdaki görselde bakalım ve daha sonrasında örneği inceleyelim.

Custom segue işlemini storyboard üzerinden veya programmatically olarak ekleyebilirsiniz.

UIViewControllerAnimatedTransitioning sınıfından türeterek yazdığımız sınıflar ile transition yazabiliriz.

class ScalePresenterAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 1.0
    }
    
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let toViewController = transitionContext.viewController(forKey: .to)!
        let toView = transitionContext.view(forKey: .to)
        
        if let toView = toView { transitionContext.containerView.addSubview(toView) }
        
        let duration = transitionDuration(using: transitionContext)
        let finalFrame = transitionContext.finalFrame(for: toViewController)
        
        toView?.frame = finalFrame
        toView?.alpha = 0
        toView?.layoutIfNeeded()
        
        UIView.animate(withDuration: duration, animations: {
            toView?.alpha = 1
        }) { (_) in
            transitionContext.completeTransition(true)
        }
    }
}

Buradaki context ile ilk vc, sonraki vc lere erişip duruma göre farklı işlemler gerçekleştirebiliriz. Sayfamızı kapsayan containerView nesnesininde boyutsal olarak oynamalar yaparak dialog şeklinde görüntülemeler yaratabilirsiniz.

Yazmış olduğumuz bu presenter sınıfını ilk ViewController sınıfına ekliyoruz.

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        performSegue(withIdentifier: "custom", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "custom", let destination = segue.destination as? DetailViewController {
            destination.transitioningDelegate = self
            destination.modalPresentationStyle = .custom
            destination.modalPresentationCapturesStatusBarAppearance = true
        }
    }
}

extension ViewController: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return ScalePresenterAnimator()
    }
}

Dilersek direkt olarak bir segue sınıfı yaratıp, storyboard üzerinden segue ekleyebiliriz.

class AlphaSegue: UIStoryboardSegue {
    override func perform() {
        destination.transitioningDelegate = self
        super.perform()
    }
}

extension AlphaSegue: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return ScalePresenterAnimator()
    }
}

 

 

 

 

Tarih:iOS

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Copyright © 2020 Kenan Atmaca