Я совершенно новичок в iOS, и я работаю над приложением, которое имеет много кадровых анимаций. Все идет хорошо, пока я не попытаюсь сделать свою последнюю анимацию способом, который я публикую ниже. Этот метод является делегатом, назначенным синтезатору встроенного текста в речь
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
if spoken == 0{
spoken += 1
print("speaking finished")
self.ImageView.stopAnimating()
self.ImageView.image = self.circleImages.last
self.ImageView.animationImages = self.circleImages
self.ImageView.animationDuration = 1.5
self.ImageView.animationRepeatCount = 0
self.ImageView.startAnimating()
do{
try self.recordAndRecognizeSpeech()
}catch let error{
print(error)
}
}else if spoken == 1{
//animation 1
spoken += 1
//animation 1
self.ImageView.image = self.comingOutImages.first
self.ImageView.animationImages = self.comingOutImages
self.ImageView.animationDuration = 6.0
self.ImageView.animationRepeatCount = 1
self.ImageView.startAnimating()
print(String(self.comingOutImages.count) + " #of images")
print("should have animated go in" + String(spoken))
}else{
print("done")
}
}
Первый блок метода, в котором говорится == 0, эта анимация работает нормально, но когда она попадает в блок, где говорится = = 1, что анимация не воспроизводится, она устанавливает изображение, но не воспроизводит анимацию. Я искал вечно, я пытался запустить его в основном потоке и кучу других вещей.
РЕДАКТИРОВАТЬ:
У меня есть этот метод, который является анимация прямо перед анимацией выше, которая не будет воспроизводиться, если не установить animationRepeatCount в 0, и если я установлю эту анимацию в любое значение, кроме 0, то анимация выше воспроизводится, но затем эта анимация не воспроизводится. В этом методе у меня есть счетчик повторений анимации до 16, а затем вышеприведенная анимация работает, но эта не работает Мне бы хотелось, чтобы эта анимация была настроена на repeatCount 0, и когда речь идет о том, чтобы запустить вышеприведенную процедуру для repeatCount 1. Я очень плохо знаком с iOS, и есть кое-что, что я просто не понимаю.
func handleSend(){
if Thread.isMainThread{
print("send on main thread")
}else{
print("send not on main thread")
}
do{
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
}catch{}
//UIView.animate(withDuration: 4.0, animations: {
//animation 2
print("second animation")
self.imageView.stopAnimating()
self.imageView.image = self.talkingImages.last
self.imageView.animationImages = self.talkingImages
self.imageView.animationDuration = 0.25
self.imageView.animationRepeatCount = 16
self.imageView.startAnimating()
print("should have animated")
//})
let utterance = AVSpeechUtterance(string: self.finalString)
//utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
//utterance.rate = 0.1
self.synthesizer.speak(utterance)
}
РЕДАКТИРОВАТЬ2: я публикую весь viewController только для справки, и он не позволит мне, потому что он превышает ограничение по количеству символов, но плохо опубликовать все анимации и объяснить поток
это метод переопределенного касания для прикосновения к представлению изображения, это также место, где начинается первая анимация.
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
timesRubbed += 1
if timesRubbed == 1{
player?.stop()
//Toast(text: keepRubbing).show()
self.view.makeToast(keepRubbing, duration: 3.0, position: .top)
}
if timesRubbed == 2{
player?.stop()
//Toast(text: keepAgain).show()
self.view.makeToast(keepAgain, duration: 3.0, position: .top)
}
if timesRubbed == 3{
player?.stop()
timesRubbed += 1
playSoundComeOut()
CATransaction.begin()
CATransaction.setCompletionBlock {
print("after animation 1")
DispatchQueue.main.async {
CATransaction.begin()
CATransaction.setCompletionBlock{
print("after circle animation")
//UIView.animate(withDuration: 3.0, animations: {
//animation 2
print("second animation")
//self.imageView.stopAnimating()
self.imageView.image = self.talkingImages.last
self.imageView.animationImages = self.talkingImages
self.imageView.animationDuration = 0.25
self.imageView.animationRepeatCount = 0
self.imageView.startAnimating()
print("should have animated")
//})
let utterance = AVSpeechUtterance(string: self.greeting)
//utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
//utterance.rate = 0.1
self.synthesizer.speak(utterance)
//CATransaction.commit()
}
//UIView.animate(withDuration: 3.0, animations: {
//animation 2
print("second animation")
self.imageView.stopAnimating()
self.imageView.image = self.circleImages.last
self.imageView.animationImages = self.circleImages
self.imageView.animationDuration = 1.5
self.imageView.animationRepeatCount = 2
self.imageView.startAnimating()
print("should have animated")
//})
CATransaction.commit()
}
}
//UIView.animate(withDuration: 6.0, animations: {
//animation 1
if self.imageView.isFocused{
print("imageview is focused")
}else{
print("not focused")
}
self.imageView.image = self.comingOutImages.last
self.imageView.animationImages = self.comingOutImages
self.imageView.animationDuration = 6.0
self.imageView.animationRepeatCount = 1
self.imageView.startAnimating()
// })
CATransaction.commit() }
}
, затем в конце этой последовательности анимации он переходит к методу speechSynthesizer, где spoken == 0
затем он использует метод handleSend()
, опубликованный выше, а затем возвращается к методу speechSynthesizer, где он говорил == 1
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать