iPadアプリを作成していて、ビューの現在のサイズでユーザーを更新したいと思います。以前は、CGAffineTransformのスケールを計算し、xScaleに(関連するビューの)幅を掛け、yScaleに高さを掛けてこれを行っていました。これを続けたいのですが、2D変換を行っていないため、CATransform3Dからスケール情報を抽出するためにどの式を使用すればよいかわかりません。
手伝ってくれますか?
iPadアプリを作成していて、ビューの現在のサイズでユーザーを更新したいと思います。以前は、CGAffineTransformのスケールを計算し、xScaleに(関連するビューの)幅を掛け、yScaleに高さを掛けてこれを行っていました。これを続けたいのですが、2D変換を行っていないため、CATransform3Dからスケール情報を抽出するためにどの式を使用すればよいかわかりません。
手伝ってくれますか?
レイヤーの現在のスケールを取得するには、レイヤーに対してaを実行するだけですvalueForKeyPath:
。
CGFloat currentScale = [[layer valueForKeyPath: @"transform.scale"] floatValue];
私はAPIに精通していませんが、CATransform3D
3D変換を行うための通常の4x4変換行列のように見えます。
CATransform3D
スケール、回転、および平行移動の組み合わせにすぎないと仮定すると、スケール係数は、それぞれ行または列のメジャーであるかどうかに応じて、左上の3x3の行または列の大きさを計算することによって抽出できます。
たとえば、行メジャーの場合、x方向のスケールは(m11 * m11)+(m12 * m12)+(m13 * m13)の平方根になります。yとzのスケールは、同様に2番目と3番目の行の大きさになります。
そのためのドキュメントから、CATransform3DMakeTranslation
それCATransform3D
は確かに行メジャーであるように見えます。
これがSwift4+の最新の回答です
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)")