iOS ScrollView中的textFiled解決鍵盤遮擋的問題

關(guān)于iOS TextFiled的詳細使用請看:iOS TextFiled

本文中scrollView的布局請看:scrollView的布局

點擊視圖收起鍵盤

給Content View新建contentView類,繼承UIView類,實現(xiàn)收起鍵盤的功能

class contentView: UIView {
    //點擊收回鍵盤
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.endEditing(true)
    }
}

綁定Content View和contentView類

解決鍵盤的遮擋問題

給viewControllor添加監(jiān)聽事件

// 監(jiān)聽鍵盤彈出事件
NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardWillShowFrame:", name: UIKeyboardWillShowNotification, object: nil)
// 監(jiān)聽鍵盤隱藏事件
NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardWillHideFrame:", name: UIKeyboardWillHideNotification, object: nil)

實現(xiàn)鍵盤出現(xiàn)的事件

func onKeyboardWillShowFrame(notification: NSNotification) {
        // 1、將通知中的數(shù)據(jù)轉(zhuǎn)換成NSDictionary 
        let dict = NSDictionary(dictionary: notification.userInfo!)
        // 2、獲取鍵盤最后的Frame值 
        let keyboardFrame = dict[UIKeyboardFrameEndUserInfoKey]!.CGRectValue
        // 4、獲取鍵盤彈出動畫事件
        let duration = dict[UIKeyboardAnimationDurationUserInfoKey] as! Double
        UIView.animateWithDuration(duration, animations: { () -> Void in
        // 5、設(shè)置整個屏幕隨鍵盤移動
        //下面的方法是將視圖整個上移ty的距離
//        self.scrollView.transform = CGAffineTransformMakeTranslation(0, ty)
        //判斷輸入的是哪個框
            var textClicked: UITextField!
            if self.text.isFirstResponder() {
                textClicked = self.text
            }else if self.text1.isFirstResponder() {
                textClicked = self.text1
            }else if self.text2.isFirstResponder() {
                textClicked = self.text2
            }
            //如果當前輸入的框的位置低于鍵盤的高度就移動視圖
            if textClicked.frame.maxY > keyboardFrame.origin.y{
                //被點擊的文本框的底部的Y值 和  鍵盤的頂端的Y值 就是要移動的距離
                let offSet = textClicked.frame.maxY - keyboardFrame.origin.y
                //設(shè)置scrollView的可拖動距離(contentSize)為原來的視圖高+鍵盤高,這樣鍵盤沒有遮擋的部分可以滾動查看原來所有的視圖
                self.scrollView.contentSize.height = self.scrollViewHieght + keyboardFrame.size.height
                //+10 是為了使textFiled不要緊貼輸入法
                self.scrollView.contentOffset = CGPoint(x: 0.0, y: offSet + 10)
            }
        })

    }
        
        deinit {        // 控制器銷毀時,移除消息通知監(jiān)聽(必須)
            NSNotificationCenter.defaultCenter().removeObserver(self)
    }

其中的scrollViewHieght是和視圖的高相等的
在類中聲明scrollViewHieght,并且在viewDidLoad方法在中將視圖的高賦值給scrollViewHieght

    var scrollViewHieght: CGFloat!   
//下面這句話寫在viewDidLoad方法中     
    scrollViewHieght = self.view.frame.height

實現(xiàn)鍵盤收起事件,將視圖恢復

// MARK -   鍵盤隱藏事件監(jiān)聽
    func onKeyboardWillHideFrame(notification: NSNotification) {
        let dict = NSDictionary(dictionary: notification.userInfo!)
        let duration = dict[UIKeyboardAnimationDurationUserInfoKey] as! Double
        UIView.animateWithDuration(duration, animations: { () -> Void in
        //讓scrollView還原
        self.scrollView.contentOffset = CGPoint(x: 0.0, y: 0)
        self.scrollView.contentSize.height = self.view.frame.height
        })
    }

別忘了將所有textFiled的delegate設(shè)置為self,并且實現(xiàn)textFieldShouldReturn方法,此時,textFiled所在的類要繼承UITextFiledDelegate協(xié)議

text1.delegate = self
text.delegate = self
text2.delegate = self
func textFieldShouldReturn(textField: UITextField) -> Bool {
        //當前textField取消焦點
        textField.resignFirstResponder()
        return true
    }

這樣就可以解決鍵盤遮擋的問題。

下面說一下代碼中用到的和沒用到的scrollView和view的一些屬性

ScrollView的一些屬性

  • contentSize: CGSize 有 width 和 height,代表ScrollView可以滾動的視圖大小
  • contentSize: CGPoint 有 x 和 y ,表示將ScrollView移動到指定坐標

View的一些屬性

View的 frame 屬性 有

  • width 自身的寬
  • height 自身的高
  • max X/Y
  • mid X/Y
  • min X/Y
    如圖 介紹了Y X就自行腦補


    屏幕快照 2015-12-19 下午6.45.45.png

本文原創(chuàng),作者初學不容易 =。= ,假如你轉(zhuǎn)載,注明出處
360云盤:TextFieldView (提取碼:92d4)

2016.1.10更新

機智的我發(fā)現(xiàn),當你的軟件設(shè)置為中文模式的時候,你的輸入法會多出來一部分候選單詞,這個時候,系統(tǒng)計算的鍵盤高度并不包含候選單詞的高度,所以會出現(xiàn)輸入框還是被遮擋的狀況,解決方法就是,在下面這個代碼中:

//+10 是為了使textFiled不要緊貼輸入法
 self.scrollView.contentOffset = CGPoint(x: 0.0, y: offSet + 10)

將10 修改為更大的數(shù)字,置于具體是多少,就讀者自己看著辦吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容