2

看图片。形状小矩形有不同的线宽。指向大中心矩形的线更粗。以左上角为例:to 线和左边的比右边的和底部的要细。首先,我虽然这是一种视错觉,但不是。屏幕截图是在模拟器上以 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。

4

2 回答 2

1

这个UIView ClipsToBounds房产的价值是多少?

如果true那可能是您的问题(2pt 线的一半超出范围)。

更新

GetClipBoundingBox你的CGContext回报是什么?

于 2012-07-23T18:56:11.723 回答
1

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

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

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

在我们的例子中,路径的边缘是我们希望填充的矩形。因此,当沿该边缘绘制 1 >pixel 线时,线的一半(1/2 像素)将在 >rectangle 的内侧,而线的另一半(1/2 像素)将在外侧>矩形的。

但是,当然,因为没有办法绘制 1/2 个像素,Core Graphics 使用 anti->aliasing 来绘制两个像素,而只是使用较浅的阴影来显示它仅绘制一个像素的外观。

我认为您无法在 CG 中更改此设置,与 GDI+ 不同,您可以在其中设置笔对齐http://msdn.microsoft.com/en-us/library/z62ath7a.aspx

于 2012-07-23T21:56:10.733 回答