You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:50:37