Как нарисовать вершины на CGContext CGMutablePathRef?

Я рисую набор соединенных линий, когда пользователь нажимает кнопку мыши, чтобы указать вершины. Я создаю CGMutablePathRef

- (void)addPointToCGMPR: (CGPoint)p
      forNewPolygon: (BOOL)newPoly
{
    if (newPoly)
    {
        CGPathMoveToPoint(cgmpr, NULL, p.x, p.y);
    }
    else
    {
        CGPathAddLineToPoint(cgmpr, NULL, p.x, p.y);
    }
    [self setNeedsDisplay];
}

drawRect: затем вызывается после ввода каждой точки, и контекст CGMutablePathRef добавляется в CGContext для отображения

- (void)drawRect:(CGRect)rect
{    
    // Set up a context to display
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddPath(context, cgmpr);

    CGContextSetLineWidth(context, 1);
    CGContextStrokePath(context);  

    // If NOT empty then Close the context so that box comparison can occur later
    if (!CGContextIsPathEmpty(context))
    {
        CGContextClosePath(context);
    }
}

Как и следовало ожидать, на экране появляются линии. Моя проблема в том, что после того, как пользователь выбирает первую точку, на экране ничего не отображается, и пользователь не знает, получила ли система свой первый выбор, пока не будет введена вторая точка. Я хочу, чтобы система отображала первую точку еще до того, как будет введена следующая точка. Я также хотел бы, чтобы система визуализировала каждую из выбранных вершин визуально отличным образом - сейчас я не получаю визуализацию вершин, только линии. Есть ли способ попросить CGContext отображать точки? Есть ли способ указать стиль, в котором отображаются эти точки? Спасибо.


person StoneBreaker    schedule 25.04.2012    source источник


Ответы (2)


Вы можете рисовать все, что хотите изобразить точки: маленький квадрат, маленький кружок, изображение канцелярской кнопки и т. Д. Вы уже знаете, как рисовать в контексте; просто переберите свои точки и нарисуйте их так, как вы хотите, чтобы они отображались. Лично я предпочитаю использовать CGContextFillEllipseInRect для подобных вещей. Для каждой точки создайте прямоугольник, окружающий точку, и нарисуйте его:

CGFloat pointSize = 4;
CGRect pointRect = CGRectMake(point.x - pointSize / 2, point.y - pointSize / 2, pointSize, pointSize);
CGContextFillEllipseInRect(context, pointRect);
person warrenm    schedule 25.04.2012

Нет. Вам нужно будет отрендерить их самостоятельно, добавив еще один CGPath, чтобы описать все, что вы хотите представлять вершиной. Поскольку вы, вероятно, будете часто рисовать это, вы можете захотеть отрендерить его в CGLayer, чтобы вы могли легко скопировать его там, где вам это нужно. Вы также можете нарисовать свои вершины на CALayers, чтобы их можно было легко перемещать. Но спроектировать и управлять этой частью чертежа решать вам.

person Rob Napier    schedule 25.04.2012
comment
Спасибо, что указали мне эти направления, Роб. Мне нужно будет переставить точки, поэтому наличие этих имен поможет мне добраться до документации, которая научит меня разрабатывать эту часть программы и управлять ею. +1 - person StoneBreaker; 26.04.2012