Swift 隐藏键盘

各种萌新在日常 iOS 的 App 开发中经常会在编辑 UITextfeild UITextView 遇到键盘隐藏的问题:

  1. 键盘弹出后的收回
  2. 键盘遮挡住 UITextfeildUITextView

所以,在此分享能适应绝大多数的场景 一行代码隐藏键盘 的方法。

引入代码段

在任何 .swift 文件中引入以下代码

import UIKit

private var kUIViewFrame = "kk_UIViewFrame"
extension UIViewController {
    
    func setUpKeyboardAutoHidden() {
        let notficaCenter = NSNotificationCenter.defaultCenter()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(UIViewController.touchedHiddenKeyBoard))
        
        objc_setAssociatedObject(self, &kUIViewFrame, NSValue(CGRect: self.view.frame), .OBJC_ASSOCIATION_RETAIN)
        
        // 添加tap手势,收起键盘
        notficaCenter.addObserverForName(
            UIKeyboardWillShowNotification,
            object: nil,
            queue: NSOperationQueue.mainQueue()) { (notification) -> Void in
                self.view.addGestureRecognizer(tapGesture)
        }
        
        // 移除Tap手势,避免和App中的UIResponder链冲突
        notficaCenter.addObserverForName(
            UIKeyboardWillHideNotification,
            object: nil,
            queue: NSOperationQueue.mainQueue()){ (notification) -> Void in
                self.view.removeGestureRecognizer(tapGesture)
        }
        
        // 键盘遮挡处理
        notficaCenter.addObserverForName(
            UIKeyboardWillChangeFrameNotification,
            object: nil,
            queue: NSOperationQueue.mainQueue()) { (notification) -> Void in
                let usrInfo = notification.userInfo!
                let keyboardRect = usrInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue
                if let respView = self.view.findFirstResponder {
                    
                    let convertRect = self.view.convertRect(respView.frame, fromView: respView.superview)
                    let offset = convertRect.origin.y + convertRect.height - keyboardRect.origin.y
                    var orignRect = objc_getAssociatedObject(self, &kUIViewFrame).CGRectValue
                    
                    if offset > 0 {
                        orignRect.origin.y = -offset
                    }
                    
                    UIView.animateWithDuration(0.3, animations: { () -> Void in
                        self.view.frame = orignRect
                    })
                }
        }
    }
    
    //取消所有的响应者
    func touchedHiddenKeyBoard() {
        self.view.endEditing(true)
    }
}

使用

在引入以上代码段后,在需要配置键盘隐藏的 UIViewController 中添加如下代码:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 配置键盘隐藏
        setUpKeyboardAutoHidden()
    }
}

文章出自我的个人博客, 如需转载, 请注明来源!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,180评论 4 61
  • “我来到你的城市,走过你来时的路,想象着——没我的日子,你是怎样的孤独……” 买一张去舟山新城的票,坐4个小时的大...
    苡安喆阅读 366评论 0 1
  • 不能选择 更不可以忘记 多少缕 属于黑夜的相思 消逝在青春的流光里 把酒言欢的日子 雕琢着虚无一样的回忆 碎碎 零...
    向阳_sun阅读 339评论 0 0
  • 今天和同事趁着在车站等车的空档,两个人随便闲聊了几句,聊着聊着就说起了小时候一些的事情,突然觉得蛮有趣的,现在拿出...
    俗人安安阅读 285评论 8 5
  • 古人真是聪明。现在只是技术的进步,用技术的进步反而掩盖了深思的短板。古人技术短缺,反而有长时间去深思吧。 ...
    老驴的书屋阅读 199评论 0 0