按下点击手势识别器时 AVAudioPlayer 不播放声音
AVAudioPlayer not playing sound when tap gesture recognizer pressed
我正在创建一个抽认卡应用程序。现在我可以左右滑动浏览每张图片。每个图像都有一个与之关联的声音文件。单击图像时,应播放与其关联的声音文件。截至目前,我可以滑动图像,但是当我点击图像时没有声音播放。下面的代码。
import UIKit
class SecondViewController: UIViewController , UIGestureRecognizerDelegate {
var imageIndex: Int = 0
@IBAction func home(_ sender: Any) {
performSegue(withIdentifier: "home", sender: self)
}
@IBOutlet weak var imgPhoto: UIImageView!
let itemList:[Card] = [
Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator.m4a"),
Card(image: UIImage(named: "apple")!, soundUrl: "Apple.m4a"),
Card(image: UIImage(named: "ball")!, soundUrl: "Ball.m4a")
]
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
imgPhoto.isUserInteractionEnabled = true
imgPhoto.addGestureRecognizer(tapGestureRecognizer)
imgPhoto.image = (itemList[0] ).image
// Do any additional setup after loading the view.
imgPhoto.isUserInteractionEnabled = true
let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:)))
leftSwipe.cancelsTouchesInView = false
let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:)))
rightSwipe.cancelsTouchesInView = false
leftSwipe.direction = .left
rightSwipe.direction = .right
view.addGestureRecognizer(leftSwipe)
view.addGestureRecognizer(rightSwipe)
}
@IBAction func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
print("hhh")
itemList[imageIndex].playSound()
// Your action
}
func Swiped(gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
switch swipeGesture.direction {
case UISwipeGestureRecognizerDirection.right :
print("User swiped right")
// decrease index first
imageIndex -= 1
// check if index is in range
if imageIndex < 0 {
imageIndex = itemList.count - 1
}
imgPhoto.image = itemList[imageIndex].image
case UISwipeGestureRecognizerDirection.left:
print("User swiped Left")
// increase index first
imageIndex += 1
// check if index is in range
if imageIndex > itemList.count - 1 {
imageIndex = 0
}
imgPhoto.image = itemList[imageIndex].image
default:
break //stops the code/codes nothing.
}
}
}
}
然后我有另一个 class,它有 AVAudioPlayer 代码并列出了每个 "Card"(下面的代码)的定义。
import Foundation; import UIKit; import AVFoundation
var player: AVAudioPlayer?
class Card: NSObject
{
var image: UIImage
var soundUrl: String
init(image: UIImage, soundUrl: String) {
self.image = image
self.soundUrl = soundUrl
}
func playSound()
{
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
do
{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
guard let player = player else { return }
player.prepareToPlay()
player.play()
print("play")
} catch let error {
print(error.localizedDescription)
}
}
}
代码编译没有错误,但是没有声音播放。当我点击屏幕时,程序确实打印了一行,但我没有从播放声音功能打印任何行,这一定意味着那部分代码没有被执行。我已经把 var player : AVAudioPlayer?在推荐的 class 之外,但仍然没有运气。我已经添加了 AVAudioPlayer 框架,所以这也不是问题。
我认为问题出在您的分机上,您在
处提供了错误的分机
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a")
这里也不需要扩展名
Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"),
Card(image: UIImage(named: "apple")!, soundUrl: "Apple"),
Card(image: UIImage(named: "ball")!, soundUrl: "Ball")
使用您的文件扩展名更改扩展名 .mp4
您必须删除文件扩展名:
let itemList:[Card] = [
Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"),
Card(image: UIImage(named: "apple")!, soundUrl: "Apple"),
Card(image: UIImage(named: "ball")!, soundUrl: "Ball")
]
因为您在 func playSound()
函数中添加扩展程序作为
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
func playSound() {
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
guard let player = player else { return }
player.prepareToPlay()
player.play()
} catch let error {
print(error.localizedDescription)
}
}
所以它为您的文件名添加了双扩展名,这在您的包中不可用。
注意:确保您的文件名和扩展名与您的包文件名相同。
需要正确导入文件(项目构建阶段 > 复制捆绑资源)。
我认为这个问题是由 NSDefaultRunLoopMode 引起的,其中两个事件同时 运行ning。当我以毫秒为单位更新时间标签时,我遇到了这个 NSDefaultRunLoopMode 的问题。在打开键盘时,它只是在那个时候没有更新。然后解决这个问题我 运行 NSRunLoopCommonModes 中的计时器。我不确定它是否适用于您的情况,但仍然会分享它是否对您有所帮助..
我正在创建一个抽认卡应用程序。现在我可以左右滑动浏览每张图片。每个图像都有一个与之关联的声音文件。单击图像时,应播放与其关联的声音文件。截至目前,我可以滑动图像,但是当我点击图像时没有声音播放。下面的代码。
import UIKit
class SecondViewController: UIViewController , UIGestureRecognizerDelegate {
var imageIndex: Int = 0
@IBAction func home(_ sender: Any) {
performSegue(withIdentifier: "home", sender: self)
}
@IBOutlet weak var imgPhoto: UIImageView!
let itemList:[Card] = [
Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator.m4a"),
Card(image: UIImage(named: "apple")!, soundUrl: "Apple.m4a"),
Card(image: UIImage(named: "ball")!, soundUrl: "Ball.m4a")
]
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
imgPhoto.isUserInteractionEnabled = true
imgPhoto.addGestureRecognizer(tapGestureRecognizer)
imgPhoto.image = (itemList[0] ).image
// Do any additional setup after loading the view.
imgPhoto.isUserInteractionEnabled = true
let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:)))
leftSwipe.cancelsTouchesInView = false
let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:)))
rightSwipe.cancelsTouchesInView = false
leftSwipe.direction = .left
rightSwipe.direction = .right
view.addGestureRecognizer(leftSwipe)
view.addGestureRecognizer(rightSwipe)
}
@IBAction func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
print("hhh")
itemList[imageIndex].playSound()
// Your action
}
func Swiped(gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
switch swipeGesture.direction {
case UISwipeGestureRecognizerDirection.right :
print("User swiped right")
// decrease index first
imageIndex -= 1
// check if index is in range
if imageIndex < 0 {
imageIndex = itemList.count - 1
}
imgPhoto.image = itemList[imageIndex].image
case UISwipeGestureRecognizerDirection.left:
print("User swiped Left")
// increase index first
imageIndex += 1
// check if index is in range
if imageIndex > itemList.count - 1 {
imageIndex = 0
}
imgPhoto.image = itemList[imageIndex].image
default:
break //stops the code/codes nothing.
}
}
}
}
然后我有另一个 class,它有 AVAudioPlayer 代码并列出了每个 "Card"(下面的代码)的定义。
import Foundation; import UIKit; import AVFoundation
var player: AVAudioPlayer?
class Card: NSObject
{
var image: UIImage
var soundUrl: String
init(image: UIImage, soundUrl: String) {
self.image = image
self.soundUrl = soundUrl
}
func playSound()
{
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
do
{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
guard let player = player else { return }
player.prepareToPlay()
player.play()
print("play")
} catch let error {
print(error.localizedDescription)
}
}
}
代码编译没有错误,但是没有声音播放。当我点击屏幕时,程序确实打印了一行,但我没有从播放声音功能打印任何行,这一定意味着那部分代码没有被执行。我已经把 var player : AVAudioPlayer?在推荐的 class 之外,但仍然没有运气。我已经添加了 AVAudioPlayer 框架,所以这也不是问题。
我认为问题出在您的分机上,您在
处提供了错误的分机 guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a")
这里也不需要扩展名
Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"),
Card(image: UIImage(named: "apple")!, soundUrl: "Apple"),
Card(image: UIImage(named: "ball")!, soundUrl: "Ball")
使用您的文件扩展名更改扩展名 .mp4
您必须删除文件扩展名:
let itemList:[Card] = [
Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"),
Card(image: UIImage(named: "apple")!, soundUrl: "Apple"),
Card(image: UIImage(named: "ball")!, soundUrl: "Ball")
]
因为您在 func playSound()
函数中添加扩展程序作为
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
func playSound() {
guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
guard let player = player else { return }
player.prepareToPlay()
player.play()
} catch let error {
print(error.localizedDescription)
}
}
所以它为您的文件名添加了双扩展名,这在您的包中不可用。
注意:确保您的文件名和扩展名与您的包文件名相同。 需要正确导入文件(项目构建阶段 > 复制捆绑资源)。
我认为这个问题是由 NSDefaultRunLoopMode 引起的,其中两个事件同时 运行ning。当我以毫秒为单位更新时间标签时,我遇到了这个 NSDefaultRunLoopMode 的问题。在打开键盘时,它只是在那个时候没有更新。然后解决这个问题我 运行 NSRunLoopCommonModes 中的计时器。我不确定它是否适用于您的情况,但仍然会分享它是否对您有所帮助..