zoukankan      html  css  js  c++  java
  • [Swift]键盘遮挡控件

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ 
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10653037.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    键盘遮挡控件:

     1  super.viewDidLoad(){
     2      // Do any additional setup after loading the view, typically from a nib.
     3      //监听键盘弹出通知
     4      NotificationCenter.default.addObserver(self,selector: #selector(keyboardWillShow(_:)), name:UIResponder.keyboardWillShowNotification, object: nil)
     5      //监听键盘隐藏通知
     6      NotificationCenter.default.addObserver(self,selector: #selector(keyboardWillHide(_:)), name:UIResponder.keyboardWillHideNotification, object: nil)
     7  }
     8 
     9 //键盘显示
    10 @objc func keyboardWillShow(_ notification: Notification) {
    11     let userInfo = (notification as NSNotification).userInfo!
    12     //键盘尺寸
    13     let keyboardSize = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    14     //keyboardSize.height
    15     //keyboardSize.width
    16     
    17 }
    18 
    19 //键盘隐藏
    20 @objc func keyboardWillHide(_ notification: Notification) {
    21     //还原控件位置
    22     
    23 }

    tableView 所在的视图控制器是 UITableViewController ,则不需要特别处理即可放心使用,系统会自动处理键盘遮挡问题。

    tableView 所在的视图控制器是 UIViewController,这里有两种办法防止键盘遮挡。

    • 方法1:在原来的 UIViewController 内部再添加一层 UITableViewController
     1 import UIKit
     2  
     3 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
     4      
     5     var tableView:UITableView?
     6      
     7     override func loadView() {
     8         super.loadView()
     9     }
    10      
    11     override func viewDidLoad() {
    12         super.viewDidLoad()
    13          
    14         //创建表视图
    15         self.tableView = UITableView(frame: self.view.frame, style:.plain)
    16         self.tableView!.delegate = self
    17         self.tableView!.dataSource = self
    18         //创建一个重用的单元格
    19         self.tableView!.register(MyTextFieldCell.self, forCellReuseIdentifier: "tableCell")
    20         self.view.addSubview(self.tableView!)
    21          
    22         //添加一个UITableViewController
    23         let tableVC = UITableViewController.init(style: .plain)
    24         tableVC.tableView = self.tableView
    25         self.addChildViewController(tableVC)
    26     }
    27      
    28     //返回表格行数(也就是返回控件数)
    29     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    30         return 20
    31     }
    32      
    33     //创建各单元显示内容(创建参数indexPath指定的单元)
    34     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
    35         -> UITableViewCell {
    36             //创建一个重用的单元格
    37             let cell = tableView
    38                 .dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
    39                 as! MyTextFieldCell
    40              
    41             cell.label.text = "条目(indexPath.row)"
    42             return cell
    43     }
    44  
    45     override func didReceiveMemoryWarning() {
    46         super.didReceiveMemoryWarning()
    47     }
    48 }
    • 方法2:监听键盘通知,在键盘出现或消失的时候修改tableView 的 contentInset 和 scrollIndicatorInsets
     1 import UIKit
     2  
     3 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
     4      
     5     var tableView:UITableView?
     6      
     7     override func loadView() {
     8         super.loadView()
     9     }
    10      
    11     override func viewDidLoad() {
    12         super.viewDidLoad()
    13          
    14         //创建表视图
    15         self.tableView = UITableView(frame: self.view.frame, style:.plain)
    16         self.tableView!.delegate = self
    17         self.tableView!.dataSource = self
    18         //创建一个重用的单元格
    19         self.tableView!.register(MyTextFieldCell.self, forCellReuseIdentifier: "tableCell")
    20         self.view.addSubview(self.tableView!)
    21          
    22         //监听键盘弹出通知
    23         NotificationCenter.default
    24             .addObserver(self,selector: #selector(keyboardWillShow(_:)),
    25                          name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    26         //监听键盘隐藏通知
    27         NotificationCenter.default
    28             .addObserver(self,selector: #selector(keyboardWillHide(_:)),
    29                          name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    30     }
    31      
    32     //返回表格行数(也就是返回控件数)
    33     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    34         return 20
    35     }
    36      
    37     //创建各单元显示内容(创建参数indexPath指定的单元)
    38     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
    39         -> UITableViewCell {
    40             //创建一个重用的单元格
    41             let cell = tableView
    42                 .dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
    43                 as! MyTextFieldCell
    44              
    45             cell.label.text = "条目(indexPath.row)"
    46             return cell
    47     }
    48      
    49     // 键盘显示
    50     func keyboardWillShow(_ notification: Notification) {
    51         let userInfo = (notification as NSNotification).userInfo!
    52         //键盘尺寸
    53         let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey]
    54             as! NSValue).cgRectValue
    55         var contentInsets:UIEdgeInsets
    56         //判断是横屏还是竖屏
    57         let statusBarOrientation = UIApplication.shared.statusBarOrientation
    58         if UIInterfaceOrientationIsPortrait(statusBarOrientation) {
    59             contentInsets = UIEdgeInsetsMake(64.0, 0.0, (keyboardSize.height), 0.0);
    60         } else {
    61             contentInsets = UIEdgeInsetsMake(64.0, 0.0, (keyboardSize.width), 0.0);
    62         }
    63         //tableview的contentview的底部大小
    64         self.tableView!.contentInset = contentInsets;
    65         self.tableView!.scrollIndicatorInsets = contentInsets;
    66     }
    67      
    68     // 键盘隐藏
    69     func keyboardWillHide(_ notification: Notification) {
    70         //还原tableview的contentview大小
    71         let contentInsets:UIEdgeInsets = UIEdgeInsetsMake(64.0, 0.0, 0, 0.0);
    72         self.tableView!.contentInset = contentInsets
    73         self.tableView!.scrollIndicatorInsets = contentInsets
    74     }
    75      
    76     override func didReceiveMemoryWarning() {
    77         super.didReceiveMemoryWarning()
    78     }
    79 }
  • 相关阅读:
    centos 6.5 添加静态ip
    质数因子
    sizeof 和 strlen 的区别
    C++输入带空格的字符串
    字符集合
    汽水瓶
    算法汇总
    Word目录生成
    0-1背包问题的动态规划法与回溯法
    vue父元素调用子组件的方法报undefined
  • 原文地址:https://www.cnblogs.com/strengthen/p/10653037.html
Copyright © 2011-2022 走看看