Поделиться через


CGPathDrawingMode Перечисление

Определение

Режим рисования.

public enum CGPathDrawingMode
type CGPathDrawingMode = 
Наследование
CGPathDrawingMode

Поля

EOFill 1

Заполняет путь с помощью правила четных нечетных.

EOFillStroke 4

Заполняет и обводка пути с помощью правила четных нечетов.

Fill 0

Заполняет путь с помощью правила обмотки, отличного от нуля.

FillStroke 3

Заполняет и обводка пути с помощью правила обмотки, отличного от нуля.

Stroke 2

Обводка пути.

Комментарии

Это перечисление позволяет разработчику приложения выбрать между отображением заливки, росчерка или обоих путей. Кроме того, это позволяет разработчику выбрать, следует ли использовать режим заполнения с режимом заполнения "ненулевым правилом обмотки" core graphics или режимом заполнения "правило четных нечетных".

Как "правило обмотки ненулевых", так и "правило четных нечетных" решают, следует ли заполнять пиксель, учитывая линию, нарисованную от точки к внешней стороне пути.

Режим "ненулевое правило обмотки" не заполняет пиксель, если путь пересекает эту линию по часовой стрелке и против часовой стрелки равное количество раз. Если число пересечений по часовой стрелке и против часовой стрелки не равно нулю, точка учитывается внутри пути и заполняется. Как показано на следующем рисунке, это делает направление пути важным фактором.

Правило "нечетное" заполняет пиксель, если число пересекаемых путей является нечетным. В нем не учитывается направление пути.

В следующем примере показана более сложная ситуация. Верхний путь рисуется с помощью правила четных нечетных значений (EOFillStroke), а нижний — с помощью ненулевых правил обмотки (FillStroke). В обоих случаях путь обводится красным цветом и зеленым цветом.

 public override void Draw (RectangleF rect)
{
	base.Draw (rect);

	using (var ctxt = UIGraphics.GetCurrentContext ()) {
		ctxt.ScaleCTM (1, -1);
		ctxt.TranslateCTM (0, -Bounds.Height);
   	DrawPathWithWindingMode (ctxt, Bounds.Height / 2, CGPathDrawingMode.EOFillStroke);
	  DrawPathWithWindingMode (ctxt, 0, CGPathDrawingMode.FillStroke);
		}
}

void DrawPathWithWindingMode (CGContext ctxt, float yOffset, CGPathDrawingMode mode)
{
	var points = new PointF[] {
		new PointF (50, 50),
		new PointF (200, 50),
		new PointF (200, 100),
		new PointF (50, 100),
		new PointF (50, 50),
		new PointF (150, 50),
		new PointF (150, 150),
		new PointF (100, 150),
		new PointF (100, 25)
	};
	points = points.Select (pt => new PointF(pt.X, pt.Y += yOffset)).ToArray();
	ctxt.SetStrokeColor (UIColor.Red.CGColor);
	ctxt.SetFillColor (UIColor.Green.CGColor);
	ctxt.MoveTo (points [0].X, points [0].Y);
	for (var i = 1; i < points.Length; i++) {
		ctxt.AddLineToPoint (points [i].X, points [i].Y);
	}
	ctxt.DrawPath (mode);
}         

Применяется к