У меня возникла проблема с пользовательскими представлениями аксессуаров ввода при запуске моего приложения на iPhone X. При переключении между пользовательским представлением ввода и системной клавиатурой на iPhone X представление пользовательских аксессуаров не будет прикреплено к верхней частиклавиатура, либо становится неясной, либо оставляет значительный разрыв при изменении размера.Как этого избежать?
У меня никогда не было этой проблемы до появления iPhone X. Похоже, что аксессуар должен быть автоматически прикреплен к клавиатуре без какого-либо дополнительного кода.
import UIKit
class ViewController: UIViewController {
lazy var input: TextInput = {
let input = TextInput(frame: CGRect(origin: .zero, size: CGSize(width: self.view.bounds.width, height: 200)))
input.backgroundColor = #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 0.7024097711)
input.autoresizingMask = [.flexibleHeight]
return input
}()
lazy var accessory: TextAccessory = {
let accessory = TextAccessory(frame: CGRect(origin: .zero, size: CGSize(width: self.view.bounds.width, height: 60)))
accessory.backgroundColor = #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 0.7)
accessory.autoresizingMask = [.flexibleHeight]
accessory.control.addTarget(self, action: #selector(controlChanged(sender:)), for: .valueChanged)
accessory.control.selectedSegmentIndex = 1
return accessory
}()
@IBOutlet var textView: UITextView?
override func viewDidLoad() {
super.viewDidLoad()
textView?.inputView = input
textView?.inputAccessoryView = accessory
}
@objc func controlChanged(sender: Any?) {
textView?.inputView = accessory.control.selectedSegmentIndex == 1 ? input : nil
textView?.reloadInputViews()
}
}
class TextInput: UIView {
lazy var button: UIButton = {
let b = UIButton(type: .system)
b.setTitle("Test", for: .normal)
self.addSubview(b)
return b
}()
override func layoutSubviews() {
super.layoutSubviews()
let size = button.sizeThatFits(bounds.size)
button.bounds = CGRect(origin: .zero, size: size)
button.center = CGPoint(x: bounds.midX, y: bounds.midY)
}
}
class TextAccessory: UIView {
lazy var control: UISegmentedControl = {
let c = UISegmentedControl(items: ["Keyboard", "Custom"])
self.addSubview(c)
return c
}()
override func layoutSubviews() {
super.layoutSubviews()
let size = control.sizeThatFits(bounds.size)
control.bounds = CGRect(origin: .zero, size: size)
control.center = CGPoint(x: bounds.midX, y: bounds.midY)
}
}
Вспомогательное представление ввода должно автоматически закреплять верхнюю часть клавиатуры, но при переключении между стандартной клавиатурой и пользовательским представлением ввода вспомогательное представление либо появляется над, либо под верхней частью клавиатуры.
Ссылка на репозиторий GitHub, содержащий весь пример проекта, приведена ниже: https://github.com/pmodernme/Input-View-Switch