Swift TextView編集時のキーボードに入力完了ボタンを表示する


イメージ

下記例でいうところのDoneボタンを表示する。

f:id:letitride:20190819154228p:plain:h400


実装

ボタン部分の枠はUIToolbarで表示を行うと非常に楽。キーボードとUIToolbarのjoinはinputAccessoryViewで行える。

override func viewDidLoad() {
    super.viewDidLoad()

    // ツールバー生成 サイズはsizeToFitメソッドで自動で調整される。
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

    //サイズの自動調整。敢えて手動で実装したい場合はCGRectに記述してsizeToFitは呼び出さない。
    toolBar.sizeToFit()

    // 左側のBarButtonItemはflexibleSpace。これがないと右に寄らない。
    let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil)
    // Doneボタン
    let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(commitButtonTapped))

    // BarButtonItemの配置
    toolBar.items = [spacer, commitButton]
    // textViewのキーボードにツールバーを設定
    textView.inputAccessoryView = toolBar
}


Doneボタン押下時の処理

ここではキーボードを閉じる処理。

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


TextView以外にタッチした時にキーボードを閉じる
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}