1

我正在尝试通过在特定位置使用 CGAffineTransform.MakeRotation 方法来绘制一些旋转的文本。我也使用 TranslateCTM,但一定有问题,因为旋转的文本没有对齐,并且在它们应该出现的正确 x、y 位置,这是我正在使用的简单代码,有人知道问题出在哪里吗?:

        public override void Draw (RectangleF rect)
    {
        DrawTextRotated("Hello1",10,100,30);
        DrawTextRotated("Hello2",50,100,60);
        SetNeedsDisplay();          
    }       

    static public float DegreesToRadians(float x) 
    {       
        return (float) (Math.PI * x / 180.0);
    }

    public void DrawTextRotated(string text,int x, int y, int rotDegree)
    {
        CGContext c = UIGraphics.GetCurrentContext();
        c.SaveState();

        c.TextMatrix = CGAffineTransform.MakeRotation((float)DegreesToRadians((float)(-rotDegree)));                        
        c.ConcatCTM(c.TextMatrix); 

        float xxx = ((float)Math.Sin(DegreesToRadians((float)rotDegree))*y);
        float yyy = ((float)Math.Sin(DegreesToRadians((float)rotDegree))*x);

        // Move the context back into the view 
        c.TranslateCTM(-xxx,yyy);

        c.SetTextDrawingMode(CGTextDrawingMode.Fill);
        c.SetShouldSmoothFonts(true);

        MonoTouch.Foundation.NSString str = new MonoTouch.Foundation.NSString(text);            
        SizeF strSize = new SizeF();
        strSize = str.StringSize(UIFont.SystemFontOfSize(12));          

        RectangleF tmpR = new RectangleF(x,y,strSize.Width,strSize.Height);

        str.DrawString(tmpR,UIFont.SystemFontOfSize(12),UILineBreakMode.WordWrap,UITextAlignment.Right);
        c.RestoreState();
    }

谢谢 !

4

1 回答 1

1

这里有一些代码将绘制围绕文本左上角正确旋转的文本。目前,我忽略了您对文本对齐的使用。

首先,一个实用方法在我们期望文本出现的地方绘制一个标记:

public void DrawMarker(float x, float y)
{
    float SZ = 20;

    CGContext c = UIGraphics.GetCurrentContext();

    c.BeginPath();
    c.AddLines( new [] { new PointF(x-SZ,y), new PointF(x+SZ,y) });
    c.AddLines( new [] { new PointF(x,y-SZ), new PointF(x,y+SZ) });
    c.StrokePath();
}

以及绘制文本的代码(注意我已经用浮点数替换了所有 int 旋转,你可能想要否定你的旋转):

public void DrawTextRotated(string text, float x, float y, float rotDegree)
{
    CGContext c = UIGraphics.GetCurrentContext();
    c.SaveState();

    DrawMarker(x,y);

    // Proper rotation about a point
    var m = CGAffineTransform.MakeTranslation(-x,-y);
    m.Multiply( CGAffineTransform.MakeRotation(DegreesToRadians(rotDegree)));
    m.Multiply( CGAffineTransform.MakeTranslation(x,y));
    c.ConcatCTM( m );

    // Draws text UNDER the point
    // "This point represents the top-left corner of the string’s bounding box."
    //http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html
    NSString ns = new NSString(text);
    UIFont font = UIFont.SystemFontOfSize(12);
    SizeF sz = ns.StringSize(font);
    RectangleF rect = new RectangleF(x,y,sz.Width,sz.Height);
    ns.DrawString( rect, font);

    c.RestoreState();
}

绕点旋转需要将点平移到原点,然后旋转,然后再旋转回原点。CGContext.TextMatrix没有影响,NSString.DrawString所以你可以使用ConcatCTM.

对齐和换行模式没有任何影响。由于您使用NSString.StringSize的是 ,边界矩形适合整个文本,紧贴左右边缘。如果您使边界矩形的宽度变宽并使用 UITextAlignment.Right,您将获得正确的右对齐,但文本仍将围绕整个边界矩形的左上角旋转。我猜这不是你所期望的。

如果您希望文本围绕右上角旋转,请告诉我,我会相应地调整代码。

这是我在测试中使用的代码:

DrawTextRotated("Hello 0",100, 50, 0);
DrawTextRotated("Hello 30",100,100,30);
DrawTextRotated("Hello 60",100,150,60);
DrawTextRotated("Hello 90",100,200,90);

干杯。

于 2012-09-20T17:57:21.903 回答