問題
UIViewをアニメーションさせると、UIViewに配置したボタンなどのタッチイベントが認識されない。
例
- ポップアップを表示して、一定時間後にアニメーションしながら消す(スナックバー)
解決方法
- UIView.animateのdelayを指定する場合、animateを実行した時点からタッチイベントが発火しなくなるため、TimerでDelayする
- アニメーション開始まではイベントの捕捉が可能
- optionsにUIView.AnimationOptions.allowUserInteractionを指定する
Timer.scheduledTimer(timeInterval: SnackBarView.Delay, target: self, selector: #selector(timerUpdate), userInfo: nil, repeats: false)
@objc private func timerUpdate() {
UIView.animate(withDuration: SnackBarView.FadeInOutDurationInSeconds,
delay: 0,
options: [SnackBarView.Transition, .allowUserInteraction],
animations: {
self.alpha = 0
self.center.y += 100
},
completion: { _ in self.removeFromSuperview() })
}
参考