我需要(即客户要求)为用户提供自定义键盘,以便在文本字段和区域中键入文本。我已经有一些东西可以做键盘并将测试附加到文本字段,但是我想让它更通用并让它像标准的 iphone 键盘一样,即当用户选择可编辑的文本控件时出现。目前我的控制器知道目标并且目标不可编辑以防止标准键盘。
有没有办法挂钩文本控件的行为,以便我轻松使用自己的键盘?
谢谢,维克
我需要(即客户要求)为用户提供自定义键盘,以便在文本字段和区域中键入文本。我已经有一些东西可以做键盘并将测试附加到文本字段,但是我想让它更通用并让它像标准的 iphone 键盘一样,即当用户选择可编辑的文本控件时出现。目前我的控制器知道目标并且目标不可编辑以防止标准键盘。
有没有办法挂钩文本控件的行为,以便我轻松使用自己的键盘?
谢谢,维克
这是一个想法:根据自己的需要修改现有键盘。首先,注册以在它出现在屏幕上时收到通知:
[[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
请不要在任何生产代码中使用这样的东西。另外,我还没有实际测试过,所以 YMMV。
这取决于您想要它的自定义程度。我个人想要一个纯数字键盘,但不喜欢数字键盘,所以我使用了标准键盘并添加了一个标准过滤器,这是选项的一部分,它拒绝所有不是数字或空格的按键或删除。
不过,我不能说 Apple 是否会喜欢这个,而且你将很难编写自己的行为,就像其他键盘一样。如此之多,以至于它应该被宣布为一个坏主意。
根据您的评论进行更新听起来更像是您只需要创建一个上面有很多按钮的视图,然后在打开动画选项的情况下移动这个视图。然后它可以像键盘一样从底部向上滑动,并在关闭时再次滑开。