ios - agrega una vista en la parte superior del teclado usando InputAccessoryView swift
(4)
Estoy tratando de agregar una vista para estar siempre encima del teclado. Lo hice primero con KeyboardWillShow / Hide, pero no cubre todos los casos y estoy tratando de usar inputAccesoryView. esto es lo que intenté
private var accessoryView = UIView(frame: CGRectZero)
class ViewController : UIViewController {
var myView: customUIView
override var inputAccessoryView: UIView {
return accessoryView
}
override func canBecomeFirstResponder() -> Bool {
return true
}
override func viewDidLoad() {
super.viewDidLoad()
accessoryView = myView
}
}
Recibo el siguiente error: la aplicación finalizó debido a la excepción no detectada ''UIViewControllerHierarchyInconsistency'', razón: ''controlador de vista hijo: UICompatibilityInputViewController debe tener controlador de vista padre: MyViewController pero el padre solicitado es: UIInputWindowController:''
Cualquier ayuda será apreciada!
Detalles
xcode 9.2, swift 4
Solución
TecladoToolbarButton
import UIKit
enum KeyboardToolbarButton: Int {
case done = 0
case cancel
case back, backDisabled
case forward, forwardDisabled
func createButton(target: Any?, action: Selector?) -> UIBarButtonItem {
var button: UIBarButtonItem!
switch self {
case .back:
button = UIBarButtonItem(title: "back", style: .plain, target: target, action: action)
case .backDisabled:
button = UIBarButtonItem(title: "back", style: .plain, target: target, action: action)
button.isEnabled = false
case .forward:
button = UIBarButtonItem(title: "forward", style: .plain, target: target, action: action)
case .forwardDisabled:
button = UIBarButtonItem(title: "forward", style: .plain, target: target, action: action)
button.isEnabled = false
case .done:
button = UIBarButtonItem(title: "done", style: .plain, target: target, action: action)
case .cancel:
button = UIBarButtonItem(title: "cancel", style: .plain, target: target, action: action)
}
button.tag = rawValue
return button
}
static func detectType(barButton: UIBarButtonItem) -> KeyboardToolbarButton? {
return KeyboardToolbarButton(rawValue: barButton.tag)
}
}
KeyboardToolbar
import UIKit
protocol KeyboardToolbarDelegate: class {
func keyboardToolbar(button: UIBarButtonItem, type: KeyboardToolbarButton, tappedIn toolbar: KeyboardToolbar)
}
class KeyboardToolbar: UIToolbar {
weak var toolBarDelegate: KeyboardToolbarDelegate?
init() {
super.init(frame: .zero)
barStyle = UIBarStyle.default
isTranslucent = true
sizeToFit()
isUserInteractionEnabled = true
}
func setup(leftButtons: [KeyboardToolbarButton], rightButtons: [KeyboardToolbarButton]) {
let leftBarButtons = leftButtons.map { (item) -> UIBarButtonItem in
return item.createButton(target: self, action: #selector(buttonTapped))
}
let rightBarButtons = rightButtons.map { (item) -> UIBarButtonItem in
return item.createButton(target: self, action: #selector(buttonTapped(sender:)))
}
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
setItems(leftBarButtons + [spaceButton] + rightBarButtons, animated: false)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
@objc func buttonTapped(sender: UIBarButtonItem) {
if let type = KeyboardToolbarButton.detectType(barButton: sender) {
toolBarDelegate?.keyboardToolbar(button: sender, type: type, tappedIn: self)
}
}
}
Ejemplo completo de uso
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
createTextField(frame: CGRect(x: 50, y: 50, width: 200, height: 40), leftButtons: [.backDisabled, .forward], rightButtons: [.cancel])
createTextField(frame: CGRect(x: 50, y: 120, width: 200, height: 40), leftButtons: [.back, .forwardDisabled], rightButtons: [.done])
}
private func createTextField(frame: CGRect, leftButtons: [KeyboardToolbarButton] = [], rightButtons: [KeyboardToolbarButton] = []) {
let textField = UITextField(frame: frame)
textField.borderStyle = .roundedRect
let toolbar = KeyboardToolbar()
toolbar.toolBarDelegate = self
toolbar.setup(leftButtons: leftButtons, rightButtons: rightButtons)
textField.inputAccessoryView = toolbar
view.addSubview(textField)
}
}
extension ViewController: KeyboardToolbarDelegate {
func keyboardToolbar(button: UIBarButtonItem, type: KeyboardToolbarButton, tappedIn toolbar: KeyboardToolbar) {
print("Tapped button type: /(type)")
}
}
Resultados
Cambios para hacer a su código:
- Regala un
accessoryView
altura - Eliminar
var myView: customUIView
y laviewDidLoad()
completa deviewDidLoad()
Para obtener una vista que sobresalga del teclado, el código en sí es bastante simple. El código que publicó no es correcto, intente esto (tenga en cuenta que debe conectar textField
al UITextField
en su guión gráfico):
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let customView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 44))
customView.backgroundColor = UIColor.red
textField.inputAccessoryView = customView
}
Prueba esto.
override var inputAccessoryView: UIView? {
get {
return containerView
}
}
override var canBecomeFirstResponder: Bool {
return true
}