#ios #swift #autolayout #interface-builder #iphone-x
#iOS #swift #автозапуск #конструктор интерфейса #iphone-x
Вопрос:
Я пытаюсь создать приложение, которое включает в себя точную копию японской клавиатуры iOS.
Мне удалось воссоздать это в Interface Builder. Я встроил клавиши в их собственный вид, и автозапуск для клавиш работает отлично.
Моя проблема в том, что я хочу, чтобы клавиатура точно соответствовала системной. Вид клавиатуры должен отображаться на расстоянии 4 пикселей снизу на моделях iPhone с рамками и на расстоянии 80 пикселей снизу для iPhone серии X, чтобы учесть отсутствие рамок.
Я действительно не хочу жестко кодировать ограничения, основанные на модели iPhone. Каков наилучший способ позиционирования клавиатуры для обоих типов телефонов?
Есть ли способ определить, есть ли у iPhone рамки?
Единственное отличие заключается:
Серия iPhone X: bottom = KeyboardView.bottom 80
Прочее: bottom = KeyboardView.bottom 4
Ответ №1:
Вы должны использовать UIInputViewController и его inputView
. «Клавиатура» (вид ввода) автоматически появится в нужном месте на всех типах устройств.
Комментарии:
1. Спасибо, что указали мне правильное направление! Я думал, вы можете использовать это только с расширениями клавиатуры.
2. Я просто хотел сказать, что нашел раздел об этом в вашей книге по программированию для iOS 12 через Google books. Это была огромная помощь, и я планирую получить копию, как только получу больше опыта в разработке iOS.
Ответ №2:
На случай, если кто-то еще пытается сделать то же самое, я, наконец, понял это.
Я попытался переопределить мой контроллер просмотра 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()
текстового поля, пожалуйста, дайте мне знать.
Надеюсь, это кому-нибудь поможет.