改变 CALayer 的旋转变换为一个值而不改变层的缩放变换
Change a CALayer's rotation transform to a value without changing the layer's scale transform
假设您有一个 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))
}
假设您有一个 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))
}