swiftでUitextFieldがキーボードで隠れないようにする方法
はじめに
また、webだと考えられないようなところでつっかかたのでそのときの対応をメモします。
iPhoneアプリ開発したことがある人ならみんな経験しているようなことなのかもしれませんが、初めてのiPhoneアプリ開発ではハマる部分なのではないかと思います
実装方法
ググったら対応方法はあちこに出てきました。
ViewController.swif
class ViewController: UiViewController, UITextFieldDelegate {
// テーブルビュー
var tableView: UITableView!
// テキストフィールド
var textField: UiTextField!
// フォーカスの当たっているテキストフィールド
var activeTextFiled: UiTextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView = UITableView(frame: CGRect(x:0, y:0, width:self.frame.width, height:self.frame.height))
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
let heightView = self.setHeaderView(tableView,isLayout: false) as! CGFloat
return heightView
}
func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let viewHeader = self.setHeaderView(tableView, isLayout: true) as! UIView
return viewHeader
}
func setHeaderView(tableView: UITableView, isLayout: Bool) -> AnyObject {
var heightView = 300
let viewHeader = UIView()
viewHeader.frame = CGRectMake(0, 0, tableView.frame.width, heightView)
// widthをきめる
var widthTextField: CGFloat = ・・・
// heightをきめる
var heightTextField: CGFloat = ・・・
// frame.origin.xをきめる
var xTextField: CGFloat = ・・・
// frame.origin.yをきめる
var yTextField CGFloat = ・・・
textField = UiTextField()
textField.frame = CGRectMake(xTextField, yTextField, widthTextField, heightTextField)
// TextFieldデリゲート
textField.delegate = self
if isLayout {
viewHeader.addSubview(textField)
} else {
return heightView
}
}
// 以下、キーボードの制御
override func viewWillAppear(animated: Bool) {
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: "handleKeyboardWillShowNotification:", name: UIKeyboardWillShowNotification, object: nil)
notificationCenter.addObserver(self, selector: "handleKeyboardWillHideNotification:", name: UIKeyboardWillHideNotification, object: nil)
}
func handleKeyboardWillShowNotification(notification: NSNotification) {
var userInfo = notification.userInfo!
var keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
var boundSize: CGSize = UIScreen.mainScreen().bounds.size
var textFieldLimit = activeTextFiled.frame.origin.y + activeTextFiled.frame.height + 8.0
var keyboardLimit = boundSize.height - keyboardScreenEndFrame.size.height
if textFieldLimit >= keyboardLimit {
tableView.contentOffset.y = textFieldLimit - keyboardLimit
}
}
func handleKeyboardWillHideNotification(notification: NSNotification) {
tableView.contentOffset.y = 0
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
activeTextFiled = textField
return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}他サイトでのobjective-cで書かれてたのをswiftで書き直しただけなんですけど、、、
やってることはキーボードが表示されたときにキーボードのy座標が、UiTextFieldのy座標+高さを越えたら越えた分スクロールして重ならないように表示してやるってことみたいです。
うーん、いちいち難しいです。が、ひとつづずこなして残して行きたいと思います
以上です