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

これは、中心ペン配置を使用する CoreGraphics によるものです。たとえば、指定した線の両側にピクセルが描画されます。お気づきのように、座標を線幅の半分にすると修正されます。

この記事には例があり、iOS が回線に適用するアンチエイリアシングとそれを回避する方法についても説明しています。

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

私たちの場合、パスの端は塗りつぶしたい四角形です。そのため、そのエッジに沿って 1 >ピクセルの線を描画すると、線の半分 (1/2 ピクセル) が長方形の内側になり、線の残りの半分 (1/2 ピクセル) が外側になります。 >長方形の。

しかしもちろん、1/2 ピクセルを描画する方法がないため、代わりに Core Graphics はアンチエイリアシングを使用して両方のピクセルを描画します。

ペンの配置を設定できるGDI +とは異なり、CGでこれを変更できるとは思わないhttp://msdn.microsoft.com/en-us/library/z62ath7a.aspx

于 2012-07-23T21:56:10.733 に答える
1

このUIView ClipsToBoundsプロパティの値は?

それが問題である可能性が高い場合true(2pt ラインの半分が範囲外です)。

アップデート

GetClipBoundingBoxあなたのCGContextリターンを呼び出すとは何ですか?

于 2012-07-23T18:56:11.723 に答える