查看图片。形状小矩形具有不同的线宽。指向大中心矩的线条较粗。以左上角为例:第一行和第二行比第一行和第二行更薄。 首先,我认为这是一种视错觉,但不是。截图是在模拟器上以100%拍摄的。
用于绘制视图的代码来自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 :(得分: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