iOS-自定义键盘

声明协议

import UIKit
protocol LYMKeyBoardDelegate {
func showButtonTitle(buttonTitle:String)
}

class文件

class LYMKeyBoard: UIView {
//代理
var delegate:LYMKeyBoardDelegate?

//自定义控件
//1.继承uiview创建新的类
//2.确定自定义控件上的子视图
//3.在构造方法中单纯的创建子视图(不去设置feame相关属性)
//4.在layoutSubviews()设置子视图frame
override init(frame: CGRect) {
    super.init(frame: frame)
    //确定每个按钮上要显示的内容
    let contents = ["1","2","3","4","5","6","7","8","9","0","X","返回"]
    // 创建显示内容所对应的按钮
    for item in contents {
        //创建按钮
        let button = UIButton()
        //设置文字
        button.setTitle(item, forState: .Normal)
        button.setImage(UIImage.init(named: "cry"), forState: .Normal)
        button.addTarget(self, action: #selector(btnAction(_:)), forControlEvents: .TouchUpInside)
        button.layer.borderWidth = 2
        button.layer.borderColor = UIColor.blackColor().CGColor
        self.addSubview(button)
    }
}

调用协议

func btnAction(btn:UIButton){
//按钮点击之后想要将按钮的内容显示在textfeild上面,但是当前keyboard做不到。想要viewController来帮他做。->代理模式
//三要素
//委托:LYMKeyBoard
//协议:想要将按钮的内容显示在textfeild上面
//代理:viewController

//按钮点击的时候让按钮显示按钮的title
self.delegate?.showButtonTitle(btn.currentTitle!)
    
    }
    

//只有在视图中创建或重写了构造方法,那么就必须实现下面的这个方法
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

这个方法只有在视图真正的显示在界面上的时候才会第一次调用

override func layoutSubviews() {
    //公共属性:
    //间距
    let margin:CGFloat = 15
    //keyBoard的宽=屏幕的宽
    let keyWidth = UIScreen.mainScreen().bounds.size.width
    let keyHeight = self.frame.size.height
    //按钮的宽度和高度,
    let width = (keyWidth - 4*margin)/3
    let height = (keyHeight - margin*5)/4
    var i = 0
    for item in self.subviews{
         //保存当前按钮对应的位置
        //判段一个对象的类型是否是指定的类型
        if item.isKindOfClass(UIButton.self){
            //强制转换(将UIView强者转换成UIButton),前提是被转换的对象的实质就是被转换的类型
            let button = item as! UIButton
            //计算按钮的frame
            let x = (margin+width)*CGFloat(i%3) + margin
            let y = (margin+height)*CGFloat(i/3) + margin
            
            button.frame = CGRectMake(x, y, width, height)
            i += 1
        
        }else{
            print("不是按钮")
        }
    }
}
}

2.调用自定义键盘

import UIKit

class ViewController: UIViewController {
//MARK:生命周期
 let textFeild = UITextField()
override func viewDidLoad() {
    super.viewDidLoad()
    textFeild.frame = CGRectMake(100, 100, 250, 50)
    textFeild.backgroundColor = UIColor.yellowColor()
    textFeild.background = UIImage.init(named: "cry")
    self.view.addSubview(textFeild)
    
    //创建自己的键盘
    let keyBoard = LYMKeyBoard.init(frame: CGRectMake(0, 0, 0, 256))
    //设置代理
    keyBoard.delegate = self
    keyBoard.backgroundColor = UIColor.greenColor()
    textFeild.inputView = keyBoard
    
    //切原角(所有视图都可以)
    //每个视图都有一个layer,专门负责视图的显示
    //让layer可以裁剪
    textFeild.layer.masksToBounds = true
    //设置圆角半径
    textFeild.layer.cornerRadius = 30
    //加边框
    //设置边框的宽度
    textFeild.layer.borderWidth = 3
    //设置边框的颜色
    textFeild.layer.borderColor = UIColor.brownColor().CGColor
    


}

}

遵守协议方法

extension ViewController:LYMKeyBoardDelegate{
func showButtonTitle(buttonTitle: String) {
    //获取到textfeild原来的内容
    var textStr = ""
    if let str = textFeild.text{
        textStr = str
    }
    //如果按钮点击的是”返回“
    if buttonTitle == "返回"{
        textFeild.resignFirstResponder()
        //键盘收起之后,当前函数直接结束
        return
    }
    if buttonTitle == "X"{
        //判断textfeild是否为空?
        if textFeild.text?.isEmpty == false {
        let index = textFeild.text?.endIndex.predecessor()
       textStr.removeAtIndex(index!)
        //将删除后的内容在赋值给textfield
            textFeild.text = textStr
        }
            return
    }

    //如果没有点击返回和删除就将点击的内容拼接到原来的内容上
    textFeild.text = textStr+buttonTitle
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容