我正在尝试制作一个包含日本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
您应该使用UIInputViewController及其inputView
。 “键盘”(输入视图)将自动出现在所有设备类型的正确位置。
如果其他人试图做同样的事情,我终于弄明白了。
我试图让我的视图控制器覆盖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()
的情况下调出键盘,请告诉我。
希望这会帮助某人。