iOS: Как получить доступ к `UIKeyboard`? - PullRequest
7 голосов
/ 23 июня 2011

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

При этом можно ли предположить, что на экране одновременно присутствует только один UIKeyboard? Т.е. это одиночка? Где метод [UIKeyboard sharedInstance]. Брауни указывает, если вы реализуете этот метод через категорию. Или еще больше очков, если вы убедите меня, почему не стоит брать только одну клавиатуру и предлагать лучшее решение.

Ответы [ 6 ]

7 голосов
/ 23 июня 2011

Попробуйте это:

// my func
- (void) findKeyboard {

    // Locate non-UIWindow.
    UIWindow *keyboardWindow = nil;
    for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
        if (![[testWindow class] isEqual:[UIWindow class]]) {
           keyboardWindow = testWindow;
           break;
       }
    }

    // Locate UIKeyboard.  
    UIView *foundKeyboard = nil;
    for (UIView *possibleKeyboard in [keyboardWindow subviews]) {

        // iOS 4 sticks the UIKeyboard inside a UIPeripheralHostView.
        if ([[possibleKeyboard description] hasPrefix:@"<UIPeripheralHostView"]) {
            possibleKeyboard = [[possibleKeyboard subviews] objectAtIndex:0];
        }                                                                                

        if ([[possibleKeyboard description] hasPrefix:@"<UIKeyboard"]) {
           foundKeyboard = possibleKeyboard;
           break;
        }
    }
}   
5 голосов
/ 28 октября 2013

Как насчет использования -[UIApplication beginIgnoringInteractionEvents]?

Кроме того, еще один прием для получения представления, содержащего клавиатуру, состоит в том, чтобы инициализировать фиктивный вид с помощью CGRectZero и установить его как * 1007.* вашего UITextField или UITextView.Затем получите его superview.Тем не менее, такие махинации являются частными / недокументированными, но я слышал о приложениях, которые делают это и в любом случае принимаются.Я имею в виду, как еще Instagram сможет сделать свою клавиатуру комментариев интерактивной (отклонить при пролистывании), как клавиатуру сообщений?

4 голосов
/ 03 апреля 2014

Я обнаружил, что ответ developerdoug не работает на iOS 7, но, слегка изменив ситуацию, мне удалось получить доступ к тому, что мне нужно.Вот код, который я использовал:

-(UIView*)findKeyboard
{
    UIView *keyboard = nil;

    for (UIWindow* window in [UIApplication sharedApplication].windows)
    {
        for (UIView *possibleKeyboard in window.subviews)
        {
            if ([[possibleKeyboard description] hasPrefix:@"<UIPeripheralHostView"])
            {
                keyboard = possibleKeyboard;
                break;
            }
        }
    }

    return keyboard;
}

Из того, что я мог разглядеть, в iOS 7 клавиатура состоит из UIPeripheralHostView, содержащего два подпредставления: UIKBInputBackdropView (который обеспечивает эффект размытия на любомпод клавиатурой) и UIKeyboardAutomatic (который обеспечивает символьные клавиши).Манипулирование UIPeripheralHostView похоже на манипулирование всей клавиатурой.

Предупреждение: я не знаю, примет ли Apple приложение, использующее эту технику, и будет ли оно работать в будущих SDK.

1 голос
/ 20 июля 2015

Под iOS 8 кажется, что вам придется прыгать вниз по цепочке больше, чем в прошлом. Следующее работает для меня, чтобы получить клавиатуру, хотя с доступными пользовательскими клавиатурами, и поэтому я не буду полагаться на эту работу, если вы работаете в контролируемой среде.

- (UIView *)findKeyboard {
    for (UIWindow* window in [UIApplication sharedApplication].windows) {
        UIView *inputSetContainer = [self viewWithPrefix:@"<UIInputSetContainerView" inView:window];
        if (inputSetContainer) {
            UIView *inputSetHost = [self viewWithPrefix:@"<UIInputSetHostView" inView:inputSetContainer];
            if (inputSetHost) {
                UIView *kbinputbackdrop = [self viewWithPrefix:@"<_UIKBCompatInput" inView:inputSetHost];
                if (kbinputbackdrop) {
                    UIView *theKeyboard = [self viewWithPrefix:@"<UIKeyboard" inView:kbinputbackdrop];
                    return theKeyboard;
                }
            }
        }
    }

    return nil;
}


- (UIView *)viewWithPrefix:(NSString *)prefix inView:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([[subview description] hasPrefix:prefix]) {
            return subview;
        }
    }

    return nil;
}
1 голос
/ 10 декабря 2014

Для приложения, которое я сейчас разрабатываю, я использую очень быстрый и простой метод:

Добавьте это в заголовочный файл:

// Add in interface
UIWindow * _window;

// Add as property
@property (strong, nonatomic) IBOutlet UIView * _keyboard;

Затем добавьте этот код в нижней части клавиатуры функции WillShow:

-(void) keyboardWillShow: (NSNotification *) notification {

    .... // other keyboard will show code //

    _window = [UIApplication sharedApplication].windows.lastObject;

    [NSTimer scheduledTimerWithTimeInterval:0.05
                                     target:self
                                   selector:@selector(allocateKeyboard)
                                   userInfo:nil
                                    repeats:NO];
}

Этот код ищет, когда клавиатура поднята, а затем выделяет текущее окно. Затем я добавил таймер для выделения клавиатуры, так как при распределении сразу возникали некоторые проблемы.

- (void)allocateKeyboard {

    if (!_keyboard) {
        if (_window.subviews.count) {

            // The keyboard is always the 0th subview
            _keyboard = _window.subviews[0];
        }        
    }
}

Теперь у нас выделена клавиатура, которая дает вам прямой «доступ» к клавиатуре, когда задается вопрос.

Надеюсь, это поможет

1 голос
/ 24 июня 2011

Имейте в виду, Apple дала понять, что приложения, которые изменяют иерархии частного просмотра без явного согласия, будут отклонены. Загляните на форумы разработчиков Apple, чтобы узнать о различных проблемах разработчиков.

Если вы просто пытаетесь отключить клавиатуру (не допускать ее касания), вы можете попробовать добавить прозрачный UIView, который соответствует размеру экрана для текущей ориентации. Если вы добавите его как подпредставление в главном окне, оно может работать . Apple не обнародовала какой-либо публичный способ отключения клавиатуры, о котором я знаю, - вы можете использовать один из ваших инцидентов поддержки с Apple, возможно, они позволят вам принять решение.

...