代码之家  ›  专栏  ›  技术社区  ›  vickirk

定制iPhone键盘

  •  8
  • vickirk  · 技术社区  · 15 年前

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

    有没有一种方法可以钩住文本控件的行为,让我轻松地使用自己的键盘?

    谢谢,维克

    4 回复  |  直到 12 年前
        1
  •  11
  •   luvieere    15 年前

    这里有一个想法:根据自己的需要修改现有的键盘。首先,当它出现在屏幕上时,注册以获得通知:

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

        2
  •  10
  •   dwery    12 年前

    您可以使用iOS 3.2或更高版本来实现。有关详细信息,请检查UITextField的inputView属性。

        3
  •  7
  •   ianh    15 年前

    只要你没有向应用商店提交你的应用,你就可以使用一种叫做 在运行时动态替换核心类的方法。例如:

    @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
    

        4
  •  0
  •   dlamblin    15 年前

    这取决于你想要什么样的定制。我个人想要一个数字键盘,但不喜欢数字键盘,所以我使用标准键盘并添加了一个标准过滤器,这是选项的一部分,它拒绝所有不是数字、空格或删除的按键。

    不过,我不能说苹果是否会喜欢这个,你将很难写出自己的行为,就像其他键盘一样。如此之多,以至于它应该被宣布为一个坏主意。

    使现代化 根据您的评论,听起来更像是您只需要创建一个带有许多按钮的视图,并在启用“动画”选项的情况下移动该视图。然后,它可以像键盘一样从底部向上滑动,然后在退出时再次滑开。