自定义 iPhone 键盘

8
我需要(即客户需求)为用户提供自定义键盘,以便在文本字段和区域中输入文本。我已经有了一个可以使用键盘并将测试附加到文本字段的东西,但是我想使它更通用,并使其像标准的iPhone键盘一样,即当用户选择可编辑的文本控件时出现。目前,我的控制器知道目标,并且目标是不可编辑的,以防止标准键盘。
有没有办法钩入文本控件的行为,以便我可以轻松地使用自己的键盘?
谢谢,Vic

希望你的客户不打算将这个(可能是非游戏)应用提交到App Store... - Marc W
更改iPhone的核心UI组件? - Marc W
你尝试过标准的 addTarget:action:forControlEvents: 吗?如果是这样,它为什么不能满足你的需求呢? - Sixten Otto
正如我在下面提到的,我们只是在原型阶段尝试触摸界面。然而,似乎有一些限制阻止软件使用其自定义输入控件。我刚刚拿到了一个设备,老实说,键盘完全无法输入超过一个或两个单词,我曾考虑为自己的小笔记应用程序编写类似T9的编辑器。 - vickirk
4个回答

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

这会将您的视图叠加在原始键盘之上,因此请确保将其设置为不透明。


另一个有趣的想法,谢谢,我也会尝试一下,谢谢。 - vickirk

10

您可以在 iOS 3.2 或更高版本中完成。有关详细信息,请检查 UITextField 的 inputView 属性。


7
只要您不将应用程序提交到应用商店,就可以使用一种称为“方法交换”的技术,在运行时动态替换核心类的方法。例如:
@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

不要在任何生产代码中使用类似的内容。此外,我实际上还没有测试过这个,所以你的结果可能会有所不同。


0

这取决于您需要多少自定义。我个人想要一个仅包含数字的键盘,但不喜欢数字键盘,所以我使用了标准键盘并添加了一个标准过滤器,该过滤器是选项的一部分,它拒绝所有不是数字、空格或删除键的按键。

我无法确定苹果是否会喜欢这种方法,而且编写类似其他键盘行为的自己的代码将非常困难。因此,这应该被视为一个不好的想法。

更新 根据您的评论,听起来更像是您只需要创建一个带有许多按钮的视图,并打开动画选项,将此视图移动。然后它就可以像键盘一样从底部滑上来,当关闭时再次滑走。


很不幸,我们需要的键盘并不仅仅是一个带有字符的键盘,它上面有一些字符(真正的其余部分可能被隐藏在这种方式下),但是有一些按钮可以做更多的事情而不仅仅是输入单个字符。虽然我可以在其他地方添加按钮,但这将是违反直觉和难看的。我已经按要求使键盘工作了,我只需要轻松地将其连接起来,只是希望 Android 上的触摸功能与 iPod 一样稳定 :-( - vickirk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接