Перерисовка пути с использованием CGContextStrokePath после начальной загрузки - PullRequest
1 голос
/ 20 мая 2011

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

Однако, когда пользователь перетаскивает маршрутную точку вокруг вида, я бы хотел, чтобы он заново нарисовал пути, и это моя проблема. Я не знаю, как заставить его нарисовать что-нибудь после первого раза. Вот мой код:

- (void)drawRect:(CGRect)rect { ////// works perfectly

    context = UIGraphicsGetCurrentContext();

    CGContextSetRGBStrokeColor(context, 1, 0, 1, .7);
    CGContextSetLineWidth(context, 20.0);
    WaypointViewController *w = [arrayOfWaypoints objectAtIndex:0];
    CGPoint startPoint = w.view.center;

    CGContextMoveToPoint(context, startPoint.x, startPoint.y);

    for (int i = 1; i<[arrayOfWaypoints count]; i++) {
        WaypointViewController *w2 = [arrayOfWaypoints objectAtIndex:i];
        CGPoint nextPoint = w2.view.center;
        CGContextAddLineToPoint(context,nextPoint.x, nextPoint.y);
    }
    CGContextStrokePath(context);
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (moving) {
        UITouch *touch = [touches anyObject];
        currentWaypoint.view.center = [touch locationInView:self];
        [delegate setUserInteraction:NO];
        [self drawInContext:context];
        [NSThread detachNewThreadSelector:@selector(drawInContext:) toTarget:self withObject:nil];

    }

}

- (void)drawInContext:(CGContextRef)context { ///gets called, but does nothing

    CGContextSetRGBStrokeColor(context, 1, 0, 1, .7);
    CGContextSetLineWidth(context, 20.0);
    WaypointViewController *w = [arrayOfWaypoints objectAtIndex:0];
    CGPoint startPoint = w.view.center;

    CGContextMoveToPoint(context, startPoint.x, startPoint.y);

    for (int i = 1; i<[arrayOfWaypoints count]; i++) {
        WaypointViewController *w2 = [arrayOfWaypoints objectAtIndex:i];
        CGPoint nextPoint = w2.view.center;
        CGContextAddLineToPoint(context,nextPoint.x, nextPoint.y);
    }

    CGContextStrokePath(context);
}

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

Вы не можете использовать контекст, который активен в drawRect: где-либо еще.

Вместо вызова [self drawInContext:context] call [self setNeedsDisplay]

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

Также, пожалуйста, прочитайте документы нарисунок на iOS здесь

2 голосов
/ 20 мая 2011

Вы не можете сохранить контекст для использования после возврата drawRect:.Вам нужно позвонить [self setNeedsDisplay] (или setNeedsDisplayInRect:, если вы можете определить ограничивающий прямоугольник изменения), что заставит систему снова вызвать drawRect: для вас.

0 голосов
/ 20 мая 2011

Вы можете делать все свои рисунки только в drawRect ... Надеюсь, что это поможет ... следовательно - (void) drawInContext: (CGContextRef) контекст не сможет сделать никакой рисунок. если после сенсорного действия пользователя вам нужно сделать перерисовку, вам нужно вызвать [self setNeedsDisplay] в ваших сенсорных методах.

...