ios - 改变 CALayer 的旋转变换为一个值而不改变层的缩放变换

标签 ios swift transform core-animation calayer

假设您有一个 CALayer 子类作为 View 层次结构的一部分,它是使用缩放和旋转变换创建的,其中角度和缩放仅在运行时定义,即:

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) 应用于图层的原始旋转被丢弃并重置为 新值(value)?
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/

相关文章:

ios - 如何在 iOS 中使用委派来滑出菜单?

android - 有没有一种方法可以在 iOS 设备上显示 Android PhotoSphere?

swift - 如何观察用户在 UIAlertController 中编辑文本字段?

java - 使用 XSLT 将 XML 转换为 HTML

objective-c - iOS 将 UIView 平行于 X-Z 平面对齐

ios - 将列表排序为 TableView 索引的部分

iphone - 为什么要在IOS中创建和使用Bundle?

arrays - swift : TableView Cell data change with the Button Actions

swift - 调用真正的后退按钮图标 - Swift

C# - 将 ListView 列中的文本转换为密码字符