Swift:音频播放完毕后如何设置代码执行?

问题描述

我想创建一个函数,如果UIbutton的音频播放完毕,该按钮将消失。

有没有可以在音频播放完毕后设置代码执行的功能?

我尝试设置队列以使UIbutton消失

DispatchQueue.main.asyncAfter(deadline: .now() + (audio duration)) {sender.alpha = 0} 

但是我发现当我使用暂停按钮(我为停止音频而制作的按钮)时无法取消它。 在中途暂停音频时,DispatchQueue仍使UIbutton消失。

所以我正在寻找一个新的解决方案。

1

这是我的代码

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var player: AVAudioPlayer!
    
    @IBOutlet var buttons: [UIButton]!
    
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var pause: UIButton!
    
    @IBOutlet weak var mainStackView: UIStackView!
    
    @IBOutlet weak var pirateBoy: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        pause.alpha = 0
        
    }
    
    //multiplication table action button
    @IBAction func buttonPressed(_ sender: UIButton) {
        
        playSound(soundName: sender.currentTitle!)
        
        pause.alpha = 1 
        
    }
    
    //pause action button
    @IBAction func pausePressed(_ sender: UIButton) {
        
        player.stop()
        
        pause.alpha = 0
        
    }
    
    func playSound(soundName: String) {
        let url = Bundle.main.url(forResource: soundName,withExtension: "m4a")
        player = try! AVAudioPlayer(contentsOf: url!)
        player.play()
        
    }
    
    
}

解决方法

您可以使用 AVAudioPlayerDelegate's 方法 audioPlayerDidFinishPlaying(_:successfully:)

在声音播放完毕时调用。

class ViewController: UIViewController,AVAudioPlayerDelegate {
    //rest of the code...
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer,successfully flag: Bool) {
        //write your code to hide the button here...
    }
}
 

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...