如何在所有屏幕尺寸上调整视图大小?

时间:2019-04-11 21:37:35

标签: ios swift uiview autolayout

我正在创建一个简单的计时器应用程序,并希望将计时器圈调整为带有圆角的视图尺寸。计时器路径已添加到背景视图类中。

在我的iPhone XS Max上,它看起来像这样:

Timer on iPhone XS Max

但是,在iPhone SE模拟器上,它看起来像这样:

Timer on iPhone SE

如何确保计时器圈的大小正确?

这是我确定圆形路径大小的代码:

private func addTimerCircle() {
    let translateAmount = -(CGFloat.pi/2)

    let circlePath = UIBezierPath(arcCenter: CGPoint.zero, radius: (self.frame.width - 64)/2, startAngle: translateAmount, endAngle: (2*CGFloat.pi)+translateAmount, clockwise: true)

    addTrackLayer(withPath: circlePath)
}

private func addTrackLayer(withPath circlePath: UIBezierPath) {
    let trackLayer = CAShapeLayer()

    trackLayer.path = circlePath.cgPath

    trackLayer.strokeColor = UIColor.red.withAlphaComponent(0.5).cgColor
    trackLayer.lineWidth = 10
    trackLayer.position = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
    trackLayer.fillColor = UIColor.clear.cgColor
    layer.addSublayer(trackLayer)
}

为什么在不同的屏幕尺寸上,circlePath不会基于frame.width调整大小?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

视图控制器视图将以它们在Interface Builder中的大小加载,并且一旦将它们添加到层次结构中,视图就会被调整为实际大小。

我猜您是在addTimerCircle()上调用viewDidLoad(),这是在应用最终大小调整之前发生的。

您可以覆盖viewDidLayoutSubviews(),当视图大小更改时将调用它,并在那里添加/更新形状,但我的建议是继承UIView,将形状层添加为属性,并更新其在layoutSubviews上的框架。