Проблема с прорисовкой контуров с помощью Core Graphics - iPhone - PullRequest
0 голосов
/ 10 октября 2009

Я пытаюсь нарисовать аннотацию карты в моем приложении - очень похоже на MKAnnotationView MapKit, но без mapkit.

У меня проблема с упорядочением пути для контура вида, который я не могу выяснить.

Изображение результатов:

http://img504.imageshack.us/img504/5458/screenshot20091010at703.png

Код:

CGFloat minx = CGRectGetMinX(currentBounds);
CGFloat midx = CGRectGetMidX(currentBounds);
CGFloat maxx = CGRectGetMaxX(currentBounds);
CGFloat miny = CGRectGetMinY(currentBounds)+10.0f;
CGFloat midy = CGRectGetMidY(currentBounds)+10.0f;
CGFloat maxy = CGRectGetMaxY(currentBounds)+10.0f;

CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, minx, miny+radius); //before top left arc
CGContextAddArcToPoint(currentContext, minx, miny, midx, miny, radius); //top left

CGPoint points1[] = {
CGPointMake(midx-10.0f, miny),
CGPointMake(midx, 0.0f), //tip of arrow
CGPointMake(midx+10.0f, miny),
};
CGContextAddLines(currentContext,  points1, 3);
CGContextAddArcToPoint(currentContext, maxx, miny, maxx, midy, radius); //top right
CGContextAddArcToPoint(currentContext, maxx, maxy, midx, maxy, radius); //bottom right
CGContextAddArcToPoint(currentContext, minx, maxy, minx, midy, radius); //bottom left
CGContextClosePath(currentContext);

CGContextClosePath(currentContext);
CGContextDrawPath(currentContext, kCGPathFillStroke);
//CGContextDrawPath(currentContext, kCGPathEOFillStroke);

Ответы [ 2 ]

4 голосов
/ 10 октября 2009

Во-первых, в PostScript (и его производных, таких как рисование AppKit и Core Graphics), вы обычно рисуете путь против часовой стрелки, особенно при заполнении. Путь по часовой стрелке, подобный показанному здесь, - это то, что вы нарисуете, если хотите заполнить за пределами .

Во-вторых, я предполагаю, что этот контекст имеет происхождение в верхнем левом углу (положительный у понижается), а не нижнем левом (положительный у повышается).

Выходя из первой дуги, текущая точка находится в мертвой точке внизу указателя. Разве не имеет смысла устанавливать вторую точку команды arct (CGContextAddArcToPoint) в качестве первой базовой точки указателя? Кроме того, чтобы быть более правильным, вам нужно будет только передать две точки на CGContextAddLines.

Вы хотите дважды закрыть путь? Я не думаю, что это повредит, но это излишне.

Я бы начал рисовать в правой базовой точке указателя, затем нанести линии на следующие две точки (кончик и левую базовую точку в указанном порядке), затем нанести все четыре дуги в последовательности (против часовой стрелки), затем closepath (один раз). Это должно быть немного проще и правильнее.

0 голосов
/ 10 октября 2009

Таким образом, CGContextMoveToPoint не работал, независимо от того, какие значения были введены, с или без CGContextPathBegin. Начало пути с помощью линии в углу стрелки указателя позволило мне указать начальную точку. Спасибо Питеру за то, что он помог мне понять это и как упростить пути.

...