我正在创建一款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)")
valueForKey
而不是valueForKeyPath
。 - Mark