Ios UIView帧在traitCollectionDidChange期间未更新

Ios UIView帧在traitCollectionDidChange期间未更新,ios,swift,frame,calayer,uitraitcollection,Ios,Swift,Frame,Calayer,Uitraitcollection,我根据UIView子类中的框架使用CALayer绘制了一些图形,当设备旋转时,我需要更新线条,但在traitCollectionDidChange中,框架仍保留旋转前的值。有没有办法在旋转后获得帧的更新值 我的图形代码如下所示,在其视图控制器的traitCollectionDidChange中调用: func setup() { layer.sublayers?.removeAll() let xAxisLine = UIBezierPath() xAxisLine.

我根据UIView子类中的框架使用CALayer绘制了一些图形,当设备旋转时,我需要更新线条,但在traitCollectionDidChange中,框架仍保留旋转前的值。有没有办法在旋转后获得帧的更新值

我的图形代码如下所示,在其视图控制器的traitCollectionDidChange中调用:

func setup() {

    layer.sublayers?.removeAll()

    let xAxisLine = UIBezierPath()
    xAxisLine.move(to: CGPoint(x: 100, y: frame.height))
    xAxisLine.addLine(to: CGPoint(x: bounds.width, y: frame.height))
    let xAxisLayer = CAShapeLayer()
    xAxisLayer.path = xAxisLine.cgPath
    xAxisLayer.lineWidth = 2
    xAxisLayer.fillColor = UIColor.clear.cgColor
    xAxisLayer.strokeColor = UIColor.black.cgColor
    layer.addSublayer(xAxisLayer)
}
此部分绘制自定义图形的X轴,但更重要的是帧值是旋转前的,因此整个图形不合适且大小不合适

在视图控制器中,我通过以下方式调用它:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

    super.traitCollectionDidChange(previousTraitCollection)

    barView.setup()
}

当方向更改时,不更新图形,而是始终向视图添加新图层


您应该在
viewDidLoad
中创建图层,并保存对它的引用。在
traitCollectionDidChange
中,您只需为图层指定一个新路径。

您不需要更新图形,而是在方向更改时始终向视图添加一个新图层


您应该在
viewDidLoad
中创建图层,并保存对它的引用。在
traitCollectionDidChange
中,您只需为层指定一个新路径。

您可以使用“运动事件”来检测ios中的设备


您可以使用motion event,它对在ios中检测设备有完全帮助


请使用您的
traitCollectionDidChange
实现更新问题。我承认我不应该使用我的设置代码进行重画,但目前我的重点是获取用于重画的框架的新值。请使用您的
traitCollectionDidChange
实现更新问题。我承认我应该这样做不使用我的设置代码进行重绘,但目前我的重点是获取用于重绘的帧的新值,但如果没有视图的新高度和宽度,如何计算要绘制的路径?您可以使用覆盖
布局子视图
UIView
)而不是
traitCollectionDidChange
)或者
viewdilayoutsubviews
UIViewController
)。但是如果没有视图的新高度和宽度,如何计算要绘制的路径?您可以使用覆盖
layoutSubviews
UIView
)或
viewdilayoutsubviews
UIViewController
)谢谢但是我不需要在设备旋转时有那么高的精度。我只需要旋转后UIView的框架。我允许设备通过自己的计算来执行。谢谢。。。但是我不需要在设备旋转时有那么高的精度。我只需要旋转后UIView的框架。我允许设备通过自己的计算来执行