我需要(即客户需求)为用户提供自定义键盘,以便在文本字段和区域中输入文本。我已经有了一个可以使用键盘并将测试附加到文本字段的东西,但是我想使它更通用,并使其像标准的iPhone键盘一样,即当用户选择可编辑的文本控件时出现。目前,我的控制器知道目标,并且目标是不可编辑的,以防止标准键盘。
有没有办法钩入文本控件的行为,以便我可以轻松地使用自己的键盘?
谢谢,Vic
有没有办法钩入文本控件的行为,以便我可以轻松地使用自己的键盘?
谢谢,Vic
这是一个想法:修改现有的键盘以适应您的需求。 首先,注册以在屏幕上出现时得到通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(modifyKeyboard:)
name:UIKeyboardWillShowNotification
object:nil];
然后,在你的 modifyKeyboard
方法中:
- (void)modifyKeyboard:(NSNotification *)notification
{
UIView *firstResponder = [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)];
for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows])
for (UIView *keyboard in [keyboardWindow subviews])
if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
{
MyFancyKeyboardView *customKeyboard = [[MyFancyKeyboardView alloc] initWithFrame: CGRectMake(0, 0, keyboard.frame.size.width, keyboard.frame.size.height);
[keyboard addSubview: customKeyboard];
[customKeyboard release];
}
}
这会将您的视图叠加在原始键盘之上,因此请确保将其设置为不透明。
您可以在 iOS 3.2 或更高版本中完成。有关详细信息,请检查 UITextField 的 inputView 属性。
@interface UIControl(CustomKeyboard)
- (BOOL)__my__becomeFirstResponder
@end
@implementation UIControl(CustomKeyboard)
- (BOOL)__my__becomeFirstResponder
{
BOOL becameFirstResponder = [self __my__becomeFirstResponder];
if ([self canBecomeFirstResponder]) {
[MyKeyboard orderFront];
}
return becameFirstResponder;
}
+ (void)initialize
{
Method old = class_getInstanceMethod(self, @selector(becomeFirstResponder));
Method new = class_getInstanceMethod(self, @selector(__my__becomeFirstResponder));
method_exchangeImplementations(old, new);
}
@end
请不要在任何生产代码中使用类似的内容。此外,我实际上还没有测试过这个,所以你的结果可能会有所不同。
这取决于您需要多少自定义。我个人想要一个仅包含数字的键盘,但不喜欢数字键盘,所以我使用了标准键盘并添加了一个标准过滤器,该过滤器是选项的一部分,它拒绝所有不是数字、空格或删除键的按键。
我无法确定苹果是否会喜欢这种方法,而且编写类似其他键盘行为的自己的代码将非常困难。因此,这应该被视为一个不好的想法。
更新 根据您的评论,听起来更像是您只需要创建一个带有许多按钮的视图,并打开动画选项,将此视图移动。然后它就可以像键盘一样从底部滑上来,当关闭时再次滑走。