如何将UIView插入至UIToolbar?已尝试addSubview方法无效
解决UIToolbar中插入UIView不显示的问题
嘿,我懂你遇到的麻烦了——直接用addSubview给UIToolbar加自定义视图确实不会生效,这是因为UIToolbar内部有自己的布局逻辑,它只认通过setItems(_:animated:)方法添加的UIBarButtonItem,直接塞进去的子视图会被它的布局系统忽略掉。
下面给你两种可行的解决方案:
方案一:把UIView包装成UIBarButtonItem(最常用)
这是最简单直接的方法,把你想要插入的UIView包装成UIBarButtonItem,然后加入toolbar的items数组即可。结合你的现有代码,修改后的完整示例如下:
// Toolbar -> Done Button let toolbar = UIToolbar() toolbar.sizeToFit() // 创建你需要插入的自定义UIView,这里以UILabel为例,你可以替换成自己的视图 let customView = UILabel() customView.text = "自定义内容" customView.textColor = .darkGray customView.sizeToFit() // 将自定义视图包装为UIBarButtonItem let customBarItem = UIBarButtonItem(customView: customView) let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonClicked)) // 将自定义item、弹性空间、done按钮依次加入toolbar toolbar.setItems([customBarItem, flexibleSpace, doneButton], animated: false) self.TextInput.inputAccessoryView = toolbar
这样处理后,你的自定义UIView就会和done按钮一起正常显示在toolbar上,完全适配UIToolbar的布局规则。
方案二:自定义UIToolbar子类(复杂布局场景)
如果你的自定义视图需要更复杂的布局(比如占据toolbar的大部分宽度、多层嵌套视图),可以自定义UIToolbar的子类,重写layoutSubviews方法来手动布局子视图:
class CustomToolbar: UIToolbar { let customView = UIView() override init(frame: CGRect) { super.init(frame: frame) setupCustomView() } required init?(coder: NSCoder) { super.init(coder: coder) setupCustomView() } private func setupCustomView() { customView.backgroundColor = .lightGray customView.translatesAutoresizingMaskIntoConstraints = false self.addSubview(customView) // 添加约束,比如让自定义视图左边对齐,高度和toolbar一致,宽度100 NSLayoutConstraint.activate([ customView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16), customView.centerYAnchor.constraint(equalTo: self.centerYAnchor), customView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.8), customView.widthAnchor.constraint(equalToConstant: 100) ]) } override func layoutSubviews() { super.layoutSubviews() // 确保自定义视图的布局在toolbar布局后生效 customView.layoutIfNeeded() } }
使用的时候直接实例化这个自定义toolbar即可:
let toolbar = CustomToolbar() toolbar.sizeToFit() // 继续添加你的done按钮等item let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonClicked)) toolbar.setItems([flexibleSpace, doneButton], animated: false) self.TextInput.inputAccessoryView = toolbar
从你提供的配图来看,方案一完全能满足你的需求,推荐优先使用这种方法。
内容的提问来源于stack exchange,提问作者N. Beer
相关产品推荐
相关产品推荐

