Как установить различную позицию для встроенной клавиатуры приложения в зависимости от лицевых панелей телефона? - PullRequest
0 голосов
/ 24 марта 2019

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

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

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

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

Есть ли способ определить, есть ли у iPhone лицевые панели?


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

Единственное отличие -

iPhone X series: bottom = KeyboardView.bottom + 80

Другие: bottom = KeyboardView.bottom + 4

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

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

0 голосов
/ 27 марта 2019

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

Я попытался переопределить контроллер вида 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() в текстовом поле, пожалуйста, сообщите мне.

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

...