gpt4 book ai didi

ios - 调整 inputAccessoryView 大小时如何解决 "API error: returned 0 width, assuming UIViewNoIntrinsicMetric"?

转载 作者:行者123 更新时间:2023-12-03 19:43:27 25 4
gpt4 key购买 nike

我从这里粘贴了代码示例:https://stackoverflow.com/a/46510833/784637进入新的单一 View 应用程序以将 inputAccessoryView 固定在屏幕底部:


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
}
}

当我运行模拟器时,一切看起来都很棒,但是当我点击 UITextField 时控制台会报告此错误:

API error: <_UIKBCompatInputView: 0x7fc725f20520; frame = (0 0; 0 0); layer = <CALayer: 0x60000232e6c0>> returned 0 width, assuming UIViewNoIntrinsicMetric

我尝试将 intrinsicContentSize 覆盖为非零值,例如 CGSize(width: 50, height: 50) 但仍然收到此错误。我该如何解决这个问题?

最佳答案

发生这种情况是因为您拥有所有必需的约束,但最初返回的内在大小。因此,布局系统尝试以零大小布局您的 View ,无法满足您的约束,因此会破坏文本字段的大小。解决此问题的最简单(也许是最好的?)方法是将约束的优先级降低到略低于所需,以便系统可以暂时打破它们。

但在我们查看代码之前,我们先来一个架构建议:如果您需要 CustomView,为什么不直接在其中创建文本字段,而不是让 View Controller 负责注入(inject)文本字段本质上是一个虚拟 View 。

class CustomView: UIView {

private let textField = UITextField(frame: .zero)

init(frame: CGRect) {
backgroundColor = .groupTableViewBackground

// do your textfield setup here
addSubview(textField)
textField.translatesAutoresizingMaskIntoConstraints = false
textField.borderStyle = .roundedRect

// set up your constraints
let constraints: [NSLayoutConstraint] = [
textField.topAnchor.constraint(equalTo: topAnchor, constant: 8),
textField.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8),
textField.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
textField.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8),
]

// slightly reduce the priority of all of your constraints
constraints.forEach { $0.priority = UILayoutPriority(rawValue: 999) }

// activate them
NSLayoutConstraint.activate(constraints)
}
}

现在,在您的 View Controller 中,您只需将附件 View 声明为:

override var inputAccessoryView = CustomView()

不需要私有(private)存储、隐式解包选项等。

关于ios - 调整 inputAccessoryView 大小时如何解决 "API error: returned 0 width, assuming UIViewNoIntrinsicMetric"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59401355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com