下の画像の用意StyleをGroupedに設定したtableViewの上にカスタムセルを置いています。
Cellをタップするとkeyboardが表示され、Cell以外の部分をタップするとkeyboardが閉じるという処理を目的としています。
現在のコードでは、
override viewDidLoad() { let closeKeyboardTap = UITapGestureRecognizer(target: self, action: #selector(closeKeyboard)) // このプロパティがtrueだとcloseKeyboardTapのgestureのみが処理されcellのタップ処理などが実行されなくなる closeKeyboardTap.cancelsTouchesInView = false closeKeyboardTap.delegate = self self.view.addGestureRecognizer(closeKeyboardTap) } @objc func closeKeyboard() { self.view.endEditing(true) }
として、タップされた時にkeyboardを閉じる処理を行っています。
しかし、この場合だとkeyboardが表示されている時にCellをタップするとまず、closeKeyboard()
が呼ばれてkeyboardを非表示にする処理が行われてからCellをタップした処理としてkeyboardが表示される処理が行われるので一瞬keyboardが閉じて表示されるという動きになってしまいます。
この動きを改善するため、下のコードによって、
extension CreateTimeTableViewController: UIGestureRecognizerDelegate { func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { // tocuhからタップされた位置を取得しcellが取得できたらfalseを返すようにする if let indexPath = tableView.indexPathForRow(at: touch.location(in: tableView)) { return true } else { return false } } }
タップされた位置にCellが存在したらタップされたというgestureを伝えてcloseKeyboard()
が呼ばれるようにし、Cellが存在しない場合にはgesutreを伝えないようにしています。
しかし、下の画像のように名称LabelのCell
と時限LabelのCell
の間の背景色がグレーの部分をタップした際にもindexPathが返り値となりgestureRecognizer()
の返り値がtrueになってしまいます。
なお、それ以外の部分をタップした際は理想通りnilが返されCellが存在しないという正常な動きになります。
この名称Cellと時限Cellの間の部分をタップした際でもtableView.indexPathForRow(at: touch.location(in: tableView)
がnilを返すようにするにはどのようにすれば良いのでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。