Ios 如何根据手机设置自动布局中应用程序内键盘的不同位置';s的挡板?

Ios 如何根据手机设置自动布局中应用程序内键盘的不同位置';s的挡板?,ios,swift,autolayout,interface-builder,iphone-x,Ios,Swift,Autolayout,Interface Builder,Iphone X,我正在尝试制作一个包含日本iOS键盘副本的应用程序 我设法在interface builder中重新创建了它。我已经将关键点嵌入到它们自己的视图中,并且关键点的自动布局工作得非常完美 我的问题是,我希望键盘与系统键盘完全匹配。对于带有边框的iPhone机型,键盘视图应显示底部4像素,对于X系列iPhone,键盘视图应显示底部80像素,以说明其缺少边框 我真的不想基于iPhone模型硬编码约束。对于这两种手机,键盘的最佳定位方式是什么 有没有办法检测iPhone是否有边框 (我没有足够的rep

我正在尝试制作一个包含日本iOS键盘副本的应用程序

我设法在interface builder中重新创建了它。我已经将关键点嵌入到它们自己的视图中,并且关键点的自动布局工作得非常完美

我的问题是,我希望键盘与系统键盘完全匹配。对于带有边框的iPhone机型,键盘视图应显示底部4像素,对于X系列iPhone,键盘视图应显示底部80像素,以说明其缺少边框

我真的不想基于iPhone模型硬编码约束。对于这两种手机,键盘的最佳定位方式是什么

有没有办法检测iPhone是否有边框


(我没有足够的rep来嵌入图像。)

唯一的区别是--

iPhone X系列:
bottom=KeyboardView.bottom+80


其他:
bottom=KeyboardView.bottom+4
您应该使用UIInputView控制器及其
inputView
。“键盘”(输入视图)将自动出现在所有设备类型的正确位置。

如果其他任何人尝试做同样的事情,我最终找到了答案

我试图让我的视图控制器覆盖
canBecomeFirstResponder
以返回
true
并调用
self.becomeFirstResponder()
以打开键盘。 但是,由于视图控制器不是文本字段,因此它不会将键盘定位为文本键盘。如果您的自定义输入是UIPickerView,这可能会起作用,但对于文本键盘不起作用。您必须在UITextField上调用
becomeFirstResponder()
,系统才能正确定位键盘

此外,设置布局约束时,不能使用

keyboardView.bottomAnchor.constraint(等同于:inputView.safeAreaLayoutGuide.bottomAnchor)])

甚至

keyboardView.bottomAnchor.constraint(等同于: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()
的情况下打开键盘,请告诉我


希望这能帮到别人。

谢谢你为我指明了正确的方向!我以为你只能在键盘扩展上使用它。我只是想说我在你的iOS 12编程书中通过谷歌图书找到了关于它的部分。这是一个巨大的帮助,我计划在我获得更多的iOS开发经验后再拿一本。