Как установить inputViewStyle на UIInputView (инициализированный в XIB)? - PullRequest
0 голосов
/ 08 мая 2020

Я реализую вид над клавиатурой с некоторыми дополнительными кнопками. Я видел, что вы можете использовать UIInputView следующим образом:

let keyboardAccessoryView = UIInputView(frame: .init(x: 0, y: 0, width: 0, height: 40), inputViewStyle: .keyboard)
textView.inputAccessoryView = keyboardAccessoryView

Результат выглядит хорошо (соответствует фону как в светлом, так и в темном режиме).

Я бы предпочел, чтобы я мог определить интерфейс в XIB мне кажется проще. Но свойство inputViewStyle доступно только для чтения, поэтому кажется, что вы можете установить стиль inputView только во время инициализации.

Я пробовал создать подкласс UIInputView и переопределить inputViewStyle, но это не изменило стиль для по какой-то причине.

Есть ли способ инициализировать это со стилем .keyboard и по-прежнему использовать xib?

1 Ответ

1 голос
/ 08 мая 2020

Вы можете загрузить свое представление XIB и добавить его в качестве подпредставления в свой UIInputView:

class InputTestViewController: UIViewController {

    @IBOutlet var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()


        let keyboardAccessoryView = UIInputView(frame: .init(x: 0, y: 0, width: 0, height: 40), inputViewStyle: .keyboard)

        // I have MyInputView configured to load itself from a XIB
        let v = MyInputView()

        // add it to the UIInputView
        keyboardAccessoryView.addSubview(v)

        v.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            v.topAnchor.constraint(equalTo: keyboardAccessoryView.topAnchor),
            v.leadingAnchor.constraint(equalTo: keyboardAccessoryView.leadingAnchor),
            v.trailingAnchor.constraint(equalTo: keyboardAccessoryView.trailingAnchor),
            v.bottomAnchor.constraint(equalTo: keyboardAccessoryView.bottomAnchor),
        ])

        textView.inputAccessoryView = keyboardAccessoryView

    }

}

class MyInputView: UIView, NibLoadable {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupFromNib()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupFromNib()
    }

}

public protocol NibLoadable {
    static var nibName: String { get }
}

public extension NibLoadable where Self: UIView {

    static var nibName: String {
        return String(describing: Self.self) // defaults to the name of the class implementing this protocol.
    }

    static var nib: UINib {
        let bundle = Bundle(for: Self.self)
        return UINib(nibName: Self.nibName, bundle: bundle)
    }

    func setupFromNib() {
        guard let view = Self.nib.instantiate(withOwner: self, options: nil).first as? UIView else { fatalError("Error loading \(self) from nib") }
        addSubview(view)
        view.backgroundColor = .clear
        view.frame = self.bounds
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    }
}

Вот как мое пользовательское представление выглядит в IB (четыре кнопки в горизонтальном представлении стека):

enter image description here

и вот как это выглядит во время выполнения:

enter image description here

...