Расположение и ориентация клавиатуры iOS

Я относительно новичок в iOS SDK, и у меня возникла очень странная проблема, связанная с расположением и ориентацией клавиатуры устройства для приложения, над которым я работаю. Проблема в том, что если клавиатура открыта, когда пользователь выполняет многозадачность или приложение переходит в фоновый режим, после того, как пользователь вернется в приложение, клавиатура будет смещена (с поднятым UIKeyboardWillChangeFrameNotification), но в неправильной ориентации и место расположения.

Иногда клавиатура полностью исчезает с экрана, что совершенно нежелательно.

Мои вопросы:

  1. От чего зависит положение и ориентация клавиатуры? Как он управляется iOS?

  2. Есть ли способ определить, когда клавиатура отображается вне экрана, независимо от типа устройства и размера экрана? Я думаю, что это можно сделать, отслеживая UIKeyboardWillChangeFrameNotification или UIKeyboardWillShowNotification.

  3. Как сбросить/установить расположение и ориентацию клавиатуры перед ее отображением? Это вообще возможно?


person Zeenobit    schedule 08.06.2012    source источник


Ответы (2)


1.) Клавиатура — это UIWindow, положение которой зависит от главного окна приложения.

2.) Что вы можете сделать, так это после срабатывания одного из методов уведомлений UIKeyboardWillShowNotification или UIKeyboardWillChangeFrameNotification прокрутить подвиды Windows, чтобы найти клавиатуру. В одном из моих приложений мне нужно было добавить подвид на клавиатуру. В вашем случае вы можете получить рамку, выполнив следующие действия:

//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 UIPeripheral throught the SDK we will just use UIView.
//UIPeripheral 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];

           //Assuming this is for 4.0+, In 3.0 you would use "<UIKeyboard"
           if([[keyboard description] hasPrefix:@"<UIPeripheral"] == YES) {

                  //Keyboard is now a UIView reference to the UIPeripheral we want
                  NSLog(@"Keyboard Frame: %@",NSStringFromCGRect(keyboard.frame));

           }
}

3.) Не совсем уверен, что это возможно, но с предоставленным кодом, который я вам дал. keyboard теперь приводится к «UIView», к которому вы можете применить свои собственные преобразования.

Возможно, это не most элегантное решение, но в моем случае оно работает хорошо.

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

person skram    schedule 09.06.2012
comment
Это довольно аккуратное решение для поиска местоположения клавиатуры. Но почему-то не всегда удается найти клавиатуру. Я заставил его перебирать все UIWindow в моем приложении, и иногда я ничего не получаю, даже если клавиатура поднята. - person Zeenobit; 11.06.2012
comment
Кроме того, что касается вашего ответа на вопрос 1: если положение клавиатуры зависит только от главного окна приложения, то при каком условии оно может появиться за пределами главного окна? - person Zeenobit; 11.06.2012

Из документации:

Используйте клавиши, описанные в разделе «Клавиши информации о пользователе для уведомлений о клавиатуре», чтобы получить расположение и размер клавиатуры из словаря userInfo.

Клавиши, используемые для получения значений из пользовательского информационного словаря уведомлений клавиатуры:

NSString * const UIKeyboardFrameBeginUserInfoKey;
NSString * const UIKeyboardFrameEndUserInfoKey;
NSString * const UIKeyboardAnimationDurationUserInfoKey;
NSString * const UIKeyboardAnimationCurveUserInfoKey;
person Rudolf Adamkovič    schedule 12.10.2012