在iOS11環(huán)境下孽江,使用UITextField將UIDatePicker作為其inputView并設置一定高度嘁锯,將UIToolbar作為其inputAccessoryView時乐纸,會出現(xiàn)UIToolbar非正常顯示的問題絮缅;
實驗環(huán)境如下:
- IDE:XCode
- 系統(tǒng):iOS11+
- 語言:Swift(OC同樣會出現(xiàn))
- 問題控件:UIToolbar
實驗demo如下(Swift):
import UIKit
class ViewController: UIViewController {
lazy var textField: UITextField = {
let textField_ = UITextField(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 200, height: 44)))
textField_.center = self.view.center
textField_.backgroundColor = UIColor.gray
textField_.placeholder = "點擊彈出鍵盤"
return textField_
}()
lazy var textFieldInputView: UIView = {
// 高度過低時棋嘲,會出現(xiàn)其與UIToolbar之間間隔較大县爬;高度過高時,UIToolbar無法顯示
let textFieldInputView_ = UIDatePicker(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 0, height: 250)))
textFieldInputView_.backgroundColor = UIColor.yellow
// textFieldInputView_.autoresizingMask = .flexibleHeight
return textFieldInputView_
}()
lazy var toolBar: UIToolbar = {
let toolBar_ = UIToolbar(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 0, height: 35)))
toolBar_.backgroundColor = UIColor.black
toolBar_.tintColor = UIColor.blue
let spaceItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let doneItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(clickDoneButtonItem(sender:)))
toolBar_.items = [spaceItem, doneItem]
return toolBar_
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
view.addSubview(textField)
textField.inputView = textFieldInputView
textField.inputAccessoryView = toolBar
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
// MARK: - event response
extension ViewController {
@objc private func clickDoneButtonItem(sender: UIBarButtonItem) {
textField.resignFirstResponder()
}
}
當手動設置UIDatePicker高度時软族,會出現(xiàn)以下兩種情況:
- 高度較小刷喜,UIDatePicker與UIToolBar之間出現(xiàn)留白
- 高度較大,UIToolBar被UIDatePicker遮擋
image
image
為實現(xiàn)最佳效果立砸,要么將UIToolBar改為自定義View掖疮,但要手動書寫隨UIDatePicker改變的動畫;要么固定UIDatePicker高度颗祝,使之既美觀又不至于影響UIToolBar的顯示浊闪。
這里我采納第二種方案,在UIDatePicker初始化中添加 myInputView.autoresizingMask = .flexibleHeight 代碼螺戳,使之自適應高度搁宾。
image
stackoverflow:Custom Keyboard InputAccessoryView not visible in iOS 11