Настройка интерфейса при появлении клавиатуры для UITextField или UITextView
-
03-07-2019 - |
Вопрос
У меня есть таблица, каждая ячейка которой содержит метку и текстовое поле.Проблема в том, что когда я редактирую последнюю строку, клавиатура скрывает нижнюю часть таблицы, и я не вижу, что набирается.Как мне переместить интерфейс над клавиатурой, чтобы видеть, что набирают?
Спасибо, Мустафа
Решение
Вы захотите зарегистрировать свой viewController для UIKeyboardDidShowNotification
и UIKeyboardWillHideNotification
события.Когда вы их получите, вам следует настроить границы вашей таблицы;Высота клавиатуры составляет 170 пикселей, поэтому просто уменьшите или увеличьте границы таблицы соответствующим образом, и она должна правильно адаптироваться к клавиатуре.
Другие советы
Эта проблема сложна и зависит от вашего сценария пользовательского интерфейса.Здесь я буду обсуждать сценарий, в котором UITextField или UITextview находится в UITableViewCell.
Вам необходимо использовать NSNotificationCenter для обнаружения события UIKeyboardDidShowNotification.видеть http://iosdevelopertips.com/user-interface/adjust-textfield-hidden-by-keyboard.html.Вам необходимо уменьшить размер кадра UITableView, чтобы он занимал только ту область экрана, которая не покрыта клавиатурой.
- Если вы коснетесь UITableViewCell, ОС автоматически разместит ячейку в области просмотра UITableView.Но этого не происходит, когда вы нажимаете на UITextView или UITableViewCell, даже если он находится в UITableViewCell.
Вам нужно позвонить
[myTableView selectRowAtIndexPath:self.indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];`
программно «коснуться» ячейки.
Если вы реализуете оба пункта, вы увидите позицию UITextView/Field прямо над клавиатурой.Имейте в виду, что UITableViewCell, в котором находится UITableView/Field, не может быть выше «непокрытой» области.Если для вас это не так, есть другой подход, но я не буду его здесь обсуждать.
Посмотрите этот вопрос: Список UITableView редактируемых текстовых полей
Просто убедитесь, что под ним достаточно места для прокрутки.Потому что, насколько мне известно, iPhone автоматически настраивает и отображает текстовое поле в фокусе при появлении клавиатуры.
Удаление/комментирование строк, в которых изменяется высота прямоугольника, похоже, решает проблему.Спасибо.
Модифицированный код:
# define kOFFSET_FOR_KEYBOARD 150.0 // keyboard is 150 pixels height
// Animate the entire view up or down, to prevent the keyboard from covering the author field.
- (void)setViewMovedUp:(BOOL)movedUp
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
// Make changes to the view's frame inside the animation block. They will be animated instead
// of taking place immediately.
CGRect rect = self.view.frame;
CGRect textViewRect = self.textViewBeingEdited.frame;
CGRect headerViewRect = self.headerView.frame;
if (movedUp) {
// If moving up, not only decrease the origin but increase the height so the view
// covers the entire screen behind the keyboard.
rect.origin.y -= kOFFSET_FOR_KEYBOARD;
// rect.size.height += kOFFSET_FOR_KEYBOARD;
} else {
// If moving down, not only increase the origin but decrease the height.
rect.origin.y += kOFFSET_FOR_KEYBOARD;
// rect.size.height -= kOFFSET_FOR_KEYBOARD;
}
self.view.frame = rect;
[UIView commitAnimations];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasHidden:)
name:UIKeyboardDidHideNotification
object:nil];
keyboardVisible = NO;
- (void)keyboardWasShown:(NSNotification *)aNotification {
if ( keyboardVisible )
return;
if( activeTextField != MoneyCollected)
{
NSDictionary *info = [aNotification userInfo];
NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
NSTimeInterval animationDuration = 0.300000011920929;
CGRect frame = self.view.frame;
frame.origin.y -= keyboardSize.height-300;
frame.size.height += keyboardSize.height-50;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];
viewMoved = YES;
}
keyboardVisible = YES;
}
- (void)keyboardWasHidden:(NSNotification *)aNotification {
if ( viewMoved )
{
NSDictionary *info = [aNotification userInfo];
NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
NSTimeInterval animationDuration = 0.300000011920929;
CGRect frame = self.view.frame;
frame.origin.y += keyboardSize.height-300;
frame.size.height -= keyboardSize.height-50;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];
viewMoved = NO;
}
keyboardVisible = NO;
}
tabelview.contentInset = UIEdgeInsetsMake(0, 0, 210, 0);
[tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:your_indexnumber inSection:Your_section]
atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
попробуй мой код, это поможет тебе