2009-10-22 144 views
8

我需要(即客戶要求)爲用戶提供自定義鍵盤,以便將文本輸入文本字段和區域。我已經有了一些鍵盤和測試附加到文本字段,但我想使它更通用,並使其像標準的iPhone鍵盤,即當用戶選擇一個可編輯的文本控件時出現。目前我的控制器知道目標和目標是不可編輯的,以防止標準鍵盤。自定義iPhone鍵盤

有沒有辦法掛鉤文本控件的行爲,所以我很容易使用我自己的鍵盤?

謝謝,維克

+0

我希望你的客戶不打算把這個(大概是非遊​​戲)應用程序提交給App Store ... – 2009-10-22 23:17:07

+0

爲什麼不能?_______ – 2009-10-22 23:18:31

+0

更改iPhone的核心UI組件? – 2009-10-22 23:21:11

回答

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

這增加了對原有鍵盤的頂部視圖,所以一定要使它不透明。

+0

另一個有趣的想法,感謝我給這一個嘗試過,謝謝。 – vickirk 2009-10-23 14:08:40

0

這取決於你想要它的自定義。我個人只想要一個數字鍵盤,但不喜歡數字鍵盤,所以我使用了標準鍵盤,並添加在標準過濾器中,這是選項的一部分,它拒絕所有不是數字或空格的按鍵或刪除。

我不能說蘋果是否會喜歡這個,而你將很難寫出自己的行爲,像其他鍵盤一樣。如此之多,它應該被宣佈爲一個壞主意。根據您的評論

更新它聽起來更像是你只需要創建很多上的按鈕的視圖,並用動畫選項打開上移動這一觀點。然後,它可以像鍵盤一樣從底部向上滑動,並在被解散時再次滑動。

+0

不幸的是,我們需要的鍵盤並不僅僅是一個帶有字符的鍵盤,它有幾個字符(真正的休息可能隱藏在這個mannner中),但是有一些按鈕比輸入單個字符做得更多。真的,我可以添加按鈕,在其他地方,但它會反intuative和看起來很糟糕。 我已經有鍵盤工作的要求,我只需要電線它在輕鬆,只是想觸摸的東西在Android上是穩定的目標作爲iPod的:-( – vickirk 2009-10-23 00:07:53

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 

不要在任何生產代碼中使用這樣的事。另外,我還沒有真正測試過,所以YMMV。

+0

一個有趣的想法,感謝我給它一個嘗試。 – vickirk 2009-10-23 14:08:10

10

你可以使用iOS 3.2或更高版本。有關詳細信息,請檢查UITextField的inputView屬性。

+1

+1一個很好的答案:) – 2012-04-03 12:21:51