Программно выровняйте панель инструментов сверху клавиатуры iPhone - PullRequest
94 голосов
/ 01 октября 2008

В некоторых случаях я хочу добавить панель инструментов в верхней части клавиатуры iPhone (например, в iPhone Safari при навигации по элементам формы, например).

В настоящее время я указываю прямоугольник панели инструментов с помощью констант, но поскольку другие элементы интерфейса находятся в непрерывном режиме - панели инструментов и панели навигации в верхней части экрана - каждый раз, когда мы вносим незначительные изменения интерфейса, панель инструментов выходит из выравнивания.

Есть ли способ программно определить положение клавиатуры относительно текущего вида?

Ответы [ 8 ]

142 голосов
/ 23 июля 2010

В iOS 3.2 появился новый способ достижения этого эффекта:

UITextFields и UITextViews имеют свойство inputAccessoryView, которое можно установить для любого вида, который автоматически отображается выше и анимируется с помощью клавиатуры.

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

72 голосов
/ 28 декабря 2008

Так в основном:

В методе init:

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

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

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

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

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];
60 голосов
/ 16 мая 2011

Это основано на существующем ответе от tonklon - я просто добавляю фрагмент кода, который показывает полупрозрачную черную панель инструментов в верхней части клавиатуры, вместе с кнопкой «сделано» справа :

UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];

UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];

NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];

[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];

[aTextField setInputAccessoryView:toolbar];

и -resignKeyboard выглядит так:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

Надеюсь, это кому-нибудь поможет.

24 голосов
/ 01 октября 2008

Если вы регистрируетесь для уведомлений клавиатуры, например UIKeyboardWillShowNotification UIKeyboardWillHideNotification и т. Д., Полученное вами уведомление будет содержать границы клавиатуры в userInfo dict (UIKeyboardBoundsUserInfoKey).

См. Ссылку на класс UIWindow.

16 голосов
/ 11 января 2010

В версии 3.0 и выше вы можете получить продолжительность и кривую анимации из словаря уведомлений userInfo.

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

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

Сделать аналогичную анимацию для UIKeyboardWillHideNotification.

3 голосов
/ 28 ноября 2011

Я нашел эту ссылку очень полезной для пошагового понимания inputaccesoryview.

вид входного аксессуара

0 голосов
/ 11 декабря 2014

Создайте этот метод и вызовите его на ViewWillLoad:

        - (void) keyboardToolbarSetup
{
    if(self.keyboardToolbar==nil)
        {
        self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)];

        UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)];


        NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil];

        [self.keyboardToolbar setItems:toolbarButtons];

        self.myTextView.inputAccessoryView=self.keyboardToolbar;
        }
}
0 голосов
/ 01 октября 2008

Нет способа (AFAIK) получить размеры клавиатуры. Однако он постоянен, по крайней мере, в каждой версии iPhone.

Если вы рассчитываете положение панели инструментов как смещение от ДНА вашего взгляда и учитывает размер вашего взгляда, тогда вам не нужно беспокоиться о том, присутствует ли панель навигации или нет.

* 1005 Е.Г. *

#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size
#define TOOLBAR_HEIGHT 30

toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;

// move toolbar either directly or with an animation

Вместо определения можно легко создать функцию keyboardHeight, которая возвращает размер в зависимости от того, отображается ли клавиатура, и переместить позиционирование этой панели инструментов в отдельную функцию, которая реорганизует ваш макет.

Также это может зависеть от того, где вы делаете это позиционирование, поскольку возможно, что размер вашего вида может изменяться между загрузкой и отображением в зависимости от настроек вашей навигационной панели. Я считаю, что лучшее место для этого было бы в ViewWillAppear.

...