textViewがキーボードで隠れてしまうのを防ぎたい
このサイトを参考にtextViewがキーボードで隠れないようにしているのですがなかなかうまく行きません。
【Xcode】キーボードで隠れないようにスクロール
コードはこのような感じです。
class addScheduleVC: UIViewController {
var tableView = UITableView()
var lastKeyboardFrame: CGRect = CGRect.zero
var editingPath: NSIndexPath!
override func viewDidLoad() {
super.viewDidLoad()
tableView = UITableView(frame: self.view.frame, style: .grouped)
tableView.delegate = self
tableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewWillAppear(_ animated: Bool) {
tableView.reloadData()
registerNotification()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
unregisterNotification()
}
func registerNotification() -> () {
let center: NotificationCenter = NotificationCenter.default
center.addObserver(self, selector: Selector(("keyboardWillShow:")), name: UIResponder.keyboardWillShowNotification, object: nil)
center.addObserver(self, selector: Selector(("keyboardWillHide:")), name: UIResponder.keyboardWillHideNotification, object: nil)
}
func unregisterNotification() -> () {
let center: NotificationCenter = NotificationCenter.default
center.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
center.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
func keyboardWillShow(notification: NSNotification) -> () {
scrollTableCell(notification: notification, showKeyboard: true)
}
// Keyboard非表示前処理
func keyboardWillHide(notification: NSNotification) -> () {
scrollTableCell(notification: notification, showKeyboard: false)
}
// TableViewCellをKeyboardの上までスクロールする処理
func scrollTableCell(notification: NSNotification, showKeyboard: Bool) -> () {
if showKeyboard {
// keyboardのサイズを取得
var keyboardFrame: CGRect = CGRect.zero
if let userInfo = notification.userInfo {
if let keyboard = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
keyboardFrame = keyboard.cgRectValue
}
}
// keyboardのサイズが変化した分ContentSizeを大きくする
let diff: CGFloat = keyboardFrame.size.height - keyboardFrame.size.height
let newSize: CGSize = CGSize(width: tableView.contentSize.width, height: tableView.contentSize.height + diff)
tableView.contentSize = newSize
lastKeyboardFrame = keyboardFrame
// keyboardのtopを取得
let keyboardTop: CGFloat = UIScreen.main.bounds.size.height - keyboardFrame.size.height;
// 編集中セルのbottomを取得
let cell: UITableViewCell = tableView.cellForRow(at: NSIndexPath(row: editingPath.row, section: editingPath.section) as IndexPath)!
let cellBottom: CGFloat
cellBottom = (cell.frame.origin.y) - tableView.contentOffset.y + cell.frame.size.height;
// 編集中セルのbottomがkeyboardのtopより下にある場合
if keyboardTop < cellBottom {
// 編集中セルをKeyboardの上へ移動させる
let newOffset: CGPoint = CGPoint(x: tableView.contentOffset.x, y: tableView.contentOffset.y + cellBottom - keyboardTop)
tableView.setContentOffset(newOffset, animated: true)
}
} else {
// 画面を下に戻す
let newSize: CGSize = CGSize(width: tableView.contentSize.width, height: tableView.contentSize.height - lastKeyboardFrame.size.height)
tableView.contentSize = newSize
tableView.scrollToRow(at: editingPath as IndexPath, at: UITableView.ScrollPosition.none, animated: true)
lastKeyboardFrame = CGRect.zero;
}
}
エラーコードは
keyboardWillHide:]: unrecognized selector sent to instance 0x7fa9bb8b3800'
このような感じです