Ich arbeite an einer App (Piano), die eine Reihe von Tasten hat, die jeweils eine andere mp3 hat. Der Bildschirm zeigt 12 Tasten (Klaviertasten) und ich möchte, dass der Benutzer in der Lage ist, einen einzelnen Ton zu spielen oder über ein Paar zu wischen, um mehrere zu hören. Genau wie ein echtes Klavier. Ich habe schon viele Apps gesehen, aber meiner scheint ein Problem zu haben, wenn der Benutzer schnell über mehrere Tasten gleitet. Mit derselben Geschwindigkeit spielen andere Apps alle Noten, aber meine werden einige überspringen. Danke für jede Hilfe! Dies wird den Unterschied in meiner App machen!Sliding über Klaviertasten (swift/iOS)
Ein paar schnelle Notizen zu diesem Code:
-Ich habe nur die nackten hier Knochen um Platz zu sparen
-I nur 6 Audio-Player zeigte, aber Sie bekommen die Idee
-das locationInNote1 ... Note2 ... Note3 zeigt nur 6 hier, um Platz zu sparen, aber Sie erhalten die Idee
- "Note1" in der Schaltfläche Aktion ist eine Zeichenfolge, die geändert werden kann, wenn der Benutzer verschiedene Oktaven zur Wiedergabe auswählt von, aber es ist nur ein #, so die Audio-Dateien ut imately sind 1.mp3, 2.mp3, etc.
-die Schaltfläche Aktion PlayNote1 ist das gleiche wie die anderen Tastenaktionen, so dass ich sie nicht alle dort wiederholen.
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)
FYI - Verwenden Sie 'if/else' in Ihrer' playNote' Methode, da ein Punkt immer nur in einer Schaltfläche sein kann. – rmaddy
Warum laden Sie jedes MP3 aus dem Bundle und erstellen jedes Mal einen neuen Audioplayer, wenn eine Note abgespielt werden soll? Das ist sehr ineffizient. – rmaddy
Warum haben Sie 6 doppelte 'playNoteX' Methoden? Einfach eins und die Notennummer übergeben, damit auf die richtige mp3-Datei zugegriffen werden kann. – rmaddy