現在、swift言語を使って、鍵盤アプリを作成しようとしています。
鍵盤なので、
ボタンのようにタップされたかどうかではなく、
触っている状態であれば、音が鳴っている状態としたい為、
「touchesBegan」イベントハンドラを使って、触ったことを判定しています。
鍵盤自体は、UIScrollViewのSubView上にswiftから、追加していて、
Viewの追加および、イベントハンドラを、抜粋すると以下のようになっています。
Swift
1 //---------------------------------------------------------------------------- 2 // 個別キーボード配置 3 //---------------------------------------------------------------------------- 4 func setKey(viewKeyboadBase: UIView, 5 fileNameForNormal: String, 6 leadingMargin :CGFloat, 7 width :CGFloat, 8 height :CGFloat, 9 tag :Int) { 10 11 12 // イメージボタンの生成 13 let btn : UIImageView = UIImageView() 14 // イメージの作成 15 let image :UIImage = UIImage(named: fileNameForNormal)! 16 // イメージ設定 17 btn.image = image 18 // Viewいっぱいに広げる。 19 btn.contentMode = .redraw 20 21 // タグの設定 22 btn.tag = tag 23 24 //UserInteractionを拾う。 25 btn.isUserInteractionEnabled = true 26 27 // 追加 28 viewKeyboadBase.addSubview(btn) 29 30 //---------------------------------------------------------------------------- 31 // 制約を追加 32 //---------------------------------------------------------------------------- 33 // AutoresizingMaskは、OFFにしておく。コードで追加する制約とコンフリクトしないようにする為 34 btn.translatesAutoresizingMaskIntoConstraints = false 35 // 上からの距離 36 btn.topAnchor.constraint(equalTo: viewKeyboadBase.topAnchor, constant: 0.0).isActive = true 37 // 左からの距離 38 btn.leadingAnchor.constraint(equalTo: viewKeyboadBase.leadingAnchor, constant: leadingMargin).isActive = true 39 // 高さ 40 btn.heightAnchor.constraint(equalToConstant: height).isActive = true 41 // 横幅 42 btn.widthAnchor.constraint(equalToConstant: width).isActive = true 43 44 } 45 //---------------------------------------------------------------------------- 46 // タッチを検知 47 //---------------------------------------------------------------------------- 48 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 49 50 for touch: UITouch in touches { 51 if let view = touch.view { 52 let tag = view.tag 53 54 // tagに応じた発音処理 55 56 } 57 } 58 59 } 60
通常のボタンにタップするように、鍵盤にさわった場合
(さわってすぐ離す場合)、
触ってからtouchesBeganが呼ばれるまでの時間は、全く気にならないレベルなのですが、
長押しになる押し方をした場合、
触ってから「touchesBegan」が反応するまでに0.5秒くらいかかることがあります。
(補足1)実機を用いた時に発生します。
(補足2)コードでは省略しましたが、鍵盤は、全部で61あります。
(補足3)発生頻度はマチマチで、法則性が掴めまていません。
UIScrollView上にのっており、
長押しがscroll操作と区別がつかず、
その分、「touchesBegan」が反応するまでに時間がかかるのでしょうか?
長押しになる押し方をした場合も、
触った瞬間を素早く検知するやり方がありますでしょうか?
どなたかご教授願います。
あなたの回答
tips
プレビュー