キーボードアプリを作っています。
割りと簡単に作れるのですが、色々と細かい調整が大変だったりします。
キーボードというシステムのコアな部分に近いところの機能なので、安定性や快適さという部分もめちゃくちゃ大事です。もちろん、普通のアプリでも大事なのですが特にキーボードは特に大事です。
Appleのガイドラインでも言及されているように信頼という部分は欠かせません。
なので、ガッツリ取り組める時間がそれほどないということもありますが、1ヶ月ちょっとでゴールが見えてきました。
気をつけている使い勝手の部分で、標準のキーボードにある削除キーを長押しで文字を連続で削除する機能を作るときにちょっと調べたので、その覚書です。
文字を消すときは、
(self.textDocumentProxy as UITextDocumentProxy).deleteBackward()
を呼び出します。
普通に、UILongPressGestureRecognizer
で長押しを取得してこれをUIGestureRecognizerState.Began
中に実行しても、1回しか呼ばれません。
反応時間を短くしても、上手くいかないので何か方法はないかと調べたのですが、どうやらGCDで繰り返せば良さそうだと分かりました。
これは、NSTimerで実装している例ですが、dispatchを使ってやってみます。
ここを参考にしながら、swiftで書いてみたコードです。
var timer : dispatch_source_t?
@IBAction func longPressBackSpace(gesture: UILongPressGestureRecognizer) {
if gesture.state == UIGestureRecognizerState.Began {
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
dispatch_source_set_event_handler(timer, { () -> Void in
(self.textDocumentProxy as UITextDocumentProxy).deleteBackward()
})
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 0),NSEC_PER_SEC / 10 ,0)
dispatch_resume(timer)
}
if gesture.state == UIGestureRecognizerState.Ended {
if timer != nil {
timer = nil;
}
}
}
これで、長押しの時間を調整しておけば、長押しでの連続消去は実装できます。
ちなみに、performSelectorを使う方法もあるようですね。