LOP*_*uke 20 iphone ios inputaccessoryview iphone-x
我有一个消息传递应用程序,它具有全屏表格视图底部的文本字段的典型UI设计.我将该文本字段设置为视图控制器inputAccessoryView并调用ViewController.becomeFirstResponder()以使字段显示在屏幕底部.
我知道这是Apple推荐的实现这种UI结构的方法,它在"经典"设备上运行得很好但是当我在iPhone X模拟器上测试时,我注意到使用这种方法,文本字段不尊重新的"安全区域" .文本字段显示在主屏幕指示器下方屏幕的最底部.
我查看了HIG文档,但没有找到任何关于inputAccessoryView视图控制器的有用信息.
这很难,因为使用这种方法我实际上并没有直接控制任何约束,我只是设置inputAccessoryView并让视图控制器从那里处理UI.所以我不能仅仅把这个领域限制在新的安全区域.
有没有人在这方面找到了很好的文档,或者知道在iPhone X上运行良好的替代方法?
小智 35
inputAccessoryView 和iPhone X上的安全区域当键盘不可见时,inputAccessoryView它固定在屏幕的最底部.没有办法解决这个问题,我认为这是预期的行为.
视图的layoutMarginsGuide(iOS 9+)和safeAreaLayoutGuide(iOS 11)属性设置为inputAccessoryView尊重安全区域,即在iPhone X上:
bottomAnchor主页按钮区域的帐户bottomAnchor它位于键盘的底部inputAccessoryView,这样它就不会在键盘上方留下任何无用的空间工作范例:
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
}
}
Run Code Online (Sandbox Code Playgroud)
ahb*_*bou 32
这是iPhone X上的inputAccessoryViews的一般问题.inputAccessoryView忽略其窗口的safeAreaLayoutGuides.
要修复它,您必须在视图移动到其窗口时在类中手动添加约束:
override func didMoveToWindow() {
super.didMoveToWindow()
if #available(iOS 11.0, *) {
if let window = self.window {
self.bottomAnchor.constraintLessThanOrEqualToSystemSpacingBelow(window.safeAreaLayoutGuide.bottomAnchor, multiplier: 1.0).isActive = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
PS:self这里指的是inputAccessoryView.
我在这里详细介绍了它:http://ahbou.org/post/165762292157/iphone-x-inputaccessoryview-fix
| 归档时间: |
|
| 查看次数: |
12520 次 |
| 最近记录: |