美文网首页
iOS关于键盘遮挡问题

iOS关于键盘遮挡问题

作者: 流星大石头 | 来源:发表于2016-10-13 10:07 被阅读294次
    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;
     }}
     
     */
    
    

    相关文章

      网友评论

          本文标题:iOS关于键盘遮挡问题

          本文链接:https://www.haomeiwen.com/subject/yjdwyttx.html