Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.ios 为什么这个核心图形绘制代码会生成可变的线宽?_Xamarin.ios_Core Graphics_Cgcontext - Fatal编程技术网

Xamarin.ios 为什么这个核心图形绘制代码会生成可变的线宽?

Xamarin.ios 为什么这个核心图形绘制代码会生成可变的线宽?,xamarin.ios,core-graphics,cgcontext,Xamarin.ios,Core Graphics,Cgcontext,请看图片。小矩形的形状有不同的线宽。指向大中心矩形的线较粗。以左上角为例:to线和左上角比右下角薄。 首先,我认为这是一种视错觉,但不是。截图是在模拟器上100%拍摄的 用于绘制以下视图的代码来自UIView子类的DrawRect(): public override void Draw (RectangleF rect) { rect = this.Bounds; CGContext oCtx = UIGraphics.GetC

请看图片。小矩形的形状有不同的线宽。指向大中心矩形的线较粗。以左上角为例: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
        }

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

UIView
clipstobunds
属性的值是多少

如果
true
则可能是您的问题(2pt行的一半在边界之外)

更新


CGContext
上调用
GetClipBoundingBox
会返回什么?

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

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

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

但当然,由于无法绘制1/2像素,因此核心图形使用反->混叠来绘制两个像素,但只使用较浅的阴影来显示它>仅绘制了一个像素


我不认为你可以在CG中改变它,不像GDI+那样,你可以在那里设置笔对齐

如果我使用该属性,它不会改变任何东西。但是,如果我在rect.X+1而不是rect.X处绘制rect,则线条是正确的。但是为什么rect.X(=0)会超出剪裁区域!?如果我把线宽设为1而不是2,我也会得到同样的效果。只是一个简单的猜测;-)我没有用CG尝试过,细节随绘图工具包的不同而变化。通常在0处绘制一条2pt宽的线,通常会从-1,1(2 pt宽)创建一个矩形,-1,0处的部分可以剪裁,并显示您的屏幕截图。将直线移动到1(中心)将使图形从0,2(2磅宽)开始并在剪裁内部绘制。一条1pt宽的线将是-0.5,0,5,这也会将它的一部分减少一半(剪裁为0)。这个问题会发生在真正的iPad上吗?我想不会。很有可能模拟器不执行抗锯齿渲染-这就是为什么你会看到这种效果。是的,这似乎是造成这种情况的原因。