如何根据手机的边框在自动布局中为应用内键盘设置不同的位置?

问题描述 投票:-1回答:2

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

我设法在界面构建器中重新创建它。我已经将键嵌入到他们自己的视图中,并且键的自动布局非常有效。

我的问题是我希望键盘与系统完全匹配。键盘视图应该显示在iPhone模型底部4个像素的边框和X系列iPhone的底部80个像素,以解释它们缺少边框。

我真的不想基于iPhone模型对约束进行硬编码。将键盘放在两种手机上的最佳方法是什么?

有没有办法检测iPhone是否有挡板?


Here's an image of my storyboard for the iPhone X.(我没有足够的代表来嵌入图像。)

唯一的区别是 -

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

其他:bottom = KeyboardView.bottom + 4

ios swift autolayout interface-builder iphone-x
2个回答
2
投票

您应该使用UIInputViewController及其inputView。 “键盘”(输入视图)将自动出现在所有设备类型的正确位置。


0
投票

如果其他人试图做同样的事情,我终于弄明白了。

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

此外,当您设置布局约束时,您无法使用

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()的情况下调出键盘,请告诉我。

希望这会帮助某人。

© www.soinside.com 2019 - 2024. All rights reserved.