自定义键盘

有一种思路叫寄生...


我相信是懒人推动了世界的发展,既然iphone有了自己的软件盘,我们什么还要自己实现其功能呢。
so,只要寄生在上面就行了。

感谢alan转载的文章给的灵感。
http://www.cocoachina.com/bbs/read.php?tid-3999.html

思路:
1.用静态方法找到应用程序当前view(window)中的UIKeyboard的view
2.在键盘的view上帖上自己的view,(精彩了,这个自己的view就是你自己键盘,任意发挥,什么类型键盘都可以做了)
3.根据需要调整系统键盘的大小以满足你想要的尺寸
4.给自己的键盘view上的button添加方法,实现功能

主要代码:
添加自身类为键盘事件的观察者
复制代码
  1. [[NSNotificationCenter defaultCenter] addObserver:self
  2. selector:@selector(keyboardWillShow:)
  3. name:UIKeyboardWillShowNotification
  4. object:nil];


核心思路代码:
复制代码
  1. - (void)keyboardWillShow:(NSNotification *)note
  2. {
  3. UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];//知识点
  4. for(int i=0; i
  5. {
  6. keyboard = [tempWindow.subviews objectAtIndex:i];
  7. if([[keyboard description] hasPrefix:@"<uikeyboard yes><li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">{</li> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">[keyboard setFrame:CGRectMake(0, 460, 320, 345)];</li> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">[self congfigKeypad];</li> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;"> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">[keyboard addSubview:keyPadView1];</li> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;"> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">}</li> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">}</li> <li style="outline-style: none; outline-width: initial; outline-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #CCCCCC; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(247, 247, 247); font-size: 12px; list-style-type: decimal; background-position: initial initial; background-repeat: initial initial;">}</li> </uikeyboard>


比如配置方法可以是这样:
复制代码
  1. -(void)congfigKeypad
  2. {
  3. SearBtn *one = [[SearBtn alloc] initWithFrame:CGRectMake(81, 3, kNumPadW, kNumPadH) index:1 ContextString:@"1" type:kNumPadType];
  4. [one setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];
  5. [one addTarget:self action:@selector(buttonClickAtIndex:) forControlEvents:UIControlEventTouchUpInside];
  6. //......略
  7. }


添加NSMutalbeString作为文本域字串的容器,点击button后append的button对应的字串。
复制代码
  1. - (void)buttonClickAtIndex:(id)sender
  2. {
  3. SearBtn *btnItem = (SearBtn*)sender;
  4. NSString *str = btnItem->btnText;
  5. [s_text appendString:str];
  6. [sBar setText:s_text];
  7. }
;

再实现一个deleteChar的方法作为退格键
思路:
复制代码
  1. if ([s_text length] > 0)
  2. {
  3. NSRange rang;
  4. rang.location = [s_text length] - 1;
  5. rang.length = 1;
  6. [s_text deleteCharactersInRange:rang];
  7. }


现在点击各种文本域,应该就可以现实自己的键盘了。

继续优化
用textfield的代理方法控制键盘的字串类型,长度,和响应消失
[ 此帖被evangel在2009-12-17 22:32重新编辑 ]
图片:图片 1.png
自定义键盘
图片:图片 2.png
自定义键盘