Начиная с iOS 3.2 есть новый способ достижения этого эффекта:
UITextFields
и UITextViews
имеют свойство inputAccessoryView
, которое вы можете установить на любое представление, которое автоматически отображается над клавиатурой и анимируется с ней.
Обратите внимание, что используемое вами представление не должно находиться в иерархии представлений где-либо еще, и вы не должны добавлять его в какое-либо суперпредставление, это делается за вас.
Если Вы зарегистрируетесь для уведомлений о клавиатуре, т.е. UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
, и т.д., то уведомление, которое Вы получаете, будет содержать границы клавиатуры в userInfo
dict (UIKeyboardBoundsUserInfoKey
).
Посмотрите UIWindow
ссылка класса.
Так в основном:
В 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];
Нет никакого пути (AFAIK) для получения размеров представления клавиатуры. Это однако постоянно, по крайней мере, в каждой версии iPhone до сих пор.
, Если Вы вычисляете позицию панели инструментов смещения от НИЖНЕЙ ЧАСТИ Вашего представления и принимаете размер во внимание Вашего представления, тогда Вам не придется волноваться, присутствует ли navbar или нет.
, Например,
#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
функция, которая возвращает размер на основе того, отображается ли клавиатура, и переместите это расположение панели инструментов в отдельную функцию, которая реорганизовывает Ваше расположение.
Также это может зависеть от того, где Вы делаете это расположение, поскольку возможно, что размер Вашего представления может измениться между тем, чтобы быть загруженным и показанный на основе Вашей установки navbar. Я полагаю, что лучшее место, чтобы сделать это было бы в viewWillAppear.
В 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
.