c2c网站页面设计特点,河南一般建一个网站需要多少钱,定制网站开发公司电话,西安网页制作在 iPhone 上面開發應用程式時, 在使用輸入鍵盤時, 或多或少都會遇到客制化鍵盤的問題, 這邊筆者以簡單的數字鍵盤來示範客制化的動作. 這部份我想網路上已經有不少 sample code , 但大部份基本上都是以 SDK 3.x 的版本去實作, 以特定寫法來實作客制化在 iOS4 會有…在 iPhone 上面開發應用程式時, 在使用輸入鍵盤時, 或多或少都會遇到客制化鍵盤的問題, 這邊筆者以簡單的數字鍵盤來示範客制化的動作. 這部份我想網路上已經有不少 sample code , 但大部份基本上都是以 SDK 3.x 的版本去實作, 以特定寫法來實作客制化在 iOS4 會有問題, 這部份稍候會提到兩版本的差異. 上述看到的例子是 UIKeyboardTypeNumberPad 搭配 Done 的圖示所組合而成的. 在開始介紹如何實作之前, 先稍微提一下網路上查到的一些範例寫法. 因為 SDK 升版之後在架構上有做了些修改, 所以導致行為上的不正確. 以下面這例子為例, 它可以正常的在 iOS4 之前的版本運行, 但在 iOS4 上卻會有看不到上面 Done 圖示的問題. - (void)loadView{ ... textFieldContent.delegate self; textFieldContent.placeholder press me; textFieldContent.keyboardType UIKeyboardTypeNumberPad; textFieldContent.returnKeyType UIReturnKeyDone; [self.viewaddSubview:textFieldContent]; [textFieldContentrelease]; [[NSNotificationCenterdefaultCenter] addObserver:self selector:selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } - (void)keyboardWillShowOnDelay:(NSNotification*)notification{ UIButton*doneButton [UIButtonbuttonWithType:UIButtonTypeCustom]; doneButton.frame CGRectMake(0, 163, 106, 53); doneButton.adjustsImageWhenHighlighted NO; [doneButton setImage:[UIImageimageNamed:DoneUp.png] forState:UIControlStateNormal]; [doneButton setImage:[UIImageimageNamed:DoneDown.png] forState:UIControlStateHighlighted]; [doneButton addTarget:selfaction:selector(doneButton:) forControlEvents:UIControlEventTouchUpInside]; UIWindow* tempWindow [[[UIApplicationsharedApplication] windows] objectAtIndex:1]; UIView* keyboard; for(inti0; i[tempWindow.subviewscount]; i) { keyboard [tempWindow.subviewsobjectAtIndex:i]; if([[keyboard description] hasPrefix:UIKeyboard] YES) [keyboard addSubview:doneButton]; } } 上述這段代碼主要原理是透過跟 OS 註冊 keyboard 相關的 notification, 並在顯示keyboard 時, 在 keyboard view 上添加所需要的特定 UIView, 簡單流程大致如下1. 註冊 UIKeyboardWillShowNotification : 當 keyboard 要秀時, OS 就會呼叫 keyboardWillShow2. 當被 keyboardWillShow 叫用時, 搜尋屬於 keyboard 的 view if([[keyboard description] hasPrefix:UIKeyboard] YES)3. 當找到所需要的 view 時, 再將需要的 view 加入即可 [keyboard addSubview:doneButton];上面就是一個 customized keyboard 的簡單實作流程. 但是為什麼這段 code 會無法在 iOS4 上正確執行呢? 問題點主要出在上述的第 2 個步驟.在舊的 SDK 中, 當 UIKeyboardWillShowNotification 事件發生且叫用 keyboardWillShow 時, 此時的 keyboard view 已經被添加到 windows 裡了, 但是在 iOS4 的世界中, 相同情況發生時, keyboard view 卻會在下個 event loop 裡才會被添加到 windows 中, 也就是因為如此, 所以上述[[[UIApplication sharedApplication] windows] objectAtIndex:1];會找不到 keyboard view. 除了這原因以外, 還有另一個重要的差異性, 第 2 步驟所比對的 UIKeyboard 字串在 iOS4 中也被修正過, 它被藏在 UIPeripheralHostView 裡. 針對這兩點, 所以將只要將之修正即可正常的在 iOS4 上執行1. keyboard view 既然知道是 keyboard view 會在下個 event loop 才會被放到 windows 裡, 所以我們 可以透過下面方式將 keyboardWillShow 延遲叫用 [self performSelector:selector(keyboardWillShow:) withObject:nil afterDelay:0];2. 修正比對 UIKeyboard 的方式 if ([[possibleKeyboard description] hasPrefix:UIPeripheralHostView]) possibleKeyboard [[possibleKeyboard subviews] objectAtIndex:0]; if ([[possibleKeyboard description] hasPrefix:UIKeyboard]) { foundKeyboard possibleKeyboard; break; } 經過上述兩個修正之後的 code 大概會如下 : [[NSNotificationCenterdefaultCenter] addObserver:self selector:selector(keyboardWillShowOnDelay:) name:UIKeyboardWillShowNotification object:nil]; - (void)keyboardWillShowOnDelay:(NSNotification *)notification { [selfperformSelector:selector(keyboardWillShow:) withObject:nilafterDelay:0]; } - (void)keyboardWillShow:(NSNotification *)notification { UIView *foundKeyboard nil; UIWindow *keyboardWindow nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual:[UIWindow class]]) { keyboardWindow testWindow; break; } } if (!keyboardWindow) return; for (UIView *possibleKeyboard in [keyboardWindow subviews]) { //iOS3 if ([[possibleKeyboard description] hasPrefix:UIKeyboard]) { foundKeyboard possibleKeyboard; break; } else { // iOS 4 sticks the UIKeyboard inside a UIPeripheralHostView. if ([[possibleKeyboard description] hasPrefix:UIPeripheralHostView]) { possibleKeyboard [[possibleKeyboard subviews] objectAtIndex:0]; } if ([[possibleKeyboard description] hasPrefix:UIKeyboard]) { foundKeyboard possibleKeyboard; break; } } } if (foundKeyboard) { // create custom button UIButton*doneButton [UIButtonbuttonWithType:UIButtonTypeCustom]; doneButton.frame CGRectMake(0, 163, 106, 53); doneButton.adjustsImageWhenHighlighted NO; [doneButton setImage:[UIImageimageNamed:DoneUp.png] forState:UIControlStateNormal]; [doneButton setImage:[UIImageimageNamed:DoneDown.png] forState:UIControlStateHighlighted]; [doneButton addTarget:selfaction:selector(doneButton:) forControlEvents:UIControlEventTouchUpInside]; [foundKeyboard addSubview:doneButton]; } } If you have ever written an iPhone app that requires numeric input,then you surely know about the UIKeyboardTypeNumberPad. And if you haveever used that flavor of the iPhones keyboard, then you surely knowthat it lacks one very important feature: The UIKeyboardTypeNumberPaddoes not have a return key.In fact every other keyboard type (except for the pretty similarUIKeyboardTypePhonePad) does offer the possibility to be dismissed bysetting the returnKeyType property of the correspondingUITextInputTraits implementor. So how does one achieve the same effectwith the number pad? We have found a workround!When looking at the number pad, youll notice that there is anunused space on its bottom left. Thats where we are going to plug inour custom return key. To make it short: take a screenshot, cut out the whole backspacekey, flip it horizotally, clear its backspace symbol in Photoshop andoverlay it with the text that we want on our “return” key. We’ve chosento label it “DONE”. Now we have the image for our custombutton’s UIControlStateNormal. Repeat the whole procedure (with atouched backspace key when taking the screenshot) to get a second imagefor our button’s UIControlStateHighlighted. Here’s the result: Now back to coding. First we need to know when the number pad isgoing to be slided up on the screen so we can plug in our custom buttonbefore that happens. Luckily there’s a notification for exactly thatpurpose, and registering for it is as easy as: [[NSNotificationCenter defaultCenter] addObserver:self selector:selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [/pre]Dont forget to remove the observer from the notification center in the appropriate place once youre done with the whole thing: [[NSNotificationCenter defaultCenter] removeObserver:self];[/pre]Now we’re getting to the heart of it. All we have to do in thekeyboardWillShow method is to locate the keyboard view and add ourbutton to it. The keyboard view is part of a second UIWindow of ourapplication as others have already figured out (see this thread).So we take a reference to that window (it will be the second window inmost cases, so objectAtIndex:1 in the code below is fine), traverse itsview hierarchy until we find the keyboard and add the button to itslower left: - (void)keyboardWillShow:(NSNotification *)note { // create custom button UIButton *doneButton [UIButton buttonWithType:UIButtonTypeCustom]; doneButton.frame CGRectMake(0, 163, 106, 53); doneButton.adjustsImageWhenHighlighted NO; [doneButton setImage:[UIImage imageNamed:DoneUp.png] forState:UIControlStateNormal]; [doneButton setImage:[UIImage imageNamed:DoneDown.png] forState:UIControlStateHighlighted]; [doneButton addTarget:self action:selector(doneButton:) forControlEvents:UIControlEventTouchUpInside]; // locate keyboard view UIWindow* tempWindow [[[UIApplication sharedApplication] windows] objectAtIndex:1]; UIView* keyboard; for(int i0; i[tempWindow.subviews count]; i) { keyboard [tempWindow.subviews objectAtIndex:i]; // keyboard view found; add the custom button to it if([[keyboard description] hasPrefix:UIKeyboard] YES) [keyboard addSubview:doneButton]; }}[/pre]Voilà, that’s it! The empty space for our button starts atcoordinate (0, 163) and has the dimensions (106, 53). The doneButtonmethod has to be written now of course, but that’s not hard any more.Just make sure that you call resignFirstResponder on the text fieldthat is being edited to have the keyboard slide down. 有一种思路叫寄生...我相信是懒人推动了世界的发展既然iphone有了自己的软件盘我们什么还要自己实现其功能呢。so只要寄生在上面就行了。感谢alan转载的文章给的灵感。http://www.cocoachina.com/bbs/read.php?tid-3999.html思路1.用静态方法找到应用程序当前view(window)中的UIKeyboard的view2.在键盘的view上帖上自己的view精彩了这个自己的view就是你自己键盘任意发挥什么类型键盘都可以做了3.根据需要调整系统键盘的大小以满足你想要的尺寸4.给自己的键盘view上的button添加方法实现功能主要代码添加自身类为键盘事件的观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:selector(keyboardWillShow:) name:UIKeyboardWillShowNotificationobject:nil]; 核心思路代码 - (void)keyboardWillShow:(NSNotification *)note{ UIWindow* tempWindow [[[UIApplication sharedApplication] windows] objectAtIndex:1];//知识点 for(int i0; i[tempWindow.subviews count]; i) { keyboard [tempWindow.subviews objectAtIndex:i];if([[keyboard description] hasPrefix:UIKeyboard] YES) { [keyboard setFrame:CGRectMake(0, 460, 320, 345)]; [self congfigKeypad]; [keyboard addSubview:keyPadView1]; } }} 比如配置方法可以是这样 -(void)congfigKeypad{ SearBtn *one [[SearBtn alloc] initWithFrame:CGRectMake(81, 3, kNumPadW, kNumPadH) index:1 ContextString:1 type:kNumPadType]; [one setImage:[UIImage imageNamed:1.png] forState:UIControlStateNormal]; [one addTarget:self action:selector(buttonClickAtIndex:) forControlEvents:UIControlEventTouchUpInside];//......略} 添加NSMutalbeString作为文本域字串的容器点击button后append的button对应的字串。 - (void)buttonClickAtIndex:(id)sender{ SearBtn *btnItem (SearBtn*)sender; NSString *str btnItem-btnText; [s_text appendString:str]; [sBar setText:s_text];} 再实现一个deleteChar的方法作为退格键思路 if ([s_text length] 0) { NSRange rang; rang.location [s_text length] - 1; rang.length 1; [s_text deleteCharactersInRange:rang]; } 现在点击各种文本域应该就可以现实自己的键盘了。继续优化用textfield的代理方法控制键盘的字串类型长度和响应消失 [ 此帖被evangel在2009-12-17 22:32重新编辑 ] 图片:图片 1.png 图片:图片 2.png Q如果是通过[langobjc][/lang]来显示代码的话就不能再编辑了不然都是乱码……A 也可以要先把代码去掉提交一次然后再加上代码修改再提交一次…… 隐藏键盘 UIWindow* tempWindow [[[UIApplication sharedApplication] windows] objectAtIndex:1]; UIView* keyboard; for(int i0; i[tempWindow.subviews count]; i) { keyboard [tempWindow.subviews objectAtIndex:i]; // keyboard view found; add the custom button to it if([[keyboard description] hasPrefix:UIKeyboard] YES) //[keyboard addSubview:keyboardView]; keyboard.hiddenYES; }还能隐藏键盘使用自己的view载入动画和控制位置也不需要担心背景是否会显示出默认键盘lucky 多个页面应该不会有问题切换页面时候键盘就消失了。同一个页面的时候1。设置键的view为实例变量2。给有自定义键盘的那个textfield添加delegate方法:- (void)textFieldDidEndEditing:(UITextField *)tf;在这个方法里[myKeyPad removeFromSuperview];3。在- (void)keyboardWillShow:(NSNotification *)note;里判断有自定键盘的textfield为firstResponder时候再add键盘的view。if([textField isFirstResponder]) [myKeyPad addSubview:doneButton];当然还有很多别的方法 重新回复一下这个帖子因为时间过去大半年了我用SDK4.0无法按照楼主的代码直接实现而是做了一点点的修改才能实现。大家谁有时间帮忙用最新SDK测试一下看看是不是如此。问题与修改1原帖中用UIKeyboardWillShowNotificationtempWindow [[[UIApplication sharedApplication] windows] objectAtIndex:1] 的subview数目为0我改UIKeyboardDidShowNotification一切正常。问题与修改2原帖中用了字符串UIKeyboard来检测键盘的view在我这不管用。我改用了UIPeripheralHostView结果修改后在SDK4.0的模拟器和真机上测试ok 转载于:https://www.cnblogs.com/pengyingh/articles/2418150.html