【问题标题】:Change a CALayer's rotation transform to a value without changing the layer's scale transform将 CALayer 的旋转变换更改为一个值,而不更改图层的缩放变换
【发布时间】:2019-12-23 13:44:18
【问题描述】:

假设您有一个 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 = ???

【问题讨论】:

    标签: ios swift transform core-animation calayer


    【解决方案1】:

    您可以在 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))
        }
    

    【讨论】:

    • 应用后的xx值如何获取?将值保留在内存中是唯一的选择吗?
    • @DannyBravo 抱歉,我不知道如何从变换中获取比例值,也许我们应该根据变换的矩阵值进行一些计算(m11m22 保持比例值,但考虑到旋转的变换形式)
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多