Программно выровнять панель инструментов поверх клавиатуры iPhone
В некоторых случаях я хочу добавить панель инструментов вверху клавиатуры iPhone (например, в iPhone Safari, когда вы перемещаетесь по элементам формы, например).
В настоящее время я указываю прямоугольник панели инструментов с константами, но поскольку другие элементы интерфейса находятся в непрерывном режиме - панели инструментов и навигационные панели в верхней части экрана - каждый раз, когда мы вносим незначительное изменение интерфейса, панель инструментов выходит из выравнивания.
Есть ли способ программно определить положение клавиатуры относительно текущего вида?
Ответы
Ответ 1
Как и в iOS 3.2, существует новый способ достижения этого эффекта:
UITextFields
и UITextViews
имеют свойство inputAccessoryView
, которое вы можете установить для любого вида, которое автоматически отображается выше и анимируется с помощью клавиатуры.
Обратите внимание, что используемое вами представление не должно быть ни в иерархии представлений в другом месте, ни в том, что вы должны добавить его в некоторый супервизор, это делается для вас.
Ответ 2
Итак, в основном:
В методе 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];
Ответ 3
Это основано на существующем ответе от tonklon - я просто добавляю фрагмент кода, который показывает полупрозрачную черную панель инструментов поверх клавиатуры, вместе с справа нажмите кнопку "done":
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];
}
Надеюсь, что это поможет кому-то.
Ответ 4
Если вы регистрируетесь для уведомлений о клавиатуре, то есть UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
и т.д., получаемое уведомление будет содержать границы клавиатуры в userInfo
dict (UIKeyboardBoundsUserInfoKey
).
См. ссылку класса UIWindow
.
Ответ 5
В версии 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
.
Ответ 6
Я нашел эту ссылку очень полезной для понимания inputaccesoryview шаг за шагом.
входной вид аксессуара
Ответ 7
Создайте этот метод и вызовите его на 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;
}
}
Ответ 8
Нет способа (AFAIK) получить размеры вида клавиатуры. Он, однако, постоянный, по крайней мере, в каждой версии iPhone.
Если вы вычисляете позицию панели инструментов в качестве смещения от BOTTOM вашего представления и учитываете размер вашего представления, вам не придется беспокоиться о наличии навигационной панели или нет.
например.
#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.