15

我正在创建一个 iPad 应用程序,并希望使用当前视图大小来更新用户。我曾经通过计算 CGAffineTransform 的比例并将 xScale 乘以(相关视图的)宽度和 yScale 乘以高度来做到这一点。我想继续这样做,但我不再进行 2d 转换,而且我不确定使用什么方程从 CATransform3D 中提取比例信息。

你能帮我吗?

4

3 回答 3

22

要获取图层的当前比例,您只需在valueForKeyPath:图层上执行:

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

其他键可以在Apples Core Animation Programming Guide中找到

于 2011-08-22T04:15:22.470 回答
8

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

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

例如,如果它是行优先的,则 x 方向的比例为 ( m11 * m11 ) + ( m12 * m12 ) + ( m13 * m13 ) 的平方根。y 和 z 比例同样是第二行和第三行的大小。

从文档CATransform3DMakeTranslation看来,这CATransform3D确实是行主要的。

于 2010-12-14T22:56:35.000 回答
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)")
于 2019-11-04T16:07:46.993 回答