0

次の方法を使用してビューを回転するとします。

            CGAffineTransform t = CGAffineTransform.MakeIdentity();
            t.Rotate (angle);
            CGAffineTransform transforms = t;
            view.Transform = transforms;

最初に CGAffineTransform を実行したときに angle 変数に入力したものを追跡せずに、このビューの現在の回転角度を取得するにはどうすればよいですか? view.transform.xx/view.transform.xy の値に関連していますか?

4

1 に答える 1

1

これらxxおよびxy他のすべての同様のメンバーが正確に何を意味するのかはわかりませんが、私の推測*1+2+3+4では、これらの値のみを使用して適用された変換をトレースバックすることはできません (それは、最初1にで終わった10-私は思う*)。

その場合、私の提案は から派生しCGAffineTransformて目的の値を格納することですが、それは構造であるため、それを行うことはできません。私の意見では、次のようにラッパー クラスを作成することをお勧めします。

class MyTransform
{
    //wrapped transform structure
    private CGAffineTransform transform;

    //stored info about rotation
    public float Rotation { get; private set; }

    public MyTransform()
    {
        transform = CGAffineTransform.MakeIdentity();
        Rotation = 0;
    }

    public void Rotate(float angle)
    {
        //rotate the actual transform
        transform.Rotate(angle);
        //store the info about rotation
        Rotation += angle;
    }

    //lets You expose the wrapped transform more conveniently
    public static implicit operator CGAffineTransform(MyTransform mt)
    {
        return mt.transform;
    }
}

定義された演算子を使用すると、このクラスを次のように使用できます。

//do Your stuff
MyTransform t = new MyTransform();
t.Rotate(angle);
view.Transform = t;
//get the rotation
float r = t.Rotation;

//unfortunately You won't be able to do this:
float r2 = view.Transform.Rotation;

ご覧のとおり、このアプローチには制限がありますが、常に の 1 つのインスタンスのみを使用MyTransformしてあらゆる種類の変換を適用し、そのインスタンスをどこかに (または、そのような変換のコレクションとして) 格納できます。

クラスでスケール変換などの他の変換を保存/公開することもできMyTransformますが、ここからどこに行くべきかがわかると思います。



*間違っていたら遠慮なく訂正してください

于 2013-02-10T08:44:14.930 に答える