UIKeyBoard изменить размер при изменении ориентации на ландшафт - PullRequest
3 голосов
/ 19 марта 2010

Это очень новенький вопрос. У меня есть UIToolBar внизу, который должен анимированно двигаться вверх и вниз с помощью клавиатуры, когда отображается UIKeyBoard. Я получил это, работая с помощью уведомлений UIKeyBoard. Представление, о котором мы говорим, имеет разделенное представление. Когда ориентация устройства является горизонтальной, отображаются оба вида в виде столбцов [надеюсь, это имеет смысл].

Когда отображается клавиатура, я делаю это

CGSize keyBoardSize = [[notificationInfo objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size;

CGRect toolbarFrame= [BottomToolBar frame];
toolbarFrame.origin.y -= keyBoardSize.height;    
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
BottomToolBar .frame = viewFrame;
[UIView commitAnimations];

когда клавиатура hiiden, я делаю это

toolbarFrame.origin.y += keyBoardSize.height;

Моя проблема - когда ориентация устройства меняется на альбомную, когда клавиатура видна, нижняя панель инструментов исчезла. Я вижу, как он быстро поднимается. Я не уверен, как это исправить. Может кто-нибудь помочь, пожалуйста? Кроме того, есть ли способ НЕ сделать так, чтобы клавиатура охватывала оба вида в разделенном виде?

Ответы [ 6 ]

10 голосов
/ 26 марта 2010

У меня тоже есть эта проблема, все, о чем я могу думать, это отклонение клавиатуры и ее повторное отображение (подать в отставку и снова стать первым респондентом).Но это кажется очень неудовлетворительным.

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

CGRect keyboardRect = [[notificationInfo objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
keyboardRect = [[BottomToolBar superview] convertRect:keyboardRect fromView:nil];

ОБНОВЛЕНИЕ: Вы должны зарегистрироваться для UIKeyboardWillShowNotification, тогда ваше действие будет вызвано, когда интерфейс вращается:)

Также см .: https://devforums.apple.com/message/181482#181482

6 голосов
/ 20 сентября 2010
- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)aNotification 
{
    CGRect keyboardBounds;
    [[aNotification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];

    CGFloat keyboardHeight;
    switch ([UIApplication sharedApplication].statusBarOrientation) {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            keyboardHeight = keyboardBounds.size.height;
            break;
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            keyboardHeight = keyboardBounds.size.width;
            break;
    }

    NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    CGRect rect = table.frame;
    rect.size.height -= keyboardHeight;
    [UIView beginAnimations:@"ResizeForKeyboardShow" context:nil];
    [UIView setAnimationDuration:animationDuration];
    table.frame = rect;
    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)aNotification
{
    CGRect keyboardBounds;
    [[aNotification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];

    CGFloat keyboardHeight;
    switch ([UIApplication sharedApplication].statusBarOrientation) {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            keyboardHeight = keyboardBounds.size.height;
            break;
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            keyboardHeight = keyboardBounds.size.width;
            break;
    }

    NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    CGRect rectTable = table.frame;
    rectTable.size.height += keyboardHeight;
    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];
    table.frame = rectTable;
    [UIView commitAnimations];
}
4 голосов
/ 21 февраля 2011

UITextFields имеет свойство inputAccessoryView, которое позволяет добавлять UIToolBar над UIKeyboard.

2 голосов
/ 02 сентября 2012
- (void)viewDidLoad { // Or somewhere else
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbDidChange:) UIKeyboardDidChangeFrameNotification object:nil];
}

- (void)kbDidChange:(NSNotification *)notification {
    NSDictionary* keyboardInfo = [notification userInfo];
    CGRect keyboardFrame = [[keyboardInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardFrame = [[messageBar superview] convertRect:keyboardFrame fromView:nil];

    CGRect ol = messageBar.frame; // messageBar is your UIToolbar..
    ol.origin.y = keyboardFrame.origin.y-44;
    messageBar.frame = ol;
}
0 голосов
/ 31 мая 2012

Решение состоит в том, чтобы установить параметр UIViewAnimationOptionBeginFromCurrentState для блочной анимации или

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:[notificationInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]];
[UIView setAnimationBeginsFromCurrentState:YES];
BottomToolBar.frame = viewFrame;
[UIView commitAnimations];

в вашем случае. Тогда при смене ориентации с портрета на пейзаж вид не будет внезапно перемещаться.

0 голосов
/ 31 декабря 2010

Эти ответы работают хорошо, за исключением внешних клавиатур. Когда присутствует аппаратная клавиатура, похоже, что свойство "height" кадра клавиатуры, переданного в сообщении, остается таким же, как и с виртуальной клавиатурой, то есть этот код вычитает высоту из кадра просмотра для существующая клавиатура (создает неудобное пространство).

Лучшее решение, которое я нашел, - это заметить, что свойство "y" рамки клавиатуры указано в нижней части экрана (это означает, что виртуальная клавиатура действительно присутствует, только вне экрана).

...