【问题标题】:extension for keyboard show notification iOS键盘显示通知 iOS 的扩展
【发布时间】:2019-01-18 06:55:15
【问题描述】:

我正在使用此代码。如果出现键盘,则它会增加视图的大小,因此用户可以轻松滚动到底部。一切正常,但我想为这段代码做一个扩展,因为我不想在我的控制器中使用这么长的代码

import UIKit

    extension UIViewController {


        func hideKeyboardWhenTappedAround() {
            let tap: UITapGestureRecognizer =     UITapGestureRecognizer(target: self, action:    #selector(dismissKeyboard))
            tap.cancelsTouchesInView = false
            view.addGestureRecognizer(tap)
        }


        @objc func dismissKeyboard() {
            view.endEditing(true)
        }

        func setnotification()
        {

            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown), name: UIResponder.keyboardWillShowNotification, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
        }

        @objc func keyboardWasShown(notification: NSNotification)
        {

            var info = notification.userInfo!
            let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
            let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize!.height+10, right: 0.0)
            self.scrolView.contentInset = contentInsets
            self.scrolView.scrollIndicatorInsets = contentInsets
            var aRect : CGRect = self.view.frame
            aRect.size.height -= keyboardSize!.height
            if let activeField =  activeTextField
            {
                if (!aRect.contains(activeField.frame.origin))
                {
                   self.scrolView.scrollRectToVisible(activeField.frame, animated: true)
                }
            }
        }
        // when keyboard hide reduce height of scroll view
        @objc func keyboardWillBeHidden(notification: NSNotification){
            let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0,bottom: 0.0, right: 0.0)
            myScrolView!.contentInset = contentInsets
            myScrolView!.scrollIndicatorInsets = contentInsets
            self.view.endEditing(true)
        }
}

【问题讨论】:

    标签: ios swift nsnotificationcenter


    【解决方案1】:

    扩展为现有的类、结构、枚举或协议类型添加新功能。

    扩展语法:

        extension ViewControllerName {
          // Put code which you want to 
        }      
    
       /**
         If you implement UITableViewDataSource and UITableViewDelegate methods 
         or you can implement for UIPickerViewDataSource methods and protocol also    
      */
    
       extension ViewController: UItableViewDataSource, UITableViewDelegate {
    
         //implement tableview datasource and delegate method 
    
       }
    
          /**
              Keyboard show/hide 
          */  
          extension ViewController {
           /**
               Add scrollview functionality to scroll top and you can call 
               this function from anywhere in the controller.
           */
           func scrollToTop() {
    
           } 
    
    
            @objc func keyboardWasShown(notification: NSNotification)
                {
                    var info = notification.userInfo!
                    let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
                    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize!.height+10, right: 0.0)
                    self.scrolView.contentInset = contentInsets
                    self.scrolView.scrollIndicatorInsets = contentInsets
                    var aRect : CGRect = self.view.frame
                    aRect.size.height -= keyboardSize!.height
                    if let activeField = self.activeTextField
                    {
                        if (!aRect.contains(activeField.frame.origin))
                        {
                            self.scrolView.scrollRectToVisible(activeField.frame, animated: true)
                        }
                    }
                }
                // when keyboard hide reduce height of scroll view
                @objc func keyboardWillBeHidden(notification: NSNotification){
                    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0,bottom: 0.0, right: 0.0)
                    self.scrolView.contentInset = contentInsets
                    self.scrolView.scrollIndicatorInsets = contentInsets
                    self.view.endEditing(true)
                }
            }
    

    【讨论】:

    • 但我不想在每个视图控制器中都使用 scrollview?
    • 然后创建scrollview实现的函数,放到扩展中。
    • 检查答案,我在扩展中添加了一个函数,您可以从视图控制器本身的任何位置调用它。 @Shahzad
    • 兄弟我想将 uiscrollview 对象发送到扩展
    • 扩展不是一个可以发送对象的函数,docs.swift.org/swift-book/LanguageGuide/Extensions.html你按照这个教程,那么你所有的疑惑都清楚了
    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多