iOS关于键盘遮挡问题

import UIKit

//关于UITextView的键盘遮挡问题
class ViewController: UIViewController {

     var flag = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        view.addSubview(textView)
        textView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 30)
        //+ view.bounds.height/2-textView.bounds.height/2
        textView.center = CGPoint(x: view.center.x, y: view.center.y + 100 )
        textView.delegate = self
        
        testLabel.frame = CGRect(x: 0, y: 0, width:50, height: 50)
        testLabel.center = CGPoint(x: view.center.x, y: view.center.y )
        view.addSubview(testLabel)
    
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
    
        addKeyBoardNotification()
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        self.view.endEditing(true)
        flag = false
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    private lazy var testLabel:UILabel = {
        
        let testLabel = UILabel()
        testLabel.backgroundColor = UIColor.redColor()
        
        
        return testLabel
    }()

    
    private lazy var textView:UITextView = {
        
        let textView = UITextView()
        textView.backgroundColor = UIColor.orangeColor()
        
        return textView
    }()
}

//MARK: 键盘遮挡
extension ViewController {

    
    func addKeyBoardNotification(){
    
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillApprear), name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillDisAppear), name: UIKeyboardWillHideNotification, object: nil)

    }
    
    @objc  func keyboardWillApprear(noti:NSNotification) {
        
        
        //在iOS9上看没有任何问题,iOS10上出现一些问题
        print(noti)
        
        let dict = noti.userInfo
        let interval = dict![UIKeyboardAnimationDurationUserInfoKey] as! Double
        let keyboardValue = dict?[UIKeyboardFrameEndUserInfoKey] as? NSValue
        var keyboardRect:CGRect = CGRectZero
        keyboardValue?.getValue(&keyboardRect)
        let tempValue = dict![UIKeyboardFrameBeginUserInfoKey] as! NSValue
        var tempRect = CGRectZero
        tempValue.getValue(&tempRect)
        
//        我们通过总结发现,如果你是第一次输入内容,搜狗输入法的UIKeyboardFrameBeginUserInfoKey在第一次和第二次时,frame.size.height都是0;
//        而第三次的才算正常的,和系统发出的一样.
        if tempRect.height <= 0 {
            
            return
        }
        
        if keyboardRect.height <= 0 {
            
            return
        }
        
        if tempRect.origin.y - keyboardRect.origin.y < 0 {
        
            return
            
        }

        let frame = self.textView.frame
        let height = self.view.frame.size.height
        
        // textView的y值+textView的高度 - (view的高度(不是屏幕的高度) - 键盘的高度 )
        let offset = frame.origin.y + frame.size.height - (height  - keyboardRect.size.height)
      
        if offset > 0 && flag == false{
            flag = true
            print("被执行了")
            let animationDuration: NSTimeInterval = interval
//            UIView.beginAnimations(nil, context: nil)
//            UIView.setAnimationDuration(animationDuration)
            
            UIView.animateWithDuration(animationDuration, animations: { 
                
                //view的frame:(0,64,width,height)
                //如果有导航栏需要-offset+64
                let rect = CGRect(x: 0, y: -offset , width:  self.view.frame.size.width, height: self.view.bounds.size.height)
                self.view.frame = rect

                
                }, completion: { (flag) in
                    
            })
            
            
//             UIView.commitAnimations()
        }
       
    }
    
    @objc  func keyboardWillDisAppear(noti:NSNotification) {
        
        let dict = noti.userInfo
        
        let interval = dict![UIKeyboardAnimationDurationUserInfoKey] as! Double
        
        UIView.animateWithDuration(interval, animations: {
            
            //如果有导航栏y:64
            self.view.frame = CGRect(x: 0, y: 0, width:  self.view.frame.size.width, height: self.view.frame.size.height)
            
        }) { (_) in
            
        }
    }
    
}

extension ViewController:UITextViewDelegate {

    func textViewDidChange(textView: UITextView) {
        
        let fixedWidth = textView.frame.width
        let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        
        if newSize.height > textView.frame.height && newSize.height < 120 {
            
            //修改位置
            var viewFrame = self.view.frame
            viewFrame.origin.y -= newSize.height - textView.frame.height
            self.view.frame = viewFrame
            
            //修改textView的高度
            var frame = textView.frame
            frame.size.height = newSize.height
            textView.frame = frame
        }
    }
}

/*
 
 iOS9:
 原生键盘:
 NSConcreteNotification 0x1355aa840 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 251.5}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 693.75}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 442.25}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 251.5}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 316.5}, {320, 251.5}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 
 
 
 搜狗键盘:
 
 NSConcreteNotification 0x135d51140 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x135ea3ef0 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = 0;
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x135ea4210 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = 0;
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 
 输入内容之后:
 NSConcreteNotification 0x135df6c00 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x135def7d0 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = 0;
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x135df6df0 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = 0;
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 
 
 NSConcreteNotification 0x135e43ff0 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x135de2850 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = 0;
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x135e17980 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = 0;
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 
 我们通过总结发现,如果你是第一次输入内容,搜狗输入法的UIKeyboardFrameBeginUserInfoKey在第一次和第二次时,frame.size.height都是0;
 而第三次的才算正常的,和系统发出的一样.
 但是一旦你输入过内容,不管是多少,即使把已经输入的内容都删除,再次弹出的键盘的时候就不一样了。
 
 */


/*
 iOS10:
 
 NSConcreteNotification 0x17024dcb0 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 709}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 282}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 被执行了
 NSConcreteNotification 0x17424dcb0 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 427}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 NSConcreteNotification 0x17424dc20 {name = UIKeyboardWillShowNotification; userInfo = {
 UIKeyboardAnimationCurveUserInfoKey = 7;
 UIKeyboardAnimationDurationUserInfoKey = "0.25";
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
 UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
 UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
 UIKeyboardIsLocalUserInfoKey = 1;
 }}
 
 */

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容