Ответ 1
Настройка
- Создайте файл
xib
, который включает все ваши ключи - Используйте Autolayout, чтобы клавиши изменяли размер до нужных пропорций, независимо от того, насколько велика клавиатура для установки позже.
-
Создайте файл
swift
с тем же именем, что и файлxib
, и установите его как владельца файла в настройке файлаxib
. -
Подключите все кнопки кнопок к методу IBAction в файле
swift
. (См. Код ниже.)
Код
Я использую шаблон делегирования для связи между пользовательским видом клавиатуры и основным контроллером. Это позволяет их развязать. Несколько разных пользовательских клавиатур можно было бы менять и изменять без необходимости изменения детального кода реализации в главном контроллере представления.
Keyboard.swift
файл
import UIKit
protocol KeyboardDelegate {
func keyWasTapped(character: String)
}
class Keyboard: UIView {
var delegate: KeyboardDelegate?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initializeSubviews()
}
override init(frame: CGRect) {
super.init(frame: frame)
initializeSubviews()
}
func initializeSubviews() {
let xibFileName = "Keyboard" // xib extention not needed
let view = NSBundle.mainBundle().loadNibNamed(xibFileName, owner: self, options: nil)[0] as! UIView
self.addSubview(view)
view.frame = self.bounds
}
@IBAction func keyTapped(sender: UIButton) {
self.delegate?.keyWasTapped(sender.titleLabel!.text!)
}
}
Контроллер главного экрана
Обратите внимание, что ViewController
соответствует протоколу KeyboardDelegate
, который мы создали. Кроме того, при создании экземпляра представления клавиатуры необходимо установить height
, но width
нет. Очевидно, что установка текстового поля inputView
обновляет ширину экрана клавиатуры до ширины экрана, что удобно.
class ViewController: UIViewController, KeyboardDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// get an instance of the Keyboard (only the height is important)
let keyboardView = Keyboard(frame: CGRect(x: 0, y: 0, width: 0, height: 300))
// use the delegate to communicate
keyboardView.delegate = self
// replace the system keyboard with the custom keyboard
textField.inputView = keyboardView
}
// required method for keyboard delegate protocol
func keyWasTapped(character: String) {
textField.insertText(character)
}
}
Источники
- Предложения @ryancrunchi были полезны.
- Этот ответ из Создание многоразового UIView с xib (и загрузка из раскадровки)