如何设置UITextField的inputAccessoryView的指定位置?
调整UITextField的inputAccessoryView中子视图的位置
嘿,我来帮你搞定这个inputAccessoryView的位置调整问题!你现在直接给按钮设置frame的方式可能不太靠谱——系统会自动管理inputAccessoryView的尺寸和布局,直接写frame很容易被系统的布局逻辑覆盖。更稳妥的做法是把按钮放在一个容器视图里,用AutoLayout来精准控制它的位置。
核心思路
inputAccessoryView的宽度会自动匹配键盘宽度,我们只需要定义它的高度,然后在这个容器内部用AutoLayout约束来定位按钮,这样不管键盘尺寸怎么变化,按钮的位置都能保持你想要的样子。
完整代码示例
class MyTextField: UITextField { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setupInputAccessoryView() } override init(frame: CGRect) { super.init(frame: frame) setupInputAccessoryView() } private func setupInputAccessoryView() { // 1. 创建容器视图作为inputAccessoryView的载体 let accessoryContainer = UIView() accessoryContainer.backgroundColor = .lightGray // 可选,方便观察布局范围 accessoryContainer.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50) accessoryContainer.translatesAutoresizingMaskIntoConstraints = false // 2. 创建目标按钮 let testButton = UIButton(type: .system) testButton.backgroundColor = .orange testButton.setTitleColor(.white, for: .normal) testButton.setTitle("Test", for: .normal) // 必须关闭自动约束转换,否则自定义约束不生效 testButton.translatesAutoresizingMaskIntoConstraints = false accessoryContainer.addSubview(testButton) // 3. 添加约束定位按钮,这里提供几个常见场景供你选择: // 场景1:按钮靠右对齐,上下与容器贴齐,宽度固定80 NSLayoutConstraint.activate([ testButton.trailingAnchor.constraint(equalTo: accessoryContainer.trailingAnchor, constant: -16), testButton.topAnchor.constraint(equalTo: accessoryContainer.topAnchor), testButton.bottomAnchor.constraint(equalTo: accessoryContainer.bottomAnchor), testButton.widthAnchor.constraint(equalToConstant: 80) ]) // 场景2:按钮靠左对齐,上下贴齐,宽度固定 // NSLayoutConstraint.activate([ // testButton.leadingAnchor.constraint(equalTo: accessoryContainer.leadingAnchor, constant: 16), // testButton.topAnchor.constraint(equalTo: accessoryContainer.topAnchor), // testButton.bottomAnchor.constraint(equalTo: accessoryContainer.bottomAnchor), // testButton.widthAnchor.constraint(equalToConstant: 80) // ]) // 场景3:按钮水平居中,上下贴齐,宽度固定 // NSLayoutConstraint.activate([ // testButton.centerXAnchor.constraint(equalTo: accessoryContainer.centerXAnchor), // testButton.topAnchor.constraint(equalTo: accessoryContainer.topAnchor), // testButton.bottomAnchor.constraint(equalTo: accessoryContainer.bottomAnchor), // testButton.widthAnchor.constraint(equalToConstant: 80) // ]) // 场景4:自定义任意位置,比如距左50、距顶10,宽80高30 // NSLayoutConstraint.activate([ // testButton.leadingAnchor.constraint(equalTo: accessoryContainer.leadingAnchor, constant: 50), // testButton.topAnchor.constraint(equalTo: accessoryContainer.topAnchor, constant: 10), // testButton.widthAnchor.constraint(equalToConstant: 80), // testButton.heightAnchor.constraint(equalToConstant: 30) // ]) // 绑定inputAccessoryView并设置自适应宽度 inputAccessoryView = accessoryContainer inputAccessoryView?.autoresizingMask = .flexibleWidth } }
关键注意点
- 一定要给按钮设置
translatesAutoresizingMaskIntoConstraints = false,否则系统会自动生成约束覆盖你的自定义布局。 - 容器视图的宽度无需硬编码,
autoresizingMask = .flexibleWidth会让它自动适配不同屏幕的键盘宽度。 - 如果需要添加多个按钮或更复杂的布局,只需要在容器里新增控件,再用约束管理它们的位置关系即可。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

