技术问题:UIPickerView的Toolbar不可见(附ViewLoad调用的相关代码)
排查UIPickerView Toolbar不显示的问题
从你提供的代码片段来看,Toolbar无法显示通常是几个常见细节遗漏导致的,我帮你逐一分析并给出修复方案:
常见原因及修复步骤
1. 最核心问题:未将Toolbar加入视图层级
你创建了toolBar对象,但没有调用view.addSubview(toolBar)把它添加到当前视图的层级结构中——没有被添加到视图树里的控件,系统根本不会渲染它,这是最容易忽略的点。
2. Frame位置计算逻辑混乱
你的代码里把Picker的Y轴设为0(放在屏幕最顶部),而Toolbar的Y轴是self.view.frame.size.height - picker.frame.size.height -50,这会让两个控件的位置完全脱节:
- Picker占据屏幕顶部300高度的区域
- Toolbar则被放在屏幕中间偏下的位置(比如iPhone 8屏幕高度667的话,Y轴为667-300-50=317)
如果你的需求是把Picker和Toolbar一起放在屏幕底部(这是Picker的常规使用方式),应该调整两者的位置计算:
// 先计算Picker的Y位置:从屏幕底部往上300 let pickerHeight: CGFloat = 300 let pickerY = self.view.frame.size.height - pickerHeight picker = UIPickerView(frame: CGRect(x: 0, y: pickerY, width: view.frame.width, height: pickerHeight)) // Toolbar放在Picker的正上方,Y位置是pickerY减去自身高度 let toolBarHeight: CGFloat = 50 let toolBarY = pickerY - toolBarHeight let toolBar = UIToolbar(frame: CGRect(x: 0, y: toolBarY, width: view.frame.width, height: toolBarHeight))
3. Toolbar无内容导致视觉上“消失”
如果Toolbar是空的(没有设置items),且它的背景色和父视图背景色接近,会看起来像是没显示。你需要给Toolbar至少添加一个功能按钮(比如“完成”按钮):
// 创建完成按钮 let doneButton = UIBarButtonItem(title: "完成", style: .done, target: self, action: #selector(donePicker)) // 添加灵活空间让按钮靠右对齐 let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) toolBar.items = [flexibleSpace, doneButton]
别忘了实现对应的按钮点击方法:
@objc func donePicker() { view.endEditing(true) // 这里可以添加你点击完成后的业务逻辑 }
4. AutoLayout覆盖了Frame设置
如果你的视图控制器使用了AutoLayout,而你没有设置translatesAutoresizingMaskIntoConstraints = true,那么你手动设置的frame会被AutoLayout的约束覆盖,导致控件位置错误或不显示。可以在创建Picker和Toolbar时加上这行代码:
picker.translatesAutoresizingMaskIntoConstraints = true toolBar.translatesAutoresizingMaskIntoConstraints = true
完整修复后的示例代码
private func createPickerView(){ // 定义控件高度常量 let pickerHeight: CGFloat = 300 let toolBarHeight: CGFloat = 50 // 计算控件Y轴位置(放在屏幕底部) let pickerY = self.view.frame.size.height - pickerHeight let toolBarY = pickerY - toolBarHeight // 创建并配置PickerView picker = UIPickerView(frame: CGRect(x: 0, y: pickerY, width: view.frame.width, height: pickerHeight)) picker.showsSelectionIndicator = true picker.delegate = self picker.dataSource = self picker.translatesAutoresizingMaskIntoConstraints = true view.addSubview(picker) // 创建并配置Toolbar let toolBar = UIToolbar(frame: CGRect(x: 0, y: toolBarY, width: view.frame.width, height: toolBarHeight)) toolBar.barStyle = .default toolBar.tintColor = UIColor(red: 14.0/255, green: 122.0/255, blue: 254.0/255, alpha: 1.0) // 补全你之前未写完的颜色值 toolBar.translatesAutoresizingMaskIntoConstraints = true // 给Toolbar添加按钮 let doneButton = UIBarButtonItem(title: "完成", style: .done, target: self, action: #selector(donePicker)) let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) toolBar.items = [flexibleSpace, doneButton] // 将Toolbar添加到视图层级 view.addSubview(toolBar) } @objc private func donePicker() { view.endEditing(true) // 处理完成后的逻辑,比如获取选中值、隐藏Picker等 }
内容的提问来源于stack exchange,提问作者Ravindra Shekhawat
相关产品推荐
相关产品推荐

