我有一个消息应用程序,它具有典型的 UI 设计,即全屏表格视图底部的文本字段。我将该文本字段设置为视图控制器的inputAccessoryView
并打电话ViewController.becomeFirstResponder()
以使该字段显示在屏幕底部。
我知道这是 Apple 推荐的实现此 UI 结构的方法,并且它在“经典”设备上完美运行,但是当我在 iPhone X 模拟器上测试时,我注意到使用这种方法,文本字段不尊重新的“安全区域” 。文本字段呈现在主屏幕指示器下方屏幕的最底部。
我查看了 HIG 文件,但没有发现任何关于inputAccessoryView
在视图控制器上。
这很困难,因为使用这种方法我实际上并不能直接控制任何约束,我只是设置inputAccessoryView
并让视图控制器从那里处理 UI。所以我不能仅仅将场地限制在新的安全区域。
有没有人找到关于此的良好文档或知道在 iPhone X 上运行良好的替代方法?
inputAccessoryView
iPhone X 上的安全区域
工作示例:
import UIKit
class ViewController: UIViewController {
override var canBecomeFirstResponder: Bool { return true }
var _inputAccessoryView: UIView!
override var inputAccessoryView: UIView? {
if _inputAccessoryView == nil {
_inputAccessoryView = CustomView()
_inputAccessoryView.backgroundColor = UIColor.groupTableViewBackground
let textField = UITextField()
textField.borderStyle = .roundedRect
_inputAccessoryView.addSubview(textField)
_inputAccessoryView.autoresizingMask = .flexibleHeight
textField.translatesAutoresizingMaskIntoConstraints = false
textField.leadingAnchor.constraint(
equalTo: _inputAccessoryView.leadingAnchor,
constant: 8
).isActive = true
textField.trailingAnchor.constraint(
equalTo: _inputAccessoryView.trailingAnchor,
constant: -8
).isActive = true
textField.topAnchor.constraint(
equalTo: _inputAccessoryView.topAnchor,
constant: 8
).isActive = true
// this is the important part :
textField.bottomAnchor.constraint(
equalTo: _inputAccessoryView.layoutMarginsGuide.bottomAnchor,
constant: -8
).isActive = true
}
return _inputAccessoryView
}
override func loadView() {
let tableView = UITableView()
tableView.keyboardDismissMode = .interactive
view = tableView
}
}
class CustomView: UIView {
// this is needed so that the inputAccesoryView is properly sized from the auto layout constraints
// actual value is not important
override var intrinsicContentSize: CGSize {
return CGSize.zero
}
}
在这里查看结果 https://i.stack.imgur.com/M7IVp.gif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)