自定义iPhone键盘

时间:2009-10-22 23:13:53

标签: iphone user-interface iphone-softkeyboard

我需要(即客户要求)为用户提供自定义键盘,以便在文本字段和区域中键入文本。我已经有了键盘的功能并将测试附加到文本字段,但是我想使它更通用并使其像标准的iphone键盘一样,即当用户选择可编辑的文本控件时出现。目前我的控制器知道目标,目标是不可编辑的,以防止标准键盘。

有没有办法挂钩文本控件的行为,所以我很容易使用自己的键盘?

谢谢,维克

4 个答案:

答案 0 :(得分:11)

这是一个想法:根据您自己的需要修改现有键盘。首先,注册以在屏幕上显示时收到通知:

[[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];
            }
}

这会将您的视图添加到原始键盘的顶部,因此请确保将其设置为不透明。

答案 1 :(得分:10)

您可以使用iOS 3.2或更高版本。检查UITextField的inputView属性以获取详细信息。

答案 2 :(得分:7)

只要您没有将应用程序提交到应用程序商店,就可以使用名为方法swizzling 的技术在运行时动态替换核心类的方法。例如:

@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。

答案 3 :(得分:0)

这取决于你想要的自定义方式。我个人想要一个只有数字键盘,但不喜欢数字键盘,所以我使用标准键盘并添加到标准过滤器中,这是选项的一部分,它拒绝所有不是数字或空格的按键或删除。

我不能说Apple是否会喜欢这个,而且你会很难写出自己的行为,就像其他键盘一样。所以,它应该被宣布为一个坏主意。

根据您的评论

更新,听起来更像是您只需创建一个包含大量按钮的视图,并在启用animate选项的情况下移动此视图。然后它可以像键盘一样从底部向上滑动,并在被解雇时再次滑开。