Выход из входного списка AccessViewView после закрытия клавиатуры

То, что я пытаюсь сделать, - создать что-то похожее на функцию поиска "найти на странице" в Safari на iPad.

Я использую UIToolbar с некоторыми элементами в нем и прикрепляю его к клавиатуре, установив его как inputAccessoryView на UITextField. Работает как шарм, но есть одна вещь, которую я не могу понять. В Safari, когда вы что-то ищете, клавиатура исчезает, но панель инструментов остается в нижней части экрана.

Кто-нибудь знает, как это сделать? Единственное решение, о котором я могу думать, - это ответить на событие, отклоненное на клавиатуре, а затем вытащить UIToolbar и создать пользовательскую анимацию, которая перемещает ее в нижней части экрана. Но это хаки. Я ищу более элегантное решение. Что-то, что может заставить меня решить, что делать с видом вспомогательного входа, когда клавиатура отклоняется.

Ответ 1

Сделано вот так:

Назначьте свой UIToolbar свойству в контроллере представления:

@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar;

В контроллере верхнего уровня добавьте следующие методы:

- (BOOL)canBecomeFirstResponder{

    return YES;

}

- (UIView *)inputAccessoryView{

    return self.inputAccessoryToolbar;

}

И затем (необязательно, как это обычно не требуется), всякий раз, когда клавиатура скрывается, просто вызовите:

[self becomeFirstResponder];

Таким образом, ваш inputAccessoryToolbar будет одновременно вашим контроллером вида и вашим аксессуаром для ввода текста.

Ответ 2

Я закончил с UIToolBar, который не назначен в качестве вида вспомогательного аксессуара, и слайд вверх и вниз на UIKeyboardWillShowNotification / UIKeyboardWillHideNotification

Ответ 3

Добавляя к ответу @arik, вот версия Swift:

class ViewController: UIViewController {

  @IBOutlet var textField: UITextField!      

  // Input Accessory View
  private var inputAccessoryToolbar: UIToolBar?
  override func canBecomeFirstResponder() -> Bool {
    return true
  }
  override var inputAccessoryView: UIView? {
    return inputAccessoryToolbar
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    inputAccessoryToolbar = UIToolbar(frame: CGRectMake(0, 0, view.frame.size.width, 50))
    textField.inputAccessoryView = inputAccessoryToolbar
  }

  // UITextFieldDelegate
  func textFieldShouldReturn(textField: UITextField) -> Bool {
    becomeFirstResponder()
    return true
  }
}

Спасибо за чистое решение!