Отключение клавиш на клавиатуре - PullRequest
8 голосов
/ 07 марта 2012

Я новичок в Objective-C, и я хочу ограничить переход пользователя от алфавитной части обычной клавиатуры к числовой / пунктуации.При этом я хотел бы отключить кнопку на клавиатуре, которая выполняет переключение.Возможно, я ввожу неправильные параметры поиска, но я мало что нахожу в Google и еще меньше в своих справочниках.Как бы я вообще отключил кнопку на клавиатуре iOS?С буквенно-цифровыми / пунктуационными знаками это можно легко сделать, просто игнорируя введенные вводимые символы, но кнопка переключения между частями клавиатуры выполняет действие, а не возвращает символ.

Спасибо за вашепомощь!

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Вы можете добавлять и удалять кнопки по умолчанию UIKeyboard

В Интернете есть несколько рецептов, таких как: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html и таких: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html

В этих сообщениях показано, как добавить кнопку, однако для удаления можно использовать тот же принцип.

Ниже я покажу вам компиляцию одного из решений:

//The UIWindow that contains the keyboard view - 
//It some situations it will be better to actually
//iterate through each window to figure out where the keyboard is, 
// but In my applications case
//I know that the second window has the keyboard so I just reference it directly
//
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
//                     objectAtIndex:1];

//Because we cant get access to the UIKeyboard throught the SDK we will 
// just use UIView. 
//UIKeyboard is a subclass of UIView anyways
UIView* keyboard;

//Iterate though each view inside of the selected Window
for(int i = 0; i < [tempWindow.subviews count]; i++)
{
    //Get a reference of the current view 
    keyboard = [tempWindow.subviews objectAtIndex:i];

    //Check to see if the className of the view we have 
    //referenced is "UIKeyboard" if so then we found
    //the keyboard view that we were looking for
    if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
    {
        // Keyboard is now a UIView reference to the 
        // UIKeyboard we want. From here we can add a subview
        // to th keyboard like a new button

        //Do what ever you want to do to your keyboard here...
    }
}
1 голос
/ 06 марта 2013

Я реализовал более аккуратное решение. Хитрость заключается в том, чтобы поместить изображение отключенной клавиши поверх клавиатуры.

Для этого

  1. Запустите эмулятор (в масштабе 100%) и выберите на экране нужный ресурс (в моем случае это была отключенная кнопка «Готово» в правом нижнем углу)
  2. Поместите это изображение поверх клавиатуры

Обратите внимание, что клавиатура помещена в отдельное окно UIWindow (начиная с iOS5, как я полагаю), и, таким образом, вам нужно будет сделать следующее

+ (void) addSubviewToTop:(UIView *)view {
     int count = [[[UIApplication sharedApplication] windows] count];
     if(count <= 0)  {
        warn(@"addSubviewToTop failed to access application windows");
     }
     UIWindow *top_window = [[[UIApplication sharedApplication] windows] objectAtIndex:count-1];
     [top_window addSubview:view];
     [top_window bringSubviewToFront:view];
}
0 голосов
/ 03 апреля 2013

Я не уверен, что SDK изменился так, что ответ @ ppaulojr больше не работает, или я просто странно настроил что-то в своей системе, но с помощью следующих настроек я смог заставить его работать!

Сообщения, связанные в ответе @ ppaulojr, великолепны (http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html и http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html),, и они помогли мне заставить это работать.

Видимо, фактический вид клавиатурытеперь встроен как подпредставление в какую-то более грандиозную структуру представления UIKeyboard, поэтому требуется немного рекурсии. Я получил это на работу:

-(void) findKeyboard {

    NSArray* windows = [[UIApplication sharedApplication] windows];

    for (int i = 0; i < [windows count]; i++) {

        UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
                                                            objectAtIndex:i];

        for(UIView *subView in [tempWindow subviews])
        {
            [self checkViews:subView];
        }
    }
}

-(void)checkViews:(UIView *)inView
{
    for(UIView *keyboard in inView.subviews)
    {
        NSLog( @"ViewName: %@", [keyboard description] );    // Which view are we looking at

        //Check to see if the className of the view we have 
        //referenced is "UIKeyboard" if so then we found
        //the keyboard view that we were looking for
        if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
        {
            // Keyboard is now a UIView reference to the 
            // UIKeyboard we want. From here we can add a subview
            // to th keyboard like a new button

            //Do what ever you want to do to your keyboard here...


            break;
        }

        // Recurse if not found
        [self checkViews:subView];
    }    
}

Я также обнаружил, что лучшее место для вызова этой функции - -(void)textViewDidBeginEditing:(UITextView *)textViewнапример, так:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    NSLog(@"textViewDidBeginEditing");

    [self findKeyboard];

}

При этом вносятся изменения в клавиатуру, как только клавиатура добавляется в окно, но до ее фактического отображения, так что все время, когда она поднимается снизу, будетмодифицировано.

...