我正在创建一个 iPad 应用程序,并希望使用当前视图大小来更新用户。我曾经通过计算 CGAffineTransform 的比例并将 xScale 乘以(相关视图的)宽度和 yScale 乘以高度来做到这一点。我想继续这样做,但我不再进行 2d 转换,而且我不确定使用什么方程从 CATransform3D 中提取比例信息。
你能帮我吗?
我正在创建一个 iPad 应用程序,并希望使用当前视图大小来更新用户。我曾经通过计算 CGAffineTransform 的比例并将 xScale 乘以(相关视图的)宽度和 yScale 乘以高度来做到这一点。我想继续这样做,但我不再进行 2d 转换,而且我不确定使用什么方程从 CATransform3D 中提取比例信息。
你能帮我吗?
要获取图层的当前比例,您只需在valueForKeyPath:
图层上执行:
CGFloat currentScale = [[layer valueForKeyPath: @"transform.scale"] floatValue];
我不熟悉 API,但CATransform3D
看起来像是用于进行 3D 转换的常规 4x4 转换矩阵。
假设它仅代表比例、旋转和平移的组合,则可以通过分别计算左上 3x3 的行或列的大小来提取比例因子,具体取决于CATransform3D
是行主要还是列主要。
例如,如果它是行优先的,则 x 方向的比例为 ( m11 * m11 ) + ( m12 * m12 ) + ( m13 * m13 ) 的平方根。y 和 z 比例同样是第二行和第三行的大小。
从文档CATransform3DMakeTranslation
看来,这CATransform3D
确实是行主要的。
这是 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)")