2012-07-23 52 views
2

查看图片。小矩形的形式有不同的线宽。指向大中心矩形的线条更粗。以左上角为例:线和左侧比右侧和底部薄。首先我虽然是一种幻觉,但没有。屏幕截图是在模拟器上以100%拍摄的。为什么这个Core Graphics绘图代码会产生变化的线宽?

enter image description here

用于绘制如下图的代码是从的UIView的一个子类的drawRect():

public override void Draw (RectangleF rect) 
     { 
      rect = this.Bounds; 
      CGContext oCtx = UIGraphics.GetCurrentContext(); 
      oCtx.SetFillColor(UIColor.Clear.CGColor); 
      oCtx.ClearRect(rect); 

      oCtx.SetLineWidth(2f); 

      oCtx.SetFillColor(this.BackgroundColor.CGColor); 
      oCtx.SetStrokeColor(this.BackgroundColor.CGColor); 
      oCtx.SetAlpha(this.Alpha); 

      oCtx.AddRect(new RectangleF(rect.X + HANDLE_WIDTH * 0.5f, rect.Y + HANDLE_HEIGHT * 0.5f, rect.Width - HANDLE_WIDTH, rect.Height - HANDLE_HEIGHT)); 

      oCtx.FillPath(); 

      oCtx.SetAlpha(1f); 
      oCtx.AddRect(new RectangleF(rect.X, rect.Y, HANDLE_WIDTH, HANDLE_HEIGHT)); 
      oCtx.AddRect(new RectangleF(rect.Right - HANDLE_WIDTH, rect.Y, HANDLE_WIDTH, HANDLE_HEIGHT)); 
      oCtx.AddRect(new RectangleF(rect.Right - HANDLE_WIDTH, rect.Bottom - HANDLE_HEIGHT, HANDLE_WIDTH, HANDLE_HEIGHT)); 
      oCtx.AddRect(new RectangleF(rect.X, rect.Bottom - HANDLE_HEIGHT, HANDLE_WIDTH, HANDLE_HEIGHT)); 

      oCtx.StrokePath(); 

#if DEBUG 
      oCtx.SetAlpha(0.2f); 
      oCtx.SetFillColor(UIColor.DarkGray.CGColor); 
      oCtx.AddRect(this.GetMovableArea(rect)); 
      oCtx.FillPath(); 
#endif 
     } 

有人可以请解释为什么笔划宽度有什么不同?我也尝试使用StrokeRect()来代替 - 相同的结果。我甚至删除了所有的绘图代码,除了左上角的矩形没有改变。常量HANDLE_HEIGHT和HANDLE_WIDTH都设置为20f。

+0

此问题不会发生在一个真正的iPad?我想不会。模拟器很可能不会执行消除锯齿渲染 - 这就是您看到这种效果的原因。 – Ani 2012-07-23 21:57:13

回答

1

这是由于CoreGraphics使用中心笔对齐,例如,它将绘制您指定的线的任意一侧的像素。正如您已经注意到将坐标放入一半的线宽将修复它。

这篇文章有一个例子,并且还谈到了iOS适用于该行的反锯齿以及如何避免它。

http://www.raywenderlich.com/2033/core-graphics-101-lines-rectangles-and-gradients

在我们的情况下,路径的边缘是我们要填充矩形。因此,当沿着该边绘制1>像素线时,线的一半(1/2像素)将在>矩形的内侧,并且线的另一半(1/2像素)将在外侧>矩形。

但是,当然,由于没有办法绘制1/2像素,相反,Core Graphics使用反锯齿来绘制两个像素,但只是一个较浅的阴影,以便表现出它只有一个像素像素绘制。

我不认为你可以在CG不像GDI改变这种+在这里你可以设置一个笔对准http://msdn.microsoft.com/en-us/library/z62ath7a.aspx

+0

是的,这似乎是在这种情况下的原因。 – Krumelur 2012-07-24 07:03:43

1

这是什么值UIViewClipsToBounds property?

如果true那么这可能是你的问题(2pt线的一半超出界限)。

UPDATE

什么呼吁您CGContext回报GetClipBoundingBox

+0

如果我使用该属性,则不会改变任何内容。但是,如果我在rect.X + 1而不是rect.X上绘制矩形,则线条是正确的。但为什么rect.X(== 0)不在裁剪区域!?如果我使线宽1而不是2 btw,我也会得到相同的效果。 – Krumelur 2012-07-23 20:36:25

+0

只是一个快速猜测;-)我还没有用CG来试过,细节因绘制工具包而异。 **通常**在0处绘制一条2pt宽的线通常会从-1,1(2pt宽)创建一个矩形,-1,0 *的部分可能会被剪切并显示为您的屏幕截图。将直线移动到1(中心)使得图形从0.2(2pt宽)到裁剪内部。 1pt宽的线将是-0。5,0,5也会削减一半的部分(截至0)。 – poupou 2012-07-23 20:49:45

相关问题