Swift中UIToolbar定位问题:如何置于居中UIPickerView正上方
解决UIPickerView上方UIToolBar的定位问题
哈哈,这个问题我当初做项目的时候也踩过坑!核心问题就是你没把工具栏和选择器的位置绑定在一起,而是各自和整个视图做关联。给你两个实用的解决方案,按需选:
方案1:用Auto Layout(推荐,适配全屏幕)
最稳妥的方式是把工具栏和选择器放进同一个容器视图里,先固定它们的相对位置,再把整个容器居中到屏幕上。这样不管屏幕尺寸怎么变,两者的相对位置都不会乱。
// 1. 创建容器视图,用来包裹toolbar和pickerView let containerView = UIView() containerView.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(containerView) // 2. 将toolbar和pickerView添加到容器中 containerView.addSubview(self.toolBar) containerView.addSubview(self.pickerView) // 3. 让容器视图在屏幕中居中 NSLayoutConstraint.activate([ containerView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), containerView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor) ]) // 4. 设置toolbar和pickerView的相对约束:toolbar紧贴picker顶部,宽度一致 NSLayoutConstraint.activate([ // Toolbar的约束:顶部、左右和容器对齐,高度设为标准的44 self.toolBar.topAnchor.constraint(equalTo: containerView.topAnchor), self.toolBar.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), self.toolBar.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), self.toolBar.heightAnchor.constraint(equalToConstant: 44), // PickerView的约束:顶部紧贴toolbar底部,左右和容器对齐,底部和容器对齐 self.pickerView.topAnchor.constraint(equalTo: self.toolBar.bottomAnchor), self.pickerView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), self.pickerView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), self.pickerView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) ])
方案2:手动计算Frame(适合简单场景)
如果不想用Auto Layout,也可以手动基于pickerView的最终布局来计算toolbar的位置,但要注意必须在视图布局完成后再计算,不然picker的frame还没确定。
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 基于pickerView的frame计算toolbar的位置:x和picker一致,y是picker的y减去toolbar高度 let toolbarFrame = CGRect( x: self.pickerView.frame.origin.x, y: self.pickerView.frame.origin.y - 44, // 44是toolbar的标准高度 width: self.pickerView.frame.size.width, height: 44 ) self.toolBar.frame = toolbarFrame // 添加toolbar到视图,并确保它显示在正确层级 self.view.addSubview(self.toolBar) self.view.bringSubviewToFront(self.toolBar) }
为啥之前的方法行不通?
- 用
self.toolBar.center = self.view.center:toolbar的中心点和屏幕中心重合,而picker的中心点也是屏幕中心,两者的高度叠加就会导致重叠。 - 直接
self.view.addSubview(self.toolBar):toolbar默认的frame是从屏幕顶部开始的(x=0,y=0),所以会跑到视图最上方,完全没和picker关联。
内容的提问来源于stack exchange,提问作者Whitney
相关产品推荐
相关产品推荐

