2010-01-14 2 views
1

Я использую Quartz-2D для iPhone для отображения маршрута на карте. Маршрут окрашивается в соответствии с температурой. Поскольку некоторые улицы окрашены в желтый цвет, я использую слегка более толстую черную линию под линии маршрута, чтобы создать эффект границы, так что желтые части маршрута выделяются на желтых улицах. Но даже если черная линия будет такой же толстой, как линия маршрута, весь маршрут выглядит как червь (очень уродливый). Это было связано с тем, что я рисовал линии от waypoint до waypoint, вместо этого использовал последнюю путевую точку в качестве следующей стартовой путевой точки. Таким образом, если отсутствует пара путевых точек, маршрут по-прежнему не будет иметь разрезов.Рисунок iphone quartz 2 строки друг на друга вызывает эффект червя

Что мне нужно для отображения обеих линий без эффекта червя?

-(void) drawRect:(CGRect) rect 
{ 
CSRouteAnnotation* routeAnnotation = (CSRouteAnnotation*)self.routeView.annotation; 

// only draw our lines if we're not int he moddie of a transition and we 
// acutally have some points to draw. 
if(!self.hidden && nil != routeAnnotation.points && routeAnnotation.points.count > 0) 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    Waypoint* fromWaypoint = [[Waypoint alloc] initWithDictionary:[routeAnnotation.points objectAtIndex:0]]; 
    Waypoint* toWaypoint; 

    for(int idx = 1; idx < routeAnnotation.points.count; idx++) 
    { 
     toWaypoint = [[Waypoint alloc] initWithDictionary:[routeAnnotation.points objectAtIndex:idx]]; 


     CLLocation* fromLocation = [fromWaypoint getLocation]; 
     CGPoint fromPoint = [self.routeView.mapView convertCoordinate:fromLocation.coordinate toPointToView:self]; 

     CLLocation* toLocation = [toWaypoint getLocation]; 
     CGPoint toPoint = [self.routeView.mapView convertCoordinate:toLocation.coordinate toPointToView:self]; 

     routeAnnotation.lineColor = [fromWaypoint.weather getTemperatureColor]; 

     CGContextBeginPath(context); 
     CGContextSetLineWidth(context, 3.0); 
     CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
     CGContextMoveToPoint(context, fromPoint.x, fromPoint.y); 
     CGContextAddLineToPoint(context, toPoint.x, toPoint.y); 
     CGContextStrokePath(context); 
     CGContextClosePath(context); 

     CGContextBeginPath(context); 
     CGContextSetLineWidth(context, 3.0); 
     CGContextSetStrokeColorWithColor(context, routeAnnotation.lineColor.CGColor); 
     CGContextMoveToPoint(context, fromPoint.x, fromPoint.y); 
     CGContextAddLineToPoint(context, toPoint.x, toPoint.y); 
     CGContextStrokePath(context); 
     CGContextClosePath(context); 


     fromWaypoint = toWaypoint; 
    } 

    [fromWaypoint release]; 
    [toWaypoint release];  
} 
} 

Кроме того, я получаю ошибку

<Error>: CGContextClosePath: no current point. 

, который я думаю, это фигня.

Пожалуйста, подскажите мне! :)


ответ

0

Похоже, что это может быть связано с линией. Попробуйте рисунок с плоскими торцевыми крышками и увидите, что это помогает.

UPDATE: Я вижу, что происходит сейчас. Это просто «фоновая» линия, перекрывающая пиксели, покрытые предыдущей «фоновой» + «наземной» линией. Ваше изменение, чтобы нарисовать все «фоновые» линии, тогда все строки «переднего плана» избегают этой проблемы. Ваши строки все еще перегружают некоторые пиксели, но только одного цвета, поэтому вы не заметите. (Обратите внимание, что большинство стилей конца строки линии расширяют фактическую точку в строке, делая эффект более выраженным - больше перекрывающихся пикселей.)

0

Вместо того, чтобы рисовать две линии, вы могли бы просто нарисовать один и использовать the Shadows ability?

0

Спасибо, ребята! Таким образом, простое добавление тени или ограничение строки не помогло, эффект остался прежним. Тем не менее, я просто немного играл с кодом, и получается, что если я рисую обе линии в полном пути отдельно (по два для циклов), эффект не будет! Затем я добавил квадратные строчки в линию фона, чтобы сделать ее немного приятнее.

Теперь единственное, что мне интересно, это ... что объясняет это? Вот новый код, я буду оптимизировать его позже ...

-(void) drawRect:(CGRect) rect { 
CSRouteAnnotation* routeAnnotation = (CSRouteAnnotation*)self.routeView.annotation; 

// only draw our lines if we're not int he moddie of a transition and we 
// acutally have some points to draw. 
if(!self.hidden && nil != routeAnnotation.points && routeAnnotation.points.count > 0) 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 


    Waypoint* fromWaypoint = [[Waypoint alloc] initWithDictionary:[routeAnnotation.points objectAtIndex:0]]; 
    Waypoint* toWaypoint; 

    for(int idx = 1; idx < routeAnnotation.points.count; idx++) 
    { 
     toWaypoint = [[Waypoint alloc] initWithDictionary:[routeAnnotation.points objectAtIndex:idx]]; 


     CLLocation* fromLocation = [fromWaypoint getLocation]; 
     CGPoint fromPoint = [self.routeView.mapView convertCoordinate:fromLocation.coordinate toPointToView:self]; 

     CLLocation* toLocation = [toWaypoint getLocation]; 
     CGPoint toPoint = [self.routeView.mapView convertCoordinate:toLocation.coordinate toPointToView:self]; 

     routeAnnotation.lineColor = [fromWaypoint.weather getTemperatureColor]; 

     CGContextBeginPath(context); 
     CGContextSetLineWidth(context, 3.5); 
     CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
     CGContextSetLineCap(context, kCGLineCapSquare); 
     CGContextMoveToPoint(context, fromPoint.x, fromPoint.y); 
     CGContextAddLineToPoint(context, toPoint.x, toPoint.y); 
     CGContextStrokePath(context); 
     CGContextClosePath(context); 

     fromWaypoint = toWaypoint; 

    } 

    // zweite for schleife 
    for(int idx = 1; idx < routeAnnotation.points.count; idx++) 
    { 
     toWaypoint = [[Waypoint alloc] initWithDictionary:[routeAnnotation.points objectAtIndex:idx]]; 


     CLLocation* fromLocation = [fromWaypoint getLocation]; 
     CGPoint fromPoint = [self.routeView.mapView convertCoordinate:fromLocation.coordinate toPointToView:self]; 

     CLLocation* toLocation = [toWaypoint getLocation]; 
     CGPoint toPoint = [self.routeView.mapView convertCoordinate:toLocation.coordinate toPointToView:self]; 

     routeAnnotation.lineColor = [fromWaypoint.weather getTemperatureColor]; 

     CGContextBeginPath(context); 

     CGContextSetLineWidth(context, 3.0); 
     CGContextSetStrokeColorWithColor(context, routeAnnotation.lineColor.CGColor); 
     CGContextSetLineCap(context, kCGLineCapSquare); 
     CGContextMoveToPoint(context, fromPoint.x, fromPoint.y); 
     CGContextAddLineToPoint(context, toPoint.x, toPoint.y); 
     CGContextStrokePath(context); 
     CGContextClosePath(context); 

    } 

    [fromWaypoint release]; 
    } 
}  
0

Кроме того, я получаю

< Ошибка >: CGContextClosePath: нет текущей точки.

Путь к концу текущего контекста пути.