显示图像并将其链接到声音

Posted

技术标签:

【中文标题】显示图像并将其链接到声音【英文标题】:show an image and link it to a sound 【发布时间】:2017-06-17 10:22:33 【问题描述】:

我正在尝试为一些孩子制作一个简单的应用程序。我想展示一张照片并将该照片链接到声音。

当孩子点击“播放声音”时,它应该播放代表图像的音频。

到目前为止,我只展示了已放入 Assets.xcassets 中的图像,但我的问题是.. 如何将这些照片链接到一些音频文件并通过单击“播放声音”来播放它们

这是我在 ViewController.swift 中的代码:

 @IBOutlet weak var viewImage: UIImageView!
var images: [UIImage] = [
    UIImage(named: "photo1.png")!,
    UIImage(named: "photo2.png")!,
    UIImage(named: "photo3.png")!,
    UIImage(named: "photo4.png")!,
    UIImage(named: "photo5.png")!,
    UIImage(named: "photo6.png")!,
    UIImage(named: "photo7.png")!,
    UIImage(named: "photo8.png")!
]
var currentImagesIndex = 0

@IBAction func nextImage(_ sender: Any) 
    currentImagesIndex += 1
    let numberOfImages = images.count
    let nextImagesIndex = currentImagesIndex % numberOfImages

    viewImage.image = images[nextImagesIndex]


到目前为止,当我单击下一张照片时,它会向我显示一张新照片,并且工作正常。我现在要做的就是将“photo1-8”链接到音频并播放它。

我将不胜感激任何形式的帮助, 拉度

【问题讨论】:

在 imageview 上添加 UITapGestureRecognizer 【参考方案1】:

您应该首先将所有声音文件添加到您的项目中。我假设你知道如何做到这一点。添加文件后,您的项目导航器应如下所示:

为方便起见,我将你的8个声音文件称为sound1.mp3sound2.mp3sound3.mp3...sound8.mp3

在名为soundFiles的类中创建一个属性:

let soundFiles: [String] = [
    "sound1",
    "sound2",
    "sound3",
    "sound4",
    "sound5",
    "sound6",
    "sound7",
    "sound8"
]

同时创建一个名为player 的属性来播放声音:

var player: AVAudioPlayer!

在“播放声音”按钮的@IBAction中,获取声音文件的文件路径并初始化播放器:

let numberOfImages = images.count
let nextImagesIndex = currentImagesIndex % numberOfImages
let soundFilePath = Bundle.main.url(forResource: soundFiles[nextImagesIndex], withExtension: ".mp3")!
player = try! AVAudioPlayer(contentsOf: soundFilePath)

然后你可以通过连续调用prepareToPlay()play()来播放声音:

player.prepareToPlay()
player.play()

【讨论】:

您好,感谢您帮助我。我有一个小错误..当我尝试运行该应用程序时,它显示此错误:“使用未解析的标识符'nextImageIndex'。我该如何解决它?抱歉:) @RaduRaducu 哎呀!我的意思是currentImageIndex。您似乎还没有很好地理解为什么会发生这些错误。我建议你先了解更多关于 swift 的知识。 我知道我有很多不足......但我正在努力学习:)。对不起打扰你了。在修复了“currentImageIndex”问题之后,现在我有了另一个问题……我真的不知道如何解决它。在应用程序中单击 8 次“下一步按钮”后,它会在控制台中崩溃并显示以下消息:“致命错误:索引超出范围”。我尝试返回但结果为 0 :)...崩溃后,我再次运行应用程序..第一次单击下一步按钮...它崩溃并将我发送到“viewImage.image = image [ nextImageIndex]".. 谢谢 @RaduRaducu 好的,我没有仔细阅读您的代码。 currentImageIndex 会越界。请参阅使用nextImageIndex 的已编辑答案。【参考方案2】:
    通过在顶部添加此行来导入 AV Foundation:import AVFoundationMP3、WAV文件拖入项目主目录 在“添加到目标”中选中“Copy items if needed”和应用名称

    使用此代码播放声音

    func playSound() 
    
     var btnSound: AVAudioPlayer!
    
     if let audioFileURL = Bundle.main.url(forResource: "fileName", withExtension: ".wav") 
        do
            try btnSound = AVAudioPlayer(contentsOf: audioFileURL)
            btnSound.prepareToPlay()
            btnSound.play()
         catch let err as NSError 
            print(err.debugDescription)
        
     
    
    
    
    //call playSound function inside nextImage method
    

xCode 8.3.2

中使用 Swift 3.1 测试

【讨论】:

感谢您的快速回复。我试过你的代码,但我收到一个错误“使用未解析的标识符'btn Sound'。

以上是关于显示图像并将其链接到声音的主要内容,如果未能解决你的问题,请参考以下文章

在 ImageView 中显示图像并将其保存到 Android 上的内部存储中

从相机捕获图像并将其显示在android的另一个活动中

如何单击图像按钮并将其显示在 Android Studio 的新页面中?

如何裁剪 UIScrollView 中显示的 UIImageView 部分并将其保存到 UIImage 变量?

通过 AsyncTask 下载图像并将其显示在 Imageview 中而不存储在 sdcard 中

通过AsyncTask下载图像并将其显示在Imageview中而不存储在SD卡中