Как установить различное положение встроенной клавиатуры в автозапуске в зависимости от рамок телефона?

#ios #swift #autolayout #interface-builder #iphone-x

#iOS #swift #автозапуск #конструктор интерфейса #iphone-x

Вопрос:

Я пытаюсь создать приложение, которое включает в себя точную копию японской клавиатуры iOS.

Мне удалось воссоздать это в Interface Builder. Я встроил клавиши в их собственный вид, и автозапуск для клавиш работает отлично.

Моя проблема в том, что я хочу, чтобы клавиатура точно соответствовала системной. Вид клавиатуры должен отображаться на расстоянии 4 пикселей снизу на моделях iPhone с рамками и на расстоянии 80 пикселей снизу для iPhone серии X, чтобы учесть отсутствие рамок.

Я действительно не хочу жестко кодировать ограничения, основанные на модели iPhone. Каков наилучший способ позиционирования клавиатуры для обоих типов телефонов?

Есть ли способ определить, есть ли у iPhone рамки?


Вот изображение моей раскадровки для iPhone X.

Единственное отличие заключается:

Серия iPhone X: bottom = KeyboardView.bottom 80

Прочее: bottom = KeyboardView.bottom 4

Ответ №1:

Вы должны использовать UIInputViewController и его inputView . «Клавиатура» (вид ввода) автоматически появится в нужном месте на всех типах устройств.

Комментарии:

1. Спасибо, что указали мне правильное направление! Я думал, вы можете использовать это только с расширениями клавиатуры.

2. Я просто хотел сказать, что нашел раздел об этом в вашей книге по программированию для iOS 12 через Google books. Это была огромная помощь, и я планирую получить копию, как только получу больше опыта в разработке iOS.

Ответ №2:

На случай, если кто-то еще пытается сделать то же самое, я, наконец, понял это.

Я попытался переопределить мой контроллер просмотра canBecomeFirstResponder для возврата true и вызвать self.becomeFirstResponder() , чтобы вызвать клавиатуру. Однако, поскольку контроллер представления не является текстовым полем, он не будет позиционировать клавиатуру так, как если бы это была текстовая клавиатура. Это может сработать, если ваш пользовательский ввод — это UIPickerView, но это не работает для текстовой клавиатуры. Вы должны вызвать becomeFirstResponder() UITextField, чтобы система правильно расположила вашу клавиатуру.

Кроме того, когда вы устанавливаете ограничения макета, вы не можете использовать

keyboardView.bottomAnchor.constraint(equalTo: inputView.safeAreaLayoutGuide.bottomAnchor)])

или даже

keyboardView.bottomAnchor.constraint(equalTo: inputView.safeAreaLayoutGuide.bottomAnchor)])

Это прижимает клавиатуру к основанию и не оставляет под ней достаточно места.


Вот мое решение:

 class KeyboardViewController: UIInputViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    let nib = UINib(nibName: "KeyboardView", bundle: nil)
    let keyboardView = nib.instantiate(withOwner: nil).first as! KeyboardView

    guard let inputView = self.inputView else { return }
    inputView.translatesAutoresizingMaskIntoConstraints = false
    inputView.addSubview(keyboardView)

    keyboardView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      keyboardView.leftAnchor.constraint(equalTo: inputView.leftAnchor),
      keyboardView.topAnchor.constraint(equalTo: inputView.topAnchor),
      keyboardView.rightAnchor.constraint(equalTo: inputView.rightAnchor)])
  } 
}
  

и для моего контроллера просмотра я просто делаю:

   let keyboardViewController = KeyboardViewController()

  override func viewDidLoad() {
    super.viewDidLoad()

    textField.inputView = self.keyboardViewController.inputView
    textField.becomeFirstResponder()
  }
  

Если у вас есть какие-либо предложения или вы знаете, как вызвать клавиатуру без вызова becomeFirstResponder() текстового поля, пожалуйста, дайте мне знать.

Надеюсь, это кому-нибудь поможет.