美文网首页
IOS自定义键盘

IOS自定义键盘

作者: 劉胡來 | 来源:发表于2020-05-27 15:42 被阅读0次

    效果图

    QQ20200527-152722-HD.gif

    自定义键盘的核心思想

    • 设置UITextFiled 的InputView
    • 切换键盘的思路为重新设置UITextFiled 的InputView然后再调用textFiled?.reloadInputViews()
      *剩下的就是按键的布局与代理设置了

    swift版本采用策略模式实现,Objc版本使用常规模式实现

    swift版本的策略模式实现的角色划分如下:

    • 策略管理类--键盘管理类KeyboardMgr
    • 通用策略类--键盘基类KeyboardBaseView
    • 具体的策略类--数字键盘、随机数字键盘、英文键盘

    具体的源码如下:

    import UIKit
    
    class KeyboardMgr: UIView {
    
        var keyboard : KeyboardBaseView?
        static let shareInstace = KeyboardMgr()
        
        lazy var keyboardInstanceDict : [String : KeyboardBaseView] = Dictionary()
        
        func setInputMethodKeyboard(keyboardview keyboard : KeyboardBaseView,
                                    inputView textfiled:UITextField,
                                    onKeyClickListener listener:OnKeyListener) {
            self.keyboard = keyboard
            self.keyboard?.createView(inputView: textfiled, addOnClickListener: listener)
            keyboardInstanceDict[keyboard.description] = keyboard
        }
    
    }
    
    
    • 策略基类源码:
    import UIKit
    
    @objc protocol OnKeyListener {
        @objc optional func onClick(button view:UIButton);
        
        
        /// 文本观察监听接口
        /// - Parameters:
        ///   - view: 被观察的对象
        ///   - bStr: 观察之前的文本
        ///   - cStr: 当前u文本
        ///   - aStr: 编辑之后最终的文本
        @objc optional func addTextWatch(button view:UIButton,
                                         beforeText bStr:String?,
                                         curText cStr:String?,
                                         afterText aStr:String?);
        
    }
    
    class KeyboardBaseView: UIView {
        
        var textFiled       : UITextField?
        let DELETE          : NSInteger = 19;
        let FINISH          : NSInteger = 21;
        let ABC             : NSInteger = 22;
        let CAPTIAL         : NSInteger = 23;
        let SWITCH_TYPE     : NSInteger = 24;
        let SEARCH          : NSInteger = 25;
        let SPACE           : NSInteger = 98;
        
        
        var onClickListener : OnKeyListener?
        lazy var beforeText : String = String.init()
        lazy var curText    : String = String.init()
        lazy var afterText  : String = String.init()
        
        override init(frame: CGRect) {
            super.init(frame: frame)
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        public func createView(inputView targetView:UITextField,addOnClickListener listener:OnKeyListener){
            self.textFiled = targetView;
            targetView.inputView = self
            self.onClickListener = listener
        }
        
        func createKey(titleTxt title:String,posX x:CGFloat, posY y:CGFloat, width w:CGFloat,hight h : CGFloat,forId id:NSInteger)->Void{
            self.createKey(titleTxt: title, posX: x, posY: y, width: w, hight: h, forId: id, normalImg: nil, highLightimg: nil)
        }
        
        func createKey(titleTxt title:String,
                       posX x:CGFloat,
                       posY y:CGFloat,
                       width w:CGFloat,
                       hight h : CGFloat,
                       forId id:NSInteger,normalImg norBgImg:String?, highLightimg himg:String?)->Void{
            
            let btnKey = UIButton();
            btnKey.frame = CGRect.init(x: x, y: y, width: w, height: h);
            self.addSubview(btnKey)
            btnKey.tag = id
            btnKey.setTitle(title, for: .normal)
            btnKey.setTitleColor(UIColor.black, for: .normal)
            btnKey.addTarget(self, action: #selector(onClickListener(button:)), for: .touchUpInside)
            guard let nImg = norBgImg else{
                btnKey.layer.cornerRadius = 5.0
                return
            }
            btnKey.setBackgroundImage(UIImage.init(named: nImg), for: .normal)
            guard let hImg = himg else{
                return
            }
            btnKey.setBackgroundImage(UIImage.init(named: hImg), for: .highlighted)
            
        }
        
        @objc func onClickListener(button:UIButton) {
            switch button.tag {
                case (0...10),(100...126):
                    if self.onClickListener != nil {
                        self.onClickListener!.onClick?(button: button)
                    }
                    self.afterText.append(button.titleLabel!.text!)
                    break;
                    
                case ABC:
                    switchKeyboardType()
                    break;
                
            case SEARCH:
                
                break;
                
            case SWITCH_TYPE:
                switchKeyboardType()
                break;
                
            case CAPTIAL:
                switchCaptial(button: button)
                break;
                    
                case DELETE:
                    if !self.afterText.isEmpty{
                        let index = self.afterText.count - 1
                        self.afterText = self.afterText.prefix(index).description
                    }
                    break;
                    
                case FINISH:
                    hideKeyboard()
                    break;
                    
                default:
                    break;
            }
            
            if self.onClickListener != nil && !(21...30).contains(button.tag){
                
                self.onClickListener?.addTextWatch?(button: button,
                                                beforeText: self.beforeText,
                                                   curText: button.titleLabel!.text,
                                                 afterText: self.afterText)
                self.beforeText = self.afterText;
            }
            
        }
        
        func hideKeyboard() {
            self.textFiled?.endEditing(true)
        }
        
        func switchCaptial(button view : UIButton) {
            
        }
        
        func switchKeyboardType() {
            
        }
    
    
    }
    
    
    • 数字键盘类
    import UIKit
    
    class NumberKeyboard: KeyboardBaseView {
        
        lazy var logoLabel:UILabel = UILabel()
        var colSpace : CGFloat = 5.0;
        var rowSpace : CGFloat = 5.0
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            self.backgroundColor = UIColor.gray
            createLogoView()
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        override func createView(inputView targetView: UITextField,addOnClickListener listener:OnKeyListener) {
            super.createView(inputView: targetView,addOnClickListener: listener)
            for view in self.subviews{
                view.removeFromSuperview()
            }
            let width = (self.frame.size.width - self.colSpace * 4) / 3
            let height = (self.frame.size.height - self.logoLabel.frame.size.height - self.rowSpace * 4 ) / 4
            for i in 1..<10{
                
                let indexColSpace = self.colSpace * CGFloat((i - 1) % 3)
                let indexWidth = width * CGFloat((i - 1) % 3)
                let x = self.colSpace + indexColSpace +  indexWidth
                
                let indexRowSpace = self.rowSpace * CGFloat((i - 1) / 3)
                let indexRowHeight = height * CGFloat((i - 1) / 3)
                let y = 44 + indexRowSpace + indexRowHeight
                
                createKey(titleTxt: String.init(format: "%d", i),
                          posX: x,
                          posY: y,
                          width: width,
                          hight: height,
                          forId: i,
                      normalImg: "anniu1.png",
                   highLightimg: "anniu1_select.png")
            }
            
            createKey(titleTxt: "ABC",
                                 posX: self.colSpace,
                                 posY: self.logoLabel.frame.size.height + self.rowSpace * 3 + height * 3,
                                 width: width,
                                 hight: height,
                                 forId: ABC,
                                 normalImg: "anniu1.png",
                                 highLightimg: "anniu1_select.png")
            
            createKey(titleTxt: String.init(format: "%d", 0),
                            posX: self.colSpace * 2 + width,
                            posY: self.logoLabel.frame.size.height + self.rowSpace * 3 + height * 3,
                            width: width,
                            hight: height,
                            forId: 0,
                            normalImg: "anniu1.png",
                            highLightimg: "anniu1_select.png")
            
            createKey(titleTxt: "X",
                            posX: self.colSpace * 3 + width * 2,
                            posY: self.logoLabel.frame.size.height + self.rowSpace * 3 + height * 3,
                            width: width,
                            hight: height,
                            forId: DELETE,
                            normalImg: "anniu1.png",
                            highLightimg: "anniu1_select.png")
            
            
        }
        
        func createLogoView(){
            self.logoLabel.frame = CGRect.init(x: 0, y: 0, width: self.frame.size.width, height: 44)
            self.addSubview(self.logoLabel)
            self.logoLabel.text = "硬汉安全键盘"
            self.logoLabel.textAlignment = .center
            logoLabel.font = UIFont.systemFont(ofSize: 14)
            logoLabel.textColor = UIColor.white
            
            let btnFinish = UIButton.init()
            btnFinish.frame = CGRect.init(x: self.frame.size.width - 100, y: 0, width: 100, height: 44)
            self.addSubview(btnFinish)
            btnFinish.tag = FINISH
            btnFinish.setTitle("完成", for: .normal)
            btnFinish.setTitleColor(UIColor.blue, for: .normal)
            btnFinish.addTarget(self, action: #selector(onClickListener(button:)), for:.touchUpInside)
            
        }
        
        override func switchKeyboardType() {
            var abcKeyboard = KeyboardMgr.shareInstace.keyboardInstanceDict[AbcKeyboard.self.description()]
                   
           if(abcKeyboard == nil){
               abcKeyboard = AbcKeyboard.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 260))
               KeyboardMgr.shareInstace.keyboardInstanceDict[AbcKeyboard.self.description()] = abcKeyboard
           }
           KeyboardMgr.shareInstace.setInputMethodKeyboard(keyboardview: abcKeyboard!,
                                                           inputView: textFiled!,
                                                           onKeyClickListener: onClickListener!)
           textFiled?.reloadInputViews()
        }
        
    
    }
    
    
    • 随机数字键盘类
    import UIKit
    
    class RandomNumberKeyboard: KeyboardBaseView {
    
        lazy var logoLabel        : UILabel = UILabel()
        var colSpace              : CGFloat = 5.0;
        var rowSpace              : CGFloat = 5.0
        lazy var randomNumArray   : NSMutableArray = NSMutableArray.init()
        
        override init(frame: CGRect) {
           super.init(frame: frame)
           self.backgroundColor = UIColor.gray
           createLogoView()
            
            for i in 0..<10 {
                randomNumArray.add(NSString.init(format: "%d", i))
            }
        }
           
       required init?(coder: NSCoder) {
           fatalError("init(coder:) has not been implemented")
       }
        
        func createLogoView(){
            self.logoLabel.frame = CGRect.init(x: 0, y: 0, width: self.frame.size.width, height: 44)
            self.addSubview(self.logoLabel)
            self.logoLabel.text = "硬汉安全键盘"
            self.logoLabel.textAlignment = .center
            logoLabel.font = UIFont.systemFont(ofSize: 14)
            logoLabel.textColor = UIColor.white
            
            let btnFinish = UIButton.init()
            btnFinish.frame = CGRect.init(x: self.frame.size.width - 100, y: 0, width: 100, height: 44)
            self.addSubview(btnFinish)
            btnFinish.tag = FINISH
            btnFinish.setTitle("完成", for: .normal)
            btnFinish.setTitleColor(UIColor.blue, for: .normal)
            btnFinish.addTarget(self, action: #selector(onClickListener(button:)), for:.touchUpInside)
            
        }
        
        override func createView(inputView targetView: UITextField, addOnClickListener listener: OnKeyListener) {
            super.createView(inputView: targetView, addOnClickListener: listener)
            createNumberAndRandom()
        }
        
        func createNumberAndRandom() {
            //随机乱序
            for i in (1...10).reversed() {
                let random = arc4random_uniform(UInt32(i))
                let tmp = self.randomNumArray[Int(random)];
                self.randomNumArray[Int(random)] = self.randomNumArray[i - 1];
                self.randomNumArray[i - 1] = tmp;
            }
            
            let width = (self.frame.size.width - self.colSpace * 4) / 3
            let height = (self.frame.size.height - self.logoLabel.frame.size.height - self.rowSpace * 4 ) / 4
            
            for(i, item)in randomNumArray.enumerated(){
                
                if(i == 0){
                    createKey(titleTxt: item as! String,
                              posX: self.colSpace * 2 +  width,
                              posY: self.logoLabel.frame.size.height + self.rowSpace * 3 + height * 3,
                              width: width,
                              hight: height,
                              forId: i,
                              normalImg: "anniu1.png",
                              highLightimg: "anniu1_select.png")
                    
                }else{
                
                   let indexColSpace = self.colSpace + self.colSpace * CGFloat(i % 3)
                   let indexWidth = width * CGFloat(i % 3)
                   let x = indexColSpace +  indexWidth
                   
                   let indexRowSpace = self.logoLabel.frame.size.height + self.rowSpace * CGFloat((i - 1) / 3)
                   let indexRowHeight = height * CGFloat((i - 1) / 3)
                   let y = indexRowSpace + indexRowHeight
                   
                    createKey(titleTxt: item as! String,
                                posX: x,
                                posY: y,
                                width: width,
                                hight: height,
                                forId: i,
                                normalImg: "anniu1.png",
                                highLightimg: "anniu1_select.png")
                }
                
            }
            
            createKey(titleTxt: "ABC",
                                 posX: self.colSpace,
                                 posY: self.logoLabel.frame.size.height + self.rowSpace * 3 + height * 3,
                                 width: width,
                                 hight: height,
                                 forId: ABC,
                                 normalImg: "anniu1.png",
                                 highLightimg: "anniu1_select.png")
    
            
            createKey(titleTxt: "X",
                            posX: self.colSpace * 3 + width * 2,
                            posY: self.logoLabel.frame.size.height + self.rowSpace * 3 + height * 3,
                            width: width,
                            hight: height,
                            forId: DELETE,
                            normalImg: "anniu1.png",
                            highLightimg: "anniu1_select.png")
        }
        
        override func willMove(toSuperview newSuperview: UIView?) {
            super.willMove(toSuperview: newSuperview)
            createNumberAndRandom()
        }
    
    }
    
    
    • 英文键盘类
    import UIKit
    
    let SCREEN_WIDTH = UIScreen.main.bounds.width
    let SCREEN_HEIGHT = UIScreen.main.bounds.height
    let FIT_WIDTH = SCREEN_WIDTH / 320.0
    
    
    class AbcKeyboard: KeyboardBaseView {
    
        lazy var array = NSMutableArray.init(objects:
            "q","w","e","r","t","y","u","i","o","p",
            "a","s","d","f","g","h","j","k","l",
            "z","x","c","v","b","n","m")
        var capitalKeyBgImg :UIImageView?
        
        override func createView(inputView targetView: UITextField, addOnClickListener listener: OnKeyListener) {
            super.createView(inputView: targetView, addOnClickListener: listener)
            for view in self.subviews{
                view.removeFromSuperview()
            }
    
            self.backgroundColor = UIColor.init(patternImage: UIImage.init(named: "bgs.png")!)
            for i in 0..<10{
                createKey(titleTxt: array[i] as! String,
                              posX: 1 + CGFloat(i) * 32.0 * FIT_WIDTH,
                              posY: 5 * FIT_WIDTH,
                             width: 34 * FIT_WIDTH,
                             hight: 48 * FIT_WIDTH,
                             forId: i + 100,
                         normalImg: "tu1 (2).png",
                      highLightimg: "tu1 2.png")
            }
            
            for i in 0..<9{
                createKey(titleTxt: array[i + 10] as! String,
                              posX: 16 + CGFloat(i) * 32.0 * FIT_WIDTH,
                              posY: 53 * FIT_WIDTH,
                             width: 34 * FIT_WIDTH,
                             hight: 48 * FIT_WIDTH,
                             forId: i + 110,
                         normalImg: "tu1 (2).png",
                      highLightimg: "tu1 2.png")
            }
            
            for i in 0..<7{
                createKey(titleTxt: array[i + 19] as! String,
                          posX: 46.0 * FIT_WIDTH + CGFloat(i) * 32.0 * FIT_WIDTH,
                              posY: 103 * FIT_WIDTH,
                             width: 34 * FIT_WIDTH,
                             hight: 48 * FIT_WIDTH,
                             forId: i + 119,
                         normalImg: "tu1 (2).png",
                      highLightimg: "tu1 2.png")
            }
            
            //删除键
            createKey(titleTxt: "",
                      posX: 272.0 * FIT_WIDTH,
                    posY: 103 * FIT_WIDTH,
                   width: 43 * FIT_WIDTH,
                   hight: 49 * FIT_WIDTH,
                   forId: DELETE,
               normalImg: "tu2 2.png",
            highLightimg: "tu2 (2).png")
            
            let deleteKeyBgImg = UIImageView.init(frame: CGRect.init(x: 277*FIT_WIDTH, y:113*FIT_WIDTH, width:32*FIT_WIDTH, height:28*FIT_WIDTH))
            deleteKeyBgImg.image = UIImage.init(named: "tu2 (3).png")
            self.addSubview(deleteKeyBgImg)
            
            //大小切换键
            createKey(titleTxt: "",
                      posX: 1.0 ,
                    posY: 103 * FIT_WIDTH,
                   width: 43 * FIT_WIDTH,
                   hight: 49 * FIT_WIDTH,
                   forId: CAPTIAL,
               normalImg: "tu2 2.png",
            highLightimg: "tu2 (2).png")
            
            let capitalKey = self.viewWithTag(CAPTIAL) as! UIButton
            capitalKey.setBackgroundImage(UIImage.init(named: "tu2 (2).png"), for: .selected)
            
            capitalKeyBgImg = UIImageView.init(frame: CGRect.init(x: 7*FIT_WIDTH, y:113*FIT_WIDTH, width:31*FIT_WIDTH, height:27*FIT_WIDTH))
            capitalKeyBgImg!.image = UIImage.init(named: "da_.png")
            self.addSubview(capitalKeyBgImg!)
            
            //数字123键
            createKey(titleTxt: "",
                      posX: 1.0 ,
                    posY: 152 * FIT_WIDTH,
                   width: 80 * FIT_WIDTH,
                   hight: 49 * FIT_WIDTH,
                   forId: SWITCH_TYPE,
               normalImg: "tu3-4",
            highLightimg: "tu3-04 (2).png")
            
            let num123Label = UILabel.init()
            num123Label.frame = self.viewWithTag(SWITCH_TYPE)!.frame
            num123Label.backgroundColor = UIColor.clear
            num123Label.textColor = UIColor.white
            num123Label.textAlignment = .center
            num123Label.font = UIFont.init(name: "STHeitiSC-Light", size: 18.0 * FIT_WIDTH)
            num123Label.text = "1 2 3"
            self.addSubview(num123Label)
            
            //space键
            createKey(titleTxt: " ",
                      posX: 80 * FIT_WIDTH,
                    posY: 152 * FIT_WIDTH,
                   width: 160 * FIT_WIDTH,
                   hight: 49 * FIT_WIDTH,
                   forId: SPACE,
               normalImg: "tu4 (2).png",
            highLightimg: "tu4 2.png")
            
            let spaceLabel = UILabel.init()
            spaceLabel.frame = self.viewWithTag(SPACE)!.frame
            spaceLabel.backgroundColor = UIColor.clear
            spaceLabel.textColor = UIColor.white
            spaceLabel.textAlignment = .center
            spaceLabel.font = UIFont.init(name: "STHeitiSC-Light", size: 18.0 * FIT_WIDTH)
            spaceLabel.text = " "
            self.addSubview(spaceLabel)
            
            createKey(titleTxt: " ",
                      posX: SCREEN_WIDTH - 80 * FIT_WIDTH,
                    posY: 152 * FIT_WIDTH,
                   width: 80 * FIT_WIDTH,
                   hight: 49 * FIT_WIDTH,
                   forId: SEARCH,
               normalImg: "tu4 (2).png",
            highLightimg: "tu4 2.png")
            
            let searchLabel = UILabel.init()
            searchLabel.frame = self.viewWithTag(SEARCH)!.frame
            searchLabel.backgroundColor = UIColor.clear
            searchLabel.textColor = UIColor.blue
            searchLabel.textAlignment = .center
            searchLabel.font = UIFont.init(name: "STHeitiSC-Light", size: 14.0 * FIT_WIDTH)
            searchLabel.text = "搜索"
            self.addSubview(searchLabel)
        }
        
        override func switchCaptial(button view: UIButton) {
            if view.isSelected {
                view.isSelected = false
                capitalKeyBgImg?.image = UIImage.init(named: "da_.png")
                
                for(idx,obj) in array.enumerated(){
                    let tmp = obj as! String
                    array[idx] = tmp.lowercased()
                    let key = self.viewWithTag(100 + idx) as! UIButton
                    key.setTitle(tmp.lowercased(), for: .normal)
                }
                
            }else{
                view.isSelected = true
                capitalKeyBgImg?.image = UIImage.init(named: "da.png")
                for(idx,obj) in array.enumerated(){
                    let tmp = obj as! String
                    array[idx] = tmp.uppercased()
                    let key = self.viewWithTag(100 + idx) as! UIButton
                    key.setTitle(tmp.uppercased(), for: .normal)
                }
                
            }
             
        }
        
        override func switchKeyboardType() {
            var numKeyboard = KeyboardMgr.shareInstace.keyboardInstanceDict[NumberKeyboard.self.description()]
            if(numKeyboard == nil){
                numKeyboard = NumberKeyboard.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 260))
                KeyboardMgr.shareInstace.keyboardInstanceDict[NumberKeyboard.self.description()] = numKeyboard
            }
            KeyboardMgr.shareInstace.setInputMethodKeyboard(keyboardview: numKeyboard!,
                                                            inputView: textFiled!,
                                                            onKeyClickListener: onClickListener!)
            textFiled?.reloadInputViews()
        }
    
    }
    
    
    • 测试使用例子
    import UIKit
    
    class KeyboardVC: UIViewController {
        
        lazy var textFiled : UITextField = UITextField.init(frame: CGRect.init(x: 20, y: 150, width: 100, height: 50))
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //重新创建一个barButtonItem
            self.navigationController?.isNavigationBarHidden = false
    
            let backItem = UIBarButtonItem.init(title: "Back", style: .done, target: self, action: #selector(onClickListener))
            backItem.tag = 50
            //设置backBarButtonItem即可
            self.navigationItem.leftBarButtonItem = backItem;
            self.navigationItem.title = "标题文字"
            self.view.backgroundColor = UIColor.white
            
        
            textFiled.backgroundColor = UIColor.gray
            self.view.addSubview(textFiled)
            
            let keyBoardView = AbcKeyboard.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 260))
            
            KeyboardMgr.init().setInputMethodKeyboard(keyboardview: keyBoardView, inputView: textFiled, onKeyClickListener: self)
            
            
        
            
            
        }
        
        @objc func onClickListener(){
            self.navigationController?.popViewController(animated: false)
        }
        
    
        /*
        // MARK: - Navigation
    
        // In a storyboard-based application, you will often want to do a little preparation before navigation
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            // Get the new view controller using segue.destination.
            // Pass the selected object to the new view controller.
        }
        */
    
    }
    
    //实现键盘按钮点击协议
    extension KeyboardVC:OnKeyListener{
        
        func onClick(button view: UIButton) {
            print("60---\(String(describing: view.titleLabel?.text))")
        }
        
        func addTextWatch(button view: UIButton, beforeText bStr: String?, curText cStr: String?, afterText aStr: String?) {
            print("65-----beforetext:\(bStr) curtext:\(cStr) aftertext:\(aStr)")
            textFiled.text = aStr
        }
    }
    
    

    objc 版本:

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger, KeyboardType) {
        DecimalNumber       = 0, //带小数点的数据键盘 九宫格布局
        NumberAndRandom     = 1, //随机出现数字键盘  九宫格布局
        Number              = 3, //纯数字键盘
        Default             = 4, //默认的英文键盘 26键布局
      
    };
    
    
    /// 键盘点击协议
    @protocol OnKeyListener <NSObject>
    
    
    @optional
    
    /// 按键点击事件
    /// @param Id 按键id
    /// @param text 当前的文本
    /// @param btn 按键对象
    - (void)onClick:(NSInteger)Id withText:(NSString *_Nullable)text view:(UIButton*_Nullable) btn;
    
    @optional
    /// 文本输入监听协议接口
    /// @param view 按键本身
    /// @param beforeText 上一次输入的文本
    /// @param curText 当前输入的文本
    /// @param afterText 输入之后的文本
    -(void) onTextWatch:(UIButton*_Nullable) view
             beforeText:(NSString*_Nullable) beforeText
                curText:(NSString*_Nullable)curText
              afterText:(NSString*_Nullable)afterText;
    
    @end
    
    
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface KeyboardView : UIView
    @property(assign,nonatomic) NSUInteger colSpace;
    @property(assign,nonatomic) NSUInteger rowSpace;
    @property(strong,nonatomic) UIView* containerView;
    @property(strong, nonatomic) UITextField *tmpTextField;
    @property(weak,nonatomic) id<OnKeyListener> keyClickListener;
    @property(nonatomic,assign) KeyboardType type;
    
    
    ///  设置输入法键盘
    /// @param type 类型
    /// @param inputView 输入视图
    -(void) setInputMethodKeyboard:(KeyboardType) type inputView:(UITextField*) inputView;
    
    -(void) releaseRes;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    
    #import "KeyboardView.h"
    #import "AbcKeyBoardView.h"
    #import <Foundation/Foundation.h>
    #import "NSString+Des3.h"
    
    #define FIT_X          [UIScreen mainScreen].bounds.size.width/320.000
    #define iPhone4        ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
    
    const NSInteger ABC     = 23;
    const NSInteger DELETE  = 24;
    
    @interface KeyboardView(){
        UIButton *pressButtonCapital;
    }
    @property(strong,nonatomic) UIView* logoBgView;
    @property(copy,nonatomic) NSString* beforeInputContent; //注意此处的修饰符,before为临时m赋值,用copy
    @property(strong,nonatomic) NSMutableArray* randomNumArray;
    @property(strong,nonatomic) AbcKeyBoardView* abcKeyboardView;
    
    // 不能使用copy 因为可变对象的拷贝之后变成了为不可变对象,不能再进行内容追加
    @property(strong,nonatomic) NSMutableString* afterInputContent;
    
    @end
    
    @implementation KeyboardView
    
    
    - (instancetype)initWithFrame:(CGRect)frame{
        self = [super initWithFrame:frame];
        if (self) {
            [self initConfig];
        }
        return self;
    }
    
    -(void) initConfig{
        self.rowSpace = 5;
        self.colSpace = 5;
        self.containerView = [UIView new];
        self.containerView.frame = self.frame;
        [self addSubview:self.containerView];
        self.afterInputContent = [[NSMutableString alloc] init];
        self.randomNumArray = [[NSMutableArray alloc] init];
        for (NSInteger i = 0;  i < 10; i ++) {
            [self.randomNumArray addObject:[NSString stringWithFormat:@"%ld",i]];
        }
    }
    
    /// 设置输入法键盘
    /// @param type 类型
    /// @param inputView 输入视图
    -(void) setInputMethodKeyboard:(KeyboardType) type inputView:(UITextField*) inputView{
        if (!inputView) {
            return;
        }
        self.type = type;
        inputView.inputView = self;
        self.tmpTextField = inputView;
        switch (type) {
            case Default:
                [self createDefaultKeyvoardView];
                break;
            case Number:{
                [self createLogoView];
                [self createNumberKeyboardView];
                
            }
                break;
                
            case NumberAndRandom:
                [self createLogoView];
                break;
                
            default:
                break;
        }
    }
    
    - (void)createLogoView{
        self.logoBgView = [UIView new];
        [self setBackgroundColor:[UIColor darkGrayColor]];
        [self.containerView addSubview:self.logoBgView];
        self.logoBgView.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), 44);
    
        UILabel *logoLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.logoBgView.frame), CGRectGetHeight(self.logoBgView.frame))];
        [self.logoBgView addSubview:logoLabel];
        [logoLabel setText:@"硬汉安全键盘"];
        logoLabel.textAlignment = NSTextAlignmentCenter;
        [logoLabel setLineBreakMode:NSLineBreakByWordWrapping];
        [logoLabel setNumberOfLines:0];
        [logoLabel setFont:[UIFont systemFontOfSize:14]];
        [logoLabel setTextColor:[UIColor whiteColor]];
    
        UIButton *btnFinish = [[UIButton alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.logoBgView.frame) / 4 * 3, 0, CGRectGetWidth(self.logoBgView.frame) / 4 , CGRectGetHeight(self.logoBgView.frame))];
        [self.logoBgView addSubview:btnFinish];
        [btnFinish setTitle:@"完成" forState:UIControlStateNormal];
        [btnFinish setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [btnFinish addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchUpInside];
    }
    
    -(void) createNumberKeyboardView{
        CGFloat width = (CGRectGetWidth(self.frame) - self.colSpace * 4) / 3;
        CGFloat height = (CGRectGetHeight(self.frame) - self.rowSpace * 4 - self.logoBgView.frame.size.height) / 4 ;
        for(NSInteger i = 1; i < 10; i ++){
            [self createKey:[NSString stringWithFormat:@"%ld",i]
                       posX:(self.colSpace + self.colSpace * ((i - 1) % 3) +  width * ((i - 1) % 3))
                       posY:(44 + self.rowSpace * ((i - 1) / 3) + height * ((i - 1)/3))
                      width:width
                     height:height
                      forId:i];
        }
        //创建最底部一排的功能键
        [self createKey:[NSString stringWithFormat:@"%@",@"ABC"]
                   posX:(self.colSpace)
                   posY:(self.logoBgView.frame.size.height + self.rowSpace * 3 + height * 3)
                  width:width
                 height:height
                  forId:23];
    
        [self createKey:[NSString stringWithFormat:@"%@",@"0"]
                      posX:(self.colSpace * 2 +  width)
                      posY:(self.logoBgView.frame.size.height + self.rowSpace * 3 + height * 3)
                     width:width
                    height:height
                     forId:0];
    
        [self createKey:[NSString stringWithFormat:@"%@",@"X"]
                   posX:(self.colSpace * 3 +  width * 2)
                   posY:(self.logoBgView.frame.size.height + self.rowSpace * 3 + height * 3)
                  width:width
                 height:height
                  forId:24];
        
    }
    
    
    /// 创建随机数字键盘,即0-9数字在键盘的位置随机出现
    -(void) createNumberAndRandom{
        //随机打乱
        for(NSInteger i = self.randomNumArray.count;i > 0; i --){
            NSInteger random = arc4random() % i;
            NSInteger tmp = [self.randomNumArray[random] intValue];
            self.randomNumArray[random] = self.randomNumArray[i - 1];
            self.randomNumArray[i - 1] = [NSNumber numberWithInteger:tmp];
        }
        CGFloat width = (CGRectGetWidth(self.frame) - self.colSpace * 4) / 3;
        CGFloat height = (CGRectGetHeight(self.frame) - self.rowSpace * 4 - self.logoBgView.frame.size.height) / 4 ;
        
        [self.randomNumArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
            NSString* value = [NSString stringWithFormat:@"%@",obj];
            if(idx == 0){
                [self createKey:value
                          posX:(self.colSpace * 2 +  width)
                          posY:(self.logoBgView.frame.size.height + self.rowSpace * 3 + height * 3)
                         width:width
                        height:height
                         forId:[value intValue]];
            }else{
                [self createKey:value
                          posX:(self.colSpace + self.colSpace * ((idx) % 3) +  width * ((idx) % 3))
                          posY:(self.logoBgView.frame.size.height + self.rowSpace * ((idx - 1) / 3) + height * ((idx - 1)/3))
                         width:width
                        height:height
                         forId:[value intValue]];
            }
        }];
        [self createKey:[NSString stringWithFormat:@"%@",@"ABC"]
                  posX:(self.colSpace)
                  posY:(self.logoBgView.frame.size.height + self.rowSpace * 3 + height * 3)
                 width:width
                height:height
                 forId:ABC];
        
        [self createKey:[NSString stringWithFormat:@"%@",@"X"]
                  posX:(self.colSpace * 3 +  width * 2)
                  posY:(self.logoBgView.frame.size.height + self.rowSpace * 3 + height * 3)
                 width:width
                height:height
                 forId:DELETE];
        
    }
    
    
    /// 创建英文字母键盘,默认的类型为本键盘
    -(void) createDefaultKeyvoardView{
        self.abcKeyboardView = [[AbcKeyBoardView alloc] initWithFrame:self.frame];
        [self.abcKeyboardView createKeyboardView];
        [self addSubview:self.abcKeyboardView];
        
    }
    
    -(void) removeAllSubViews:(UIView*) parentView{
        if (parentView) {
            for(UIView *view in [parentView subviews]){
                [view removeFromSuperview];
            }
        }
    }
    
    - (void)createKey:(NSString *)title
                 posX:(float)posX
                 posY:(float)posY
                width:(float)width
               height:(float)height
                forId:(NSInteger) tag{
        UIButton *btnKey = [[UIButton alloc]initWithFrame:CGRectMake(posX, posY, width, height)];
        [self.containerView addSubview:btnKey];
        btnKey.layer.cornerRadius = 5;
        btnKey.tag = tag;
        [btnKey addTarget:self action:@selector(buttonDidClicked:) forControlEvents:UIControlEventTouchUpInside];
        [btnKey setTitle:title forState:UIControlStateNormal];
        [btnKey setBackgroundColor:[UIColor lightGrayColor]];
        //[btnKey setBackgroundImage:[CommonFunc imageWithColor:[UIColor orangeColor]] forState:UIControlStateHighlighted];
    }
    
    - (void)buttonDidClicked:(UIButton*)sender{
        self.tmpTextField.text = sender.titleLabel.text;
        
        switch (sender.tag) {
                
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
            case 0:
                [self.afterInputContent appendString:sender.titleLabel.text];
            break;
                
            case ABC:
                
                break;
                
            case DELETE:{
                if(self.afterInputContent.length > 0){
                    NSString* minusStr = [self.afterInputContent substringToIndex:self.afterInputContent.length - 1];
                    [self.afterInputContent setString:minusStr] ;
                }
            }
                
                break;
                
            default:
                break;
        }
       
        if ([self.keyClickListener respondsToSelector:@selector(onClick:withText:view:)]) {
               [self.keyClickListener onClick:sender.tag withText:sender.titleLabel.text view:sender];
           }
        if ([self.keyClickListener respondsToSelector:@selector(onTextWatch:beforeText:curText:afterText:)]) {
            
            [self.keyClickListener onTextWatch:sender beforeText:self.beforeInputContent curText:sender.titleLabel.text afterText:self.afterInputContent];
            self.beforeInputContent = self.afterInputContent;
        }
           
    }
    
    
    - (void)willMoveToSuperview:(UIView *)newSuperview{
        if (self.type == NumberAndRandom) {
            [self createNumberAndRandom];
        }
        
    }
    
    -(void)layoutSubviews{
        [super layoutSubviews];
    
    }
    
    - (void)hideKeyboard{
        [self.tmpTextField endEditing:YES];
        //[self.tmpTextField resignFirstResponder];
    }
    
    -(void) releaseRes{
        self.beforeInputContent = nil;
        self.afterInputContent = nil;
    }
    
    @end
    
    
    
    • 测试
    @interface KeyboardVC ()<OnKeyListener>
    @property(strong,nonatomic) UITextField* textField;
    @property(strong,nonatomic) KeyboardView* keyboardView;
    
    @end
    
    @implementation KeyboardVC
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        self.textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 40, 200, 50)];
        self.textField.backgroundColor = [UIColor grayColor];
        [self.view addSubview:self.textField];
        
        self.keyboardView = [[KeyboardView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, 260)];
        
        //self.textField.inputView = self.keyboardView;
        //self.keyboardView.m_textField = self.textField;
        [self.keyboardView setInputMethodKeyboard:Number inputView:self.textField];
        [self.keyboardView setKeyClickListener:self];
        
        [self setUpForDismissKeyboard];
    
        
    }
    #pragma OnKeyListener 协议实现方式
    - (void)onClick:(NSInteger)Id withText:(NSString *)text view:(UIButton *)btn{
        
    }
    -(void) onTextWatch:(UIButton*_Nullable) view
             beforeText:(NSString*_Nullable) beforeText
                curText:(NSString*_Nullable) curText
              afterText:(NSString*_Nullable) afterText{
        NSLog(@"37-------before:%@  curtext:%@  afterText:%@",beforeText,curText,afterText);
        self.textField.text = afterText;
       
    }
    //  end
    
    //除输入框之外 ,点击屏幕其他地方收起键盘
    - (void)setUpForDismissKeyboard {
      NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
      UITapGestureRecognizer *singleTapGR =
      [[UITapGestureRecognizer alloc] initWithTarget:self
                                              action:@selector(tapAnywhereToDismissKeyboard:)];
      NSOperationQueue *mainQuene =[NSOperationQueue mainQueue];
      [nc addObserverForName:UIKeyboardWillShowNotification
                      object:nil
                       queue:mainQuene
                  usingBlock:^(NSNotification *note){
                    [self.view addGestureRecognizer:singleTapGR];
                  }];
      [nc addObserverForName:UIKeyboardWillHideNotification
                      object:nil
                       queue:mainQuene
                  usingBlock:^(NSNotification *note){
                    [self.view removeGestureRecognizer:singleTapGR];
                  }];
    }
    
    - (void)tapAnywhereToDismissKeyboard:(UIGestureRecognizer *)gestureRecognizer {
      [self.view endEditing:YES];
    }
    
    
    @end
    
    

    相关文章

      网友评论

          本文标题:IOS自定义键盘

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