0

假设我使用以下方法旋转视图:

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

当我最初执行 CGAffineTransform 时,如何在不跟踪角度变量中放入的内容的情况下获取此视图的当前旋转角度?它与 view.transform.xx/view.transform.xy 值有关吗?

4

1 回答 1

1

不确定这些xxxy所有其他类似成员的确切含义,但我的猜测*是您将无法仅使用这些值来追溯应用的转换(这就像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;

正如您所看到的,这种方法有其局限性,但您始终可以只使用一个实例MyTransform来应用各种转换并将该实例存储在某处(或者,可能是此类转换的集合)。

您可能还想在课堂上存储/公开其他转换,例如缩放翻译MyTransform,但我相信您会知道从这里去哪里。



*如果我错了,请随时纠正我

于 2013-02-10T08:44:14.930 回答