1

iPhone用のQuartz-2Dを使って地図上にルートを表示しています。ルートは気温に応じて色分けされています。一部の道路は黄色に着色されているため、ルート ラインの下に少し太めの黒線を使用してボーダー効果を作成し、黄色の道路上でルートの黄色の部分が目立つようにしています。しかし、黒い線がルート線と同じくらい太くても、ルート全体がワームのように見えます (非常に醜い)。これは、最後のウェイポイントを次の開始ウェイポイントとして使用する代わりに、ウェイポイントからウェイポイントまで線を引いていたためだと思いました。そうすれば、いくつかのウェイポイントが欠落している場合でも、ルートにカットはありません。

ワーム効果なしで両方の行を表示するにはどうすればよいですか?

-(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.

エラー、でたらめだと思います。

ヒントください!:)


4

4 に答える 4

0

2 本の線を引く代わりに、1 本の線を引いて影の能力を使用できますか?

于 2010-01-14T01:48:43.960 に答える
0

ラインキャップと関係があるようです。フラット エンド キャップで描いてみて、それが役立つことを確認してください。

更新:今何が起こっているのかわかりました。これは単に、前の「背景」+「前景」線描画でカバーされたピクセルに重なる「背景」線です。すべての「背景」行を描画してからすべての「前景」行を描画するように変更すると、この問題が回避されます。あなたの線はまだいくつかのピクセルをオーバードローしていますが、同じ色しかないので気付かないでしょう. (ライン エンド キャップ スタイルのほとんどは、ライン内の実際のポイントを超えて延長されるため、効果がより顕著になり、ピクセルが重なり合うことに注意してください。)

于 2010-01-14T01:31:42.950 に答える
0

また、私は

<エラー>: CGContextClosePath: 現在のポイントがありません。

パスをストロークすると、現在のパス コンテキストが終了します。

于 2010-01-15T03:23:31.213 に答える
0

みんなありがとう!そのため、単に影を追加したり、ライン キャップを追加したりしても効果はありませんでした。効果は同じままでした。ただし、コードを少しいじっただけで、両方の行をフルパスで個別に (2 つの for ループで) 描画すると、効果がなくなることがわかりました。次に、背景の線に正方形の線キャップを追加して、少し見栄えを良くしました。

今、私が疑問に思っている唯一のことは...これの説明は何ですか?これが新しいコードです。後で最適化します...

-(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];
   }
}       
于 2010-01-14T20:50:35.517 に答える