我正在开发一个应用程序(钢琴),它有一系列按钮,每个按钮都有不同的mp3。屏幕上显示了12个按钮(钢琴键),我希望用户能够播放一个单独的声音或轻扫几下听到多个。就像一架真正的钢琴。我见过很多应用程序这样做,但我的应用程序在用户快速浏览多个按钮时似乎遇到了问题。以同样的速度,其他应用程序将播放所有的笔记,但我的将跳过一些。谢谢你的帮助!这将使我的应用程序的所有不同!
关于此代码的几个简短说明:
-我只是为了节省空间
-我刚展示了6个音频播放器,但你知道
-位置innote1…Note2…Note3只是在这里显示6以节省空间,但是你知道
-按钮操作中的“note1”是一个字符串,当用户选择不同的倍频程进行播放时,可以更改它,但它只是一个#,因此音频文件最终是1.mp3、2.mp3等。
-按钮操作playNote1与其他按钮操作相同,因此我没有在那里重复所有操作。
var audioPlayer = AVAudioPlayer()
var audioPlayer2 = AVAudioPlayer()
var audioPlayer3 = AVAudioPlayer()
var audioPlayer4 = AVAudioPlayer()
var audioPlayer5 = AVAudioPlayer()
var audioPlayer6 = AVAudioPlayer()
func playNote(for locationInView: CGPoint) {
let locationInNote1 = note1Button.convert(locationInView, from: view)
let locationInNote2 = note2Button.convert(locationInView, from: view)
let locationInNote3 = note3Button.convert(locationInView, from: view)
let locationInNote4 = note4Button.convert(locationInView, from: view)
let locationInNote5 = note5Button.convert(locationInView, from: view)
let locationInNote6 = note6Button.convert(locationInView, from: view)
if note1Button.point(inside: locationInButton1, with: nil) {
playNote1(self)
}
if note2Button.point(inside: locationInButton2, with: nil) {
playNote2(self)
}
if note3Button.point(inside: locationInButton3, with: nil) {
playNote3(self)
}
if note4Button.point(inside: locationInButton4, with: nil) {
playNote4(self)
}
if note5Button.point(inside: locationInButton5, with: nil) {
playNote5(self)
}
if note6Button.point(inside: locationInButton6, with: nil) {
playNote6(self)
}
}
@IBAction func playNote1(_ sender: Any) {
let note1mp3 = note1
if let path = Bundle.main.path(forResource: note1mp3, ofType: "mp3") {
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer.prepareToPlay()
audioPlayer.play()
}
catch {
print(error)
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
view.addGestureRecognizer(panGesture)
最佳答案
这里有一种希望的方法:
改进代码
使代码更简单
解决你的问题
在本例中,我将只放置3个音频播放器。
我会尽可能的直截了当。。。
import UIKit
class MyViewController: UIViewController {
var audioPlayer = AVAudioPlayer()
var audioPlayer2 = AVAudioPlayer()
var audioPlayer3 = AVAudioPlayer()
@IBOutlet var notes: [UIButton]!
let references = [note1, note2, note3]
@IBAction func notePressed(_ sender: UIButton) {
play(note: notes.index(of: sender)! + 1)
}
func play(note: Int) {
let reference = references[note - 1]
if let path = Bundle.main.path(forResource: reference, ofType: "mp3") {
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer.prepareToPlay()
audioPlayer.play()
}
catch {
print(error)
}
}
}
}
解释
@IBOutlet变量注释:[UIButton]!
这是一个按钮的出口集合。为此,请连接一个按钮,但选择Outlet Collection而不是仅选择Outlet。确保按顺序(1、2、3)连接每个按钮,否则会断开!
设references=[注1、注2、注3]
这是对每个注释文件的引用数组。这样我们只需要一个函数来播放一个音符。
@IBAction func notePressed(u:sender:)
此函数由按钮调用。对于每个按钮,连接Touch Drag Enter(用于沿便笺滑动)和Touch Down操作。如果你想的话,你可以加上其他的。函数比较sender和notes Outlet集合,找出按了哪个音符,然后将其传递给func play(:note:)函数。
函数播放(:注意:)
此函数获取注释编号,并播放相应的文件。它与原来的几乎相同,但它没有固定的注释,而是有一个由@IBAction func notePressed(:sender:)方法传递的注释。
希望这对你有帮助,祝你好运!
关于ios - 跨钢琴键滑动(swift/iOS),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45891772/