прервать анимацию касанием с помощью UIViewPropertyAnimator

Я пытаюсь управлять анимацией касанием экрана

когда я касаюсь экрана, альфа вида становится равной 0

но если коснуться снова, пока альфа меняется на 0

затем альфа снова становится 1 (прерывание анимации, которое делает альфа-значение 0)

поэтому я пишу

class MainViewController: UIViewController {

var showAnimation:UIViewPropertyAnimator!
var hideAnimation:UIViewPropertyAnimator!
var isHiding:Bool = false
override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .blue

    showAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations: {
        self.view.alpha = 1
    })
    hideAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations: {
        self.view.alpha = 0
    })
    showAnimation.isUserInteractionEnabled = true
    showAnimation.isInterruptible = true
    hideAnimation.isUserInteractionEnabled = true
    hideAnimation.isInterruptible = true
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    isHiding = !isHiding
    if self.isHiding {
        self.hideAnimation.startAnimation()
        self.showAnimation.stopAnimation(true)
    }else{
        self.hideAnimation.stopAnimation(true)
        self.showAnimation.startAnimation()
    }
}
}

но touchesBegan вызывается только после завершения блоков анимации

Как я могу решить эту проблему


person PrepareFor    schedule 11.05.2018    source источник
comment
Вы пробовали использовать UITapGestureRecognizer вместо touchesBegan?   -  person Dejan Skledar    schedule 11.05.2018
comment
это тоже самое! но если не установить альфа на 0, я думаю, что это работает, я установил альфа на 0,1   -  person PrepareFor    schedule 11.05.2018


Ответы (1)


Здесь нужно знать 2 вещи:

  • Вам не нужно устанавливать isUserInteractionEnabled и isInterruptible в значение true после инициализации UIViewPropertyAnimator, потому что их значения по умолчанию равны true.
  • После вызова stopAnimation UIViewPropertyAnimator станет недействительным, и вы не сможете вызвать startAnimation, чтобы он снова заработал. Поэтому вам нужно повторно инициализировать showAnimation и hideAnimation после их остановки.

Чтобы решить проблему, попробуйте мой код ниже.

class MainViewController: UIViewController {

  var showAnimation:UIViewPropertyAnimator!
  var hideAnimation:UIViewPropertyAnimator!
  var isHiding:Bool = false
  override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .blue
  }

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    isHiding = !isHiding
    if self.isHiding {
      self.showAnimation?.stopAnimation(true)

      self.hideAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations: {
        self.view.alpha = 0.1
      })
      self.hideAnimation.startAnimation()
    }else{
      self.hideAnimation?.stopAnimation(true)

      self.showAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations: {
        self.view.alpha = 1
      })
      self.showAnimation.startAnimation()
    }
  }
}
person trungduc    schedule 11.05.2018
comment
Он работает отлично!! Большое спасибо!! Я не понял, что я должен инициализировать объекты анимации - person PrepareFor; 13.05.2018