2011-04-19 67 views
4

在UIView子类中,我重写Draw子来绘制一些自定义文本,但文本allways被绘制为翻转文本。MonoTouch:自定义绘图文本allways绘制翻转文本

这是代码我使用:

class TextViewProblem : UIView 
{ 
public override void Draw (RectangleF rect) 
    { 
     base.Draw (rect); 

     CGContext g = UIGraphics.GetCurrentContext(); 

     UIColor.White.SetFill(); 

     g.SelectFont("Arial",16f,CGTextEncoding.MacRoman); 

     UIColor.White.SetFill(); 
     g.SetTextDrawingMode(CGTextDrawingMode.Fill); 
     g.ShowTextAtPoint(1,25,"Yiannis 123"); 



    } 

} 

这是这段代码的输出: enter image description here

为什么文本取用翻转?

我运行: 的MonoDevelop 2.4.2 iPhone模拟器4.2 的MonoTouch 3.2.6

你可以下载一个项目,从这个链接重现此问题:www.grbytes.com/downloads/TextProblem.zip

+0

我发现在Draw重写中我可以使用UIView的DrawString方法。它以这种方式绘制文本。 – 2011-10-25 02:20:27

回答

10

图像翻转,因为CoreGraphics的坐标系与UIKit的坐标系不同,您需要应用一个包含翻转渲染(x = 1,y = -1)的转换,然后转换高度(x = 0,y = height )。

您可以通过将转换应用于图形上下文来完成此操作。

+0

我试过这个没成功: gctx.ScaleCTM(1,-1); gctx.TranslateCTM(0,this.Frame.Width); – Scarlaxx 2011-04-19 13:07:45

+0

我也试过g.ScaleCTM(1,-1); g.TranslateCTM(0,this.Frame.Height);但它不起作用。我得到一个黑色的UIView – 2011-04-19 13:33:23

+2

首先翻译,然后缩放 – alecnash 2012-05-23 15:43:37

0

这里有一个工作代码:

 CGContext g = UIGraphics.GetCurrentContext(); 
     UIColor.White.SetFill(); 
     g.ScaleCTM(1f,-1f); 
     g.SelectFont("Arial",16f,CGTextEncoding.MacRoman); 
     UIColor.White.SetFill(); 
     g.SetTextDrawingMode(CGTextDrawingMode.Fill); 
     g.ShowTextAtPoint(1,-50,"Yiannis 123"); 

一旦您设置了规模为-1 Y,现在你的坐标系是上下颠倒。所以(0,0)是左上角,但是左下角现在是(0,-480),而不是(0,480)。所以请注意ShowTextAtPoint中的-50。

-1

此代码工作正常:

public override void Draw (System.Drawing.RectangleF rect) 
    { 
     base.Draw (rect); 

     CGContext g = UIGraphics.GetCurrentContext(); 

     g.TranslateCTM(0,Bounds.Height); 
     g.ScaleCTM(1f,-1f); 
     g.DrawImage .......... 
    } 

尖端是:第一TranslateCTM然后ScaleCTM。

+0

我不明白downvote。我发布的代码作品。 – 2014-05-23 02:21:34

0
using (CGContext g = UIGraphics.GetCurrentContext()) { 
      g.ScaleCTM (1f, -1f); 
      g.TranslateCTM (0, -Bounds.Height); 
       ....