iPadのアプリを制作しています。
ドラッグで移動するViewのy座標に合わせて効果音を1回だけ再生したいです。
yが150のときに「雨の音」
yが300のときは「風の音」など
一応出来たんですが・・
効果音が再生されるときにドラッグに引っかかりが出るというか
再生待ち?になるのか、一瞬(というか再生開始まで)止まってしまい
スムーズに動きません。
再生後はまたスムーズに動くという感じになります。
初回の効果音が特にそうなります。
Xcodeのシミュレーターでは問題無く動くのですが
実機テストでは上記のようになりました。
上手く伝わらないかも知れずで恐縮です、、、
以下、コードです。
ちなみに試してみた事として
効果音を用意したときに
ボリューム0で先に再生しておくと多少マシにはなるようではあるのですが、、
完全に無くなるという事でも無いようです
何か重くなるコードを書いてをしてしまっているんでしょうか。
よろしくお願い致します。
OSX 10.11.6
Xcode 8.2.1
Swift 3
テスト実機 iPad Air2 MNV72J/A iOS10.2
Swift3
1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController { 5 6 //ドラッグ用のView 7 var my:UIView = UIView() 8 9 //雨の音 10 var rain:AVAudioPlayer! = nil 11 //雨の音監視用 12 var rainPlay:Bool = true 13 14 //風の音 15 var wind:AVAudioPlayer! = nil 16 //風の音監視用 17 var windPlay:Bool = true 18 19 //ドラッグのy座標監視 タイマーにて 20 var timer:Timer! 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 //View設置 26 my.frame = CGRect(x:100, y:100, width:200, height:200) 27 my.backgroundColor = UIColor.gray 28 self.view.addSubview(my) 29 30 //効果音用意(雨の音) 31 var url = NSURL.fileURL(withPath: Bundle.main.path(forResource: "rain", ofType: "mp3")!) 32 do{ 33 rain = try AVAudioPlayer(contentsOf: url) 34 }catch{ 35 print("no rain") 36 } 37 rain.prepareToPlay() 38 39 //先にボリューム0で再生してみたテストです 40 //rain.volume = 0 41 //rain.play() 42 //先再生したテストでは多少はましになります。 43 44 //効果音用意(風の音) 45 url = NSURL.fileURL(withPath: Bundle.main.path(forResource: "wind", ofType: "mp3")!) 46 do{ 47 wind = try AVAudioPlayer(contentsOf: url) 48 }catch{ 49 print("no wind") 50 } 51 wind.prepareToPlay() 52 } 53 54 //ドラッグはtouchMovedで 55 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 56 let e = touches.first! 57 let dx = e.location(in:self.view).x - e.previousLocation(in:self.view).x 58 let dy = e.location(in:self.view).y - e.previousLocation(in:self.view).y 59 60 my.frame.origin.x += dx 61 my.frame.origin.y += dy 62 } 63 64 //座標監視はas3で云うenterFrame的なそれで 65 func enterFrame(){ 66 let y = my.frame.origin.y 67 68 //最初の効果音(雨の音) 69 //ここでドラッグが効果音に引っかる?ように一旦止まり、効果音再生後にはまたスムーズにドラッグ操作が出来きます 70 if(y > 150){ 71 if(rainPlay){ 72 rainPlay = false 73 //先再生テスト用 74 //rain.volume = 1 75 rain.play() 76 } 77 }else{rainPlay = true} 78 79 //2番目の効果音(風の音) 80 //初回ほどでは無いですが、やや引っかかりがあったり無かったりです 81 if(y > 300){ 82 if(windPlay){ 83 windPlay = false 84 wind.play() 85 } 86 }else{windPlay = true} 87 88 //以下、、、3番目、4番目と続きます 89 90 } 91 92 override func viewDidAppear(_ animated: Bool) { 93 super.viewDidAppear(true) 94 //タイマー監視 95 timer = Timer.scheduledTimer(timeInterval:0.5,target:self,selector:#selector(self.enterFrame),userInfo:nil,repeats:true) 96 timer.fire() 97 } 98 99 override func viewDidDisappear(_ animated: Bool) { 100 super.viewDidDisappear(true) 101 //タイマー破棄? 102 timer.invalidate() 103 } 104 105 override func didReceiveMemoryWarning() { 106 super.didReceiveMemoryWarning() 107 // Dispose of any resources that can be recreated. 108 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/21 23:27