2017-01-25 2 views
1

Я относительно новичок в программировании и в настоящее время пытаюсь создать приложение с тремя (если возможно больше) контроллерами представлений. Я сделал учебник (https://www.youtube.com/watch?v=B9sH_VxPPo4&t=505s), в котором я научился анимации между двумя контроллерами представлений после нажатия пользовательской кнопки. Все это отлично работало.Как оживить переход между 3 или более контроллерами представления с кнопками в SWIFT 3?

Но теперь я пытаюсь реализовать другой контроллер вида (ThirdViewController) и вторую кнопку (showThirdVCButton).

Перемещение идеально подходит для обеих кнопок, но анимация возвращается к стандартной анимации.

Это мой код в начальном контроллере представления:

import UIKit 

class ViewController: UIViewController, UIViewControllerTransitioningDelegate { 



@IBOutlet weak var showSecondVCButton: UIButton! 
@IBOutlet weak var showThirdVCButton: UIButton! 


let transition = CircularTransition() 

override func viewDidLoad() { 
    super.viewDidLoad() 


    //I customise my buttons here 
    showSecondVCButton.layer.cornerRadius = showSecondVCButton.frame.size.width/2 
    showThirdVCButton.layer.cornerRadius = showSecondVCButton.frame.size.width/2 
} 

//The destination for each button is declared here and the animation style 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "secondVCSegue" { 
     let secondVC = segue.destination as! SecondViewController 
     secondVC.transitioningDelegate = self 
     secondVC.modalPresentationStyle = .custom 
    } 

    if segue.identifier == "thirdVCSegue" { 
     let thirdVC = segue.destination as! ThirdViewController 
     thirdVC.transitioningDelegate = self 
     thirdVC.modalPresentationStyle = .custom 
    } 

} 


func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

    transition.transitionMode = .present 

    if showSecondVCButton.isTouchInside == true { 
     transition.startingPoint = showSecondVCButton.center 
     transition.circleColor = showSecondVCButton.backgroundColor! 
    } 

    if showThirdVCButton.isTouchInside == true { 

     transition.startingPoint = showThirdVCButton.center 
     transition.circleColor = showThirdVCButton.backgroundColor! 
    } 

    return transition 
} 


func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    transition.transitionMode = .dismiss 

    if showSecondVCButton.isTouchInside == true { 
     transition.startingPoint = showSecondVCButton.center 
     transition.circleColor = showSecondVCButton.backgroundColor! 
    } 

    if showThirdVCButton.isTouchInside == true { 

     transition.startingPoint = showThirdVCButton.center 
     transition.circleColor = showThirdVCButton.backgroundColor! 
    } 

    return transition 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

}

Спасибо за вашу помощь !!

+0

Вы добавили точка останова в коде 'if segue.identifier ==" thirdVCSegue "{...}', чтобы убедиться, что вы туда попали? Ошибка в идентификаторе segue может помешать запуску этого кода ... – Rob

ответ

1

huberdo - Я следовал тому же учебнику, на котором вы смотрели, и мне удалось воспроизвести ошибку, которую вы получаете, когда я скопировал вторую кнопку, а не создавал ее с нуля. Посмотрите и проверьте, что у вас есть только один сеанс для каждой кнопки.

Я думаю, вы можете упростить код. Я всегда предпочел бы настроить действие для кнопок, чтобы вы могли видеть в своем коде, где вещи вызываются - то, что вы сейчас имеете, - это комбинация настройки раскадровки и явного кода.

Если вы используете действия для кнопок, и установить флаг для отслеживания которого кнопка нажата, все становится намного проще

var transition = CircularTransition() 
var startingView = UIView() // this will define the starting point for all transitions 

// 
// 
// explicit actions for the buttons 
@IBAction func cmdOneAction(_ sender: Any) 
{ 
    startingView = sender as! UIView 
    self.performSegue(withIdentifier: "segueShow1", sender: self) 
} 

@IBAction func cmdTwoAction(_ sender: Any) 
{ 
    startingView = sender as! UIView 
    self.performSegue(withIdentifier: "segueShow2", sender: self) 
} 

Упрощенные функции анимации

func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

    transition.transitionMode = .present 
    transition.startingPoint = startingView.center 
    transition.circleColor  = startingView.backgroundColor! 

    return transition 
} 


func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

    transition.transitionMode = .dismiss   
    transition.startingPoint = startingView.center 
    transition.circleColor  = startingView.backgroundColor! 

    return transition 
} 
+0

Благодарим за помощь. Я применил код к вашему предложенному, но анимация по-прежнему установлена ​​на базовую. Передача работает нормально. Может быть что-то в моем 'if segue.identifier ==" "{'? – huberdo

+0

Возможно. Если вы не можете сопоставить идентификатор segue - и вы не будете, если вы будете проверять «» - поэтому он всегда будет запускать версию по умолчанию – Russell

+0

Спасибо Рассел! Приятно, есть такие люди, как вы :) Приятного дня! – huberdo

Смежные вопросы