Можно ли создать inputAccessoryView над клавиатурой на всю ширину экрана в режиме разделения?
Можно ли создать inputAccessoryView над клавиатурой на всю ширину экрана в режиме разделения? Система автоматически изменяет размер, чтобы соответствовать рамке приложения. Это ошибка в iOS?
2 ответа
Вы можете использовать этот метод, чтобы определить, находится ли ваша клавиатура в режиме разделения. Примечание: чтобы это работало, вам нужен UITextField/UITextView
с ненулевым inputAccessoryView
(вы можете просто использовать пустое представление для этого).
NSArray *classPath = @[
@"KeyboardAutomatic",
@"KeyboardImpl",
@"KeyboardLayoutStar",
@"KBKeyplaneView",
@"KBSplitImageView"
];
UIView *splitView = textField.inputAccessoryView.superview;
for (NSString *className in classPath) {
for (UIView *subview in splitView.subviews) {
if ([NSStringFromClass([subview class]) rangeOfString:className].location != NSNotFound) {
splitView = subview;
break;
}
}
}
BOOL isSplit = [splitView.subviews count] > 1;
Затем вы можете использовать собственный inputAccessoryView и редактировать его CGRectFrame
в зависимости от того, находится клавиатура в режиме разделения или нет. Вот хороший пример: https://github.com/bmancini55/iOSExamples-DockedKeyboardView
Поделиться принятым ответом на тот же вопрос Ссылка
UIKit отправляет UIKeyboardWillShowNotification, когда он показывает клавиатуру, и UIKeyboardWillHideNotification, когда он скрывает клавиатуру. Эти уведомления содержат все, что вам нужно для правильной анимации вашего UITextField.
Допустим, ваш UITextField находится в свойстве под названием myTextField.
Во-первых, вам нужно где-то зарегистрироваться для получения уведомлений. Место, где вы регистрируетесь, зависит от того, какой объект отвечает за перемещение myTextField. В моем проекте ответственным является супервизор поля, и, поскольку я загружаю свой интерфейс из пера, я делаю это в awakeFromNib суперпредставления:
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillHideNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillShowNotification object:nil];
}
Если вы используете UIViewController для перемещения поля, вы, вероятно, захотите сделать это в viewWillAppear: animated:.
Вы должны отменить регистрацию в вашем dealloc или viewWillDisappear: animated::
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Конечно хитрый бит в клавиатуре WillHideOrShow: метод. Сначала я извлекаю параметры анимации из уведомления:
- (void)keyboardWillHideOrShow:(NSNotification *)note
{
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
KeyboardFrame находится в глобальной системе координат. Мне нужно преобразовать кадр в ту же систему координат, что и myTextField.frame, а myTextField.frame находится в системе координат myTextField.superview:
CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect
: keyboardFrame fromView: nil];
Затем я вычисляю кадр, в который я хочу переместить myTextField. Нижний край новой рамки должен быть равен верхнему краю рамки клавиатуры:
CGRect newTextFieldFrame = self.myTextField.frame;
newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height;
Наконец, я анимирую myTextField в его новом кадре, используя те же параметры анимации, что и клавиатура:
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
self.myTextField.frame = newTextFieldFrame;
} completion:nil];
}
Вот это все вместе:
- (void)keyboardWillHideOrShow:(NSNotification *)note
{
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil];
CGRect newTextFieldFrame = self.myTextField.frame;
newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height;
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
self.myTextField.frame = newTextFieldFrame;
} completion:nil];
}