从CATransform3D中获取“比例”

15

我正在创建一款iPad应用程序,希望通过更新用户视图的当前大小来提高用户体验。以前,我是通过计算CGAffineTransform的比例,并将xScale乘以相关视图的宽度,yScale乘以高度来实现这一点。我想继续使用这种方法,但我不再使用2D变换,也不确定从CATransform3D中提取比例信息要使用哪个方程。

你能帮忙吗?

3个回答

22

要获取图层的当前比例,只需对该图层执行valueForKeyPath:操作:

CGFloat currentScale = [[layer valueForKeyPath: @"transform.scale"] floatValue];

您可以在 苹果核心动画编程指南 中找到其他键。


有趣的是,[[self presentationLayer] valueForKey:@"transform.scale"] 总是返回 nil。 - pronebird
2
Andy,那是因为你调用了 valueForKey 而不是 valueForKeyPath - Mark

8

我不熟悉API,但CATransform3D看起来像是用于进行3D变换的常规4x4变换矩阵。

假设它代表的仅仅是缩放、旋转和平移的组合,那么缩放因子可以通过计算左上角3x3的行或列的大小来提取,具体取决于CATransform3D是行主还是列主。

例如,如果它是行主的,那么x方向上的缩放就是( m11 * m11 ) + ( m12 * m12 ) + ( m13 * m13 )的平方根。y和z的缩放同样是第二行和第三行的大小。

CATransform3DMakeTranslation的文档中可以看出,CATransform3D确实是行主的。


0

这是针对Swift 4+的更新答案

guard let currentScaleX = view.layer.value(forKeyPath: "transform.scale.x") as? CGFloat {
    return 
}
print ("the scale x is \(currentScaleX)")
guard let currentScaleY = view.layer.value(forKeyPath: "transform.scale.y") as? CGFloat {
    return 
}
print ("the scale y is \(currentScaleY)")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接