StackView中UIView的图层位置异常问题
Hey there! 刚接触Swift和编程就动手搞布局,已经超棒啦😉 你遇到的底部圆圈位置偏离IB布局框的问题,大概率是StackView的约束、子视图尺寸或者画圆逻辑出了小问题,我给你几个具体的排查和解决方向:
先把外层StackView的约束拉对
既然要让网格在屏幕中央,那外层的StackView(应该是垂直方向的那个)必须绑定水平居中和垂直居中的约束,别给它加固定的底部约束到屏幕底部!如果错把底部约束绑到了屏幕边缘,整个StackView就会往下偏移,底部的圆圈自然就跑远了。另外,不要给外层StackView设固定宽高,让它根据子视图的大小自适应就好。给每个UIView加正方形约束
要画圆圈,每个承载圆圈的UIView必须是正方形(宽=高)。你可以给每个UIView添加宽高相等的约束,再设置一个固定的宽(比如60pt),或者给StackView设置distribution为FillEqually,让四个子视图平分StackView的空间。如果子视图没有明确的尺寸约束,StackView可能会乱拉伸,导致布局错位。画圆的代码要跟着视图bounds走
别用固定坐标画圆!一定要基于当前UIView的bounds来绘制,这样不管视图怎么布局,圆圈都会乖乖待在视图中央。比如在自定义UIView的代码里这么写:override func draw(_ rect: CGRect) { super.draw(rect) guard let ctx = UIGraphicsGetCurrentContext() else { return } // 用bounds来确定圆的位置,insetBy是给圆留个小边距,可选 let circleFrame = bounds.insetBy(dx: 2, dy: 2) ctx.setFillColor(UIColor.gray.cgColor) ctx.fillEllipse(in: circleFrame) }如果你的代码里写了固定的Y值(比如
CGRect(x: 0, y: 80, width: 60, height: 60)),那视图位置一变,圆就会脱离视图本身。检查StackView的对齐和间距设置
假设你的结构是「垂直StackView → 两个水平StackView,每个水平里放两个UIView」,那要确保:- 垂直StackView的
alignment设为Center,让两个水平StackView居中对齐 - 每个水平StackView的
alignment也设为Center,让里面的UIView垂直居中 - 两个StackView的
spacing不要设得太大,不然会把底部的视图往下推
- 垂直StackView的
另外,推荐你用Xcode的Debug View Hierarchy功能(点击右上角的调试按钮,长得像个方块带箭头),查看每个视图的实际frame,能一眼看出是StackView整体偏移了,还是某个子视图的尺寸不对,定位问题超快!
内容的提问来源于stack exchange,提问作者JasonB

