1

タッチ スクリーン ジェスチャに応答して、さまざまなスケールと回転 CGAffineTransforms が適用された UIView があります。

スケール操作が完了したら、ビューの境界を新しいサイズに調整し、変換の他のすべてのコンポーネントを同じに保ちながら、ビュー自体をスケール 1.0 で再描画します。

ビューの境界を調整するために、私は以下を使用しています:

self.myView.bounds = CGRectApplyAffineTransform(self.myView.bounds, self.myView.transform);

スケール変換を「元に戻す」ために、私はこれを試しています:

self.myView.transform = CGAffineTransformConcat(self.myView.transform, CGAffineTransformMakeScale(1, 1));

[myView setNeedsDisplay]次に、ビューを再描画するために呼び出します。

ただし、これでは目的の結果が得られず、回転変換が適用されると、上記のコードにより、横方向の平行移動変換のように見えるものも適用されるようです。

スケール変換だけを「元に戻し」、他のすべての変換をそのままにして、ビューを 1:1 で再描画する最もクリーンな方法は何ですか?

4

2 に答える 2

0

スケール値を変数に保存してから、 CGAffineTransformMakeScale(1, 1) を次のように変更してみてください

CGAffineTransformMakeScale(1/totalScaleWidth, 1/totalScaleHeight)
于 2013-07-18T05:09:47.830 に答える
0

私は似たようなものを扱っています。私がしているのは、個別のコンポーネントを別の構造体 (スケール、回転、移動) に格納することです。そうすれば、変換を簡単に再作成できます (ただし、操作の順序には注意してください)。

ただし、境界を変更せず、代わりにスケール操作を変換に適用することをお勧めします。これにより、潜在的な不要なレイアウトが回避されます。これらはすべて、transform プロパティだけで処理できます。スケール 1 の適用はノーオペレーションであるため、現在行っている方法は何も変更しません。ビューを 2 倍に拡大した場合、元に戻すには 0.5 倍に拡大する必要があります。または、上で述べたように、すべてのコンポーネントを格納し、恒等行列から再作成します (行列の計算は高速です。心配する必要はありません)。

于 2013-07-17T14:22:15.383 に答える