Можно ли создать 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];
}
Другие вопросы по тегам