2011-11-10 20 views
3

私はオブジェクトのトランスフォームとフレームを保持します。アプリケーションがリロードされたら、フレームと変換を新しいビューに復元するだけで済みます。単純に枠を設定して保存された値に変換することはできますが、できないと考えるでしょう。そうすると、望ましくない結果が生じます。反転したときに保存されたトランスフォームを復元する方法

http://iphonedevelopment.blogspot.com/2008/10/demystifying-cgaffinetransform.html

言う:「あなたは成功変換、順序事項を適用すると回転して、翻訳、あなたが注意しないとしている場合、これはあなたをかむことができ、その後翻訳した後、回転あなたに異なる結果が得られます。。。」

私は、私はそれが&がを回転させをひっくり返された変換を保存するときに問題を変換しています。保存値は復元されたビューに適用される値と同じです。

実績:

やって:

myNewView.frame = savedFrame

myNewView.transform = savedTransform

私の見解は、(場違い)右にシフトダウンとなります。

適切な操作順で変換を復元するのに役立つ人はいますか?

繰り返しますが、私は私の保存したデータを変換ロードが完全であることを確認しているので、私は業務上の問題のそのため、次に何をすべきかを把握するのに十分なだけのスマートではないイムを知っている:P

答えて

4

を元に戻すにはあなたは逆変換が必要です。参照したページの「ステップバック」の見出しを参照してください。試してみてください:

myNewView.transform = CGAffineTransformInvert(savedTransform); 

任意の行列は常に可逆ではありませんが、通常はアフィン変換と安全です。 Hereは注意が必要な特別なケースです。

一般に、行列反転は丸め誤差につながる可能性があります。繰り返し行う必要がある場合は、別の方法を使用する必要があります。

EDIT:

は、質問を再読み込み持って、私は、変換の原点が変更された可能性があると思われます。回転が含まれていると、別の原点を中心に回転すると予期せぬ変換として表示されます。 docsから、原点はビューの中心かレイヤーのアンカーポイントになります。変換を保存するときにこれらのプロパティをチェックし、復元時にそれらが異なるかどうかを確認することをお勧めします。

+0

申し訳ありませんが、私は間違った質問に良い答えを与えました!もう一度見てみましょう。 – Zaq

+2

それはそれでした!したがって、位置を復元して変換しようとする人は、次の順序でリストアする必要があります。 myNewView.frame = mySavedFrame; myNewView.center = mySavedCenter; myNewView.transform = mySavedTransform; – spentak

関連する問題