如何在 UIView 中居中子视图?

Posted

技术标签:

【中文标题】如何在 UIView 中居中子视图?【英文标题】:How to centre a subview in UIView? 【发布时间】:2018-10-23 12:56:15 【问题描述】:

我正在尝试创建一个计时器。我有一个使用 UIBezierPath 的圆圈,我将制作动画以显示剩余时间。这是绘制形状并将其添加到视图的代码:

func drawBgShape() 
    bgShapeLayer.path = UIBezierPath(arcCenter: CGPoint(x: center.x , y: center.y), radius:
        bounds.width/2, startAngle: -.pi/2, endAngle: 1.5*.pi, clockwise: true).cgPath
    bgShapeLayer.strokeColor = UIColor.red.cgColor
    bgShapeLayer.fillColor = UIColor.clear.cgColor
    bgShapeLayer.lineWidth = 10
    layer.addSublayer(bgShapeLayer)

但是,当代码运行时,它看起来像这样;

我尝试了多种方法使进度条居中,但似乎都不起作用。例如,使用 frame.height/2 没有任何效果。

如何让进度条居中?

谢谢。

编辑: bgShapeLayer 是这样定义的:

let bgShapeLayer = CAShapeLayer()

【问题讨论】:

一切都取决于bgShapeLayer的框架和位置。但是您没有显示该代码。您展示的所有代码都没有单独的意义。 我已经添加了如何定义 bgShapeLayer。没有其他代码会影响 bgShapeLayer。 【参考方案1】:

问题可能是这句话:

arcCenter: CGPoint(x: center.x , y: center.y)

视图中心是视图在其父视图中的位置。那不是你想要的。您想要视图的中心。试试这个:

arcCenter: CGPoint(x: bounds.midX , y: bounds.midY)

但是,如果你给你的形状图层一个框架、大小和位置,并根据形状图层(毕竟,这是绘制形状的位置)来做所有事情,那就更好了。例如:

bgShapeLayer.frame = self.layer.bounds
self.layer.addSublayer(bgShapeLayer)
bgShapeLayer.path = UIBezierPath(
    arcCenter: CGPoint(x: bgShapeLayer.bounds.midX, y: bgShapeLayer.bounds.midY), 
    radius: bgShapeLayer.bounds.width/2, 
    startAngle: -.pi/2, endAngle: 1.5*.pi, clockwise: true).cgPath

这样我们就不会像您的代码那样混淆视图坐标和图层坐标。在某种程度上,您可以避免这种情况,因为在这种情况下,视图内部坐标、其图层内部坐标和bgShapeLayer 内部坐标通常是等价的,但是这种混淆不是一个好习惯进入。你应该说出你的意思,而不是依赖偶然性。

【讨论】:

以上是关于如何在 UIView 中居中子视图?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 UIScrollView 中居中子视图

如何在 TableView 中居中自定义 UIView?

如何在加载了 nib 文件的 UIView 中调整子视图的大小

您如何将 UITextView 居中作为 UIView 的子视图?

Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView

如何在颤动中居中图表视图或树视图?