UIView 框架在 traitCollectionDidChange 期间未更新

UIView frame not updated during traitCollectionDidChange

我基于我的 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 中,您只需为图层指定一个新路径。

您可以使用运动事件,它对 ios 中的检测设备有完整的帮助。

https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html#//apple_ref/doc/uid/TP40009541-CH6-SW2