这对我有用。看起来在viewWillAppear 中调用view.layoutIfNeeded() 很重要。
import UIKit
class InputVC: UIInputViewController {
var initialHeightConstraint: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
guard let view = view else { return }
view.backgroundColor = .red
view.translatesAutoresizingMaskIntoConstraints = false
self.initialHeightConstraint = NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: UIScreen.main.bounds.height)
self.initialHeightConstraint?.isActive = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
view.layoutIfNeeded()
}
}
class ViewController: UIViewController {
var inputVC = InputVC()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .green
}
override var canBecomeFirstResponder: Bool {
true
}
override var inputAccessoryViewController: UIInputViewController? {
inputVC
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
becomeFirstResponder()
}
}
我还尝试将它固定到窗口的几个位置,这也有效,但在控制台中出现了约束错误。
override func didMove(toParent parent: UIViewController?) {
super.didMove(toParent: parent)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard let view = view, let window = view.window else { return }
self.initialHeightConstraint?.isActive = false
NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: window, attribute: .top, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: window, attribute: .bottom, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: view, attribute: .left, relatedBy: .equal, toItem: window, attribute: .left, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: window, attribute: .right, multiplier: 1, constant: 0).isActive = true
self.view.layoutIfNeeded()
}