Input Accessory View не корректно корректирует положение при перезагрузке входных видов - PullRequest
0 голосов
/ 28 января 2019

У меня возникла проблема с пользовательскими представлениями аксессуаров ввода при запуске моего приложения на 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

...