开发者

Using ShowTextAtPoint the displayed text is flipped

I'm using the ShowTextAtPoint method of CGContext to display a Text in a view, but it is displayed in flip mode, anyone kn开发者_StackOverflowows how to solve this problem ? Here is the code I use :

ctx.SelectFont("Arial", 16f, CGTextEncoding.MacRoman); 
ctx.SetRGBFillColor(0f, 0f, 1f, 1f);
ctx.SetTextDrawingMode(CGTextDrawingMode.Fill);
ctx.ShowTextAtPoint(centerX, centerY, text);


You can manipulate the current transformation matrix on the graphics context to flip it using ScaleCTM and TranslateCTM.


According to the Quartz 2D Programming Guide - Text:

In iOS, you must apply a transform to the current graphics context in order for the text to be oriented as shown in Figure 16-1. This transform inverts the y-axis and translates the origin point to the bottom of the screen. Listing 16-2 shows you how to apply such transformations in the drawRect: method of an iOS view. This method then calls the same MyDrawText method from Listing 16-1 to achieve the same results.

The way this looks in MonoTouch:

public void DrawText(string text, float x, float y)
{
    // the incomming coordinates are origin top left
    y = Bounds.Height-y;

    // push context
    CGContext c = UIGraphics.GetCurrentContext();
    c.SaveState();

    // This technique requires inversion of the screen coordinates
    // for ShowTextAtPoint
    c.TranslateCTM(0, Bounds.Height);
    c.ScaleCTM(1,-1);

    // for debug purposes, draw crosshairs at the proper location
    DrawMarker(x,y);

    // Set the font drawing parameters
    c.SelectFont("Helvetica-Bold", 12.0f, CGTextEncoding.MacRoman);
    c.SetTextDrawingMode(CGTextDrawingMode.Fill);
    c.SetFillColor(1,1,1,1);

    // Draw the text
    c.ShowTextAtPoint( x, y, text );

    // Restore context
    c.RestoreState();
}

A small utility function to draw crosshairs at the desired point:

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();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜