为什么这个Core Graphics绘图代码会产生不同的线宽?

时间:2012-07-23 18:25:16

标签: xamarin.ios core-graphics cgcontext

查看图片。形状小矩形具有不同的线宽。指向大中心矩的线条较粗。以左上角为例:第一行和第二行比第一行和第二行更薄。 首先,我认为这是一种视错觉,但不是。截图是在模拟器上以100%拍摄的。

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。

2 个答案:

答案 0 :(得分:1)

UIView ClipsToBounds属性的价值是多少?

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

<强>更新

GetClipBoundingBox上调用CGContext会有什么影响?

答案 1 :(得分:1)

这是由于CoreGraphics使用中心笔对齐,例如它将在您指定的行的任一侧绘制像素。正如您所注意到的那样,将坐标调整到一半,线宽会修复它。

本文有一个示例,并且还讨论了iOS应用于该行的抗锯齿以及如何避免它。

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

  

在我们的例子中,路径的边缘是我们希望填充的矩形。因此,当沿着该边缘绘制1>像素线时,该行的一半(1/2像素)将位于&gt;矩形的内侧,并且该行的另一半(1/2像素)将打开&gt;矩形的外部。

     

但是,当然,因为没有办法绘制1/2像素,而是Core Graphics使用反&>别名来绘制两个像素,但只是更浅的阴影给出它&gt;仅仅是单个像素绘制。

我不认为您可以在CG中更改此功能,而不像GDI +那样您可以设置笔对齐http://msdn.microsoft.com/en-us/library/z62ath7a.aspx