2012-06-08 5 views
3

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

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

Мои вопросы:

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

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

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

ответ

1

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

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

//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, но оно хорошо подходит для моего дела.

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

+0

Это довольно изящное решение для нахождения местоположения клавиатуры. Но по какой-то причине он не всегда может найти клавиатуру. Я сделал это итерацией через все UIWindow в моем приложении, и иногда я ничего не получаю, даже если клавиатура встала. – Zeenobit

+0

Кроме того, в отношении вашего ответа на вопрос 1: Если позиция клавиатуры зависит только от главного окна приложения, то при каких условиях она может появиться за пределами главного окна? – Zeenobit

5

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

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

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

NSString * const UIKeyboardFrameBeginUserInfoKey; 
NSString * const UIKeyboardFrameEndUserInfoKey; 
NSString * const UIKeyboardAnimationDurationUserInfoKey; 
NSString * const UIKeyboardAnimationCurveUserInfoKey; 
Смежные вопросы