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

Posted

技术标签:

【中文标题】如何根据手机的边框在自动布局中为应用内键盘设置不同的位置?【英文标题】:How to set different position for in-app keyboard in autolayout depending on phone's bezels? 【发布时间】:2019-03-24 15:04:03 【问题描述】:

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

我设法在界面生成器中重新创建它。我已将键嵌入到他们自己的视图中,并且键的自动布局完美运行。

我的问题是我希望键盘与系统完全匹配。键盘视图在带边框的 iPhone 机型上应显示在距底部 4 像素处,而对于 X 系列 iPhone,键盘视图应显示在距底部 80 像素处,以说明它们没有边框。

我真的不想根据 iPhone 型号对约束进行硬编码。对于这两种手机来说,放置键盘的最佳方式是什么?

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


唯一的区别是:

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

其他:bottom = KeyboardView.bottom + 4

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您为我指明正确的方向!我以为你只能将它与键盘扩展一起使用。 我只想说我通过谷歌书籍在你的 iOS 12 编程书籍中找到了关于它的部分。这是一个巨大的帮助,我打算在我获得更多 iOS 开发经验后再买一份。【参考方案2】:

以防其他人尝试做同样的事情,我终于想通了。

我试图让我的视图控制器覆盖 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() 的情况下调出键盘,请告诉我。

希望这会对某人有所帮助。

【讨论】:

以上是关于如何根据手机的边框在自动布局中为应用内键盘设置不同的位置?的主要内容,如果未能解决你的问题,请参考以下文章

手机怎么呼出键盘

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

如何在 android studio 中为线性布局制作“波浪”边框?

iOS 自动布局:如何在 Xcode 故事板中为 iPad 横向和 iPad 纵向设计不同的布局?

word目录边框怎么去掉

如何在 ScrollView 中为 ImageView 设置自动布局约束?