假设您有一个CALayer子类作为视图层次结构的一部分,该子类是通过比例和旋转变换创建的,其中角度和比例仅在运行时定义,即:

let layer = CALayer()
layer.frame = CGRect(x: 10, y: 10, width: 100, height: 100)

//where xx and yy are some precomputed values
layer.transform = CATransform3DConcat(CATransform3DMakeScale(xx, xx, 1),
                                      CATransform3DMakeRotation(yy, 0, 0, 1))

let view = UIView() //your view hierarchy
view.addSublayer(layer)


在程序的后面,我想将此层旋转到特定角度。如何指定转换,以便


A)保留应用于图层的原始比例
B)
应用于图层的原始旋转将被丢弃并重置为
新价值?


let angle = CGFloat.pi/3
layer.transform = ???

最佳答案

您可以重新应用变换,而xx值保持不变

    func rotateLayer(by angle: CGFloat) {
        layer.transform = CATransform3DConcat(CATransform3DMakeScale(xx, xx, 1),
        CATransform3DMakeRotation(angle, 0, 0, 1))
    }


编辑

根据this答案,您可以像这样获得并重复使用统一的比例因子

    func rotateLayer(by angle: CGFloat) {
        let scale = sqrt(pow(layer.transform.m11, 2) + pow(layer.transform.m12, 2))
        print(scale)
        layer.transform = CATransform3DConcat(CATransform3DMakeScale(scale, scale, 1), CATransform3DMakeRotation(angle, 0, 0, 1))
    }

关于ios - 将CALayer的旋转变换更改为值,而不更改图层的比例变换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59456397/

10-14 23:39