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

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座標+高さを越えたら越えた分スクロールして重ならないように表示してやるってことみたいです。

うーん、いちいち難しいです。が、ひとつづずこなして残して行きたいと思います

以上です