読者です 読者をやめる 読者になる 読者になる

(UITextViewの)キーボードに「閉じる」ボタンを追加する

iOS Swift

大したネタではないけど、iOSのUITextViewで編集可能に場合に表示されるキーボードに「閉じる」ボタンを追加する方法のメモ。

StoryBoardでkeybordの設定項目をDismiss intractielyに設定しておけばテキスト表示エリアをした方向にスクロールすれば勝手に キーボードは非表示になる。…のだけれど、これは知らないとどうしていいかわからないのではないかと思う。

f:id:atuyosi:20160216002106p:plain

で、ボタンの追加方法を知るべくGoogle先生にお伺いをたてる…。

Swiftでキーボードにボタンを追加する - Qiita

とか、

swiftでuitextviewに完了ボタンを設置してキーボードを閉じる方法 - とりあえずphpとか

この辺がヒットする。

が、なんかめんどくさいのでもっと楽な方法ないのって探すとObjective-Cのケースが見つかる。

mkfactory.hatenadiary.jp

どうやらおおもとのネタは下記のページだそうで。

キーボードを閉じるためのボタンを追加する « sabitori works

UIViewでやるかUIToolBarでやるかは好みの問題だけど、よほど見た目に凝らない限りはUIToolBarでいいかと思う。

UIToolBarを使う方がスマートそうだね、ってことでSwift2でやってみる。

すでにUITextViewはStoryBoardでセットしてあるものとして、デリゲートを追加、Outletを追加。

class ViewController: UIViewController, UITextFieldDelegate {
   @IBOutlet weak var myTextView: UITextView!
(略)

対象のViewControllerの、viewDidLoadに下記を追加。inputAccessoryViewがポイント。

        // 仮のサイズでツールバー生成
        let kbToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 40))
        kbToolBar.barStyle = UIBarStyle.Default  // スタイルを設定
        
        kbToolBar.sizeToFit()  // 画面幅に合わせてサイズを変更

        // スペーサー
        let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil)
       
        // 閉じるボタン 
        let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "commitButtonTapped")
        

        kbToolBar.items = [spacer, commitButton]
        

        myTextView.inputAccessoryView = kbToolBar

ボタンが押された時に呼ばれるアクション

    func commitButtonTapped (){
        self.view.endEditing(true)
    }

見た目はこんな感じ。

f:id:atuyosi:20160216003340p:plain

少ない行数で済むし、システムのデフォルトとの統一感もあっていいかと。


おしまい。