2016-05-27 9 views
3

カスタムMKOverlayRendererを構築してポリゴンを作成し、ブレンドモードを適用してマップビューに追加しました。私のdrawMapRect関数では、CGPointの配列を使ってポリゴンを構築し、パスを作成します。カスタムMKOverlayRenderer drawMapRect関数がポリゴンを描画しない

ただし、実行時にマップビューに何も表示されません。私の最高の推測は、drawMapRect関数でポリゴンを作成する順序です。どんな助けや指導も大変ありがとうございます。

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { 
    if (overlay is MKPolygon) { 
     let polygonRenderer = MyCustomMapRenderer(overlay: overlay, fillColor: self.polyFactory!.getPolygonColor().CGColor, polygon: self.currentPolygon!) 
     return polygonRenderer 
    } 
    return MKOverlayRenderer() 
} 
+1

でロブの答えは、あなたは注釈が正しく追加され、それは 'MKPolygon'だとされていることを確認しました:?だから私は何かのようにしてください例えば。ブレンドポイントを 'rendererForOverlay'に追加し、そのコードを打っていることを確認してください。その場合は、 'drawMapRect'にブレークポイントを追加し、呼び出されていることを確認してください。時にはマップビューのデリゲートを無視するなどの単純なこともあります。このコードについて心配する前にそれがOKであることを確認してみましょう... – Rob

+0

@Robはい、彼らは間違いなく呼び出されています。 'drawMapRect'に進む前に' rendererForOverlay's'リターンを打つでしょう – Jamesar

答えて

2

いくつかの観察:あなたはすでにMKMapPointの配列であるpointsを取っている

  • を(MKPolygonRenderer。ここ

    override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) { 
    
        super.drawMapRect(mapRect, zoomScale: zoomScale, inContext: context) 
        CGContextSaveGState(context) 
        CGContextSetBlendMode(context, CGBlendMode.Exclusion) 
        CGContextSetFillColorWithColor(context, self.fillColor) 
        CGContextSetStrokeColorWithColor(context, UIColor.whiteColor().CGColor) 
        CGContextSetLineWidth(context, 1.0) 
    
        let point = MKMapPointForCoordinate(self.polygon.points[0]) 
        CGContextMoveToPoint(context, CGFloat(point.x), CGFloat(point.y)) 
        for i in 1..<self.polygon.points.count { 
         let point = polygon.points[i] 
         let p = MKMapPointForCoordinate(point) 
         CGContextAddLineToPoint(context, CGFloat(p.x), CGFloat(p.y)) 
        } 
    
        CGContextClosePath(context) 
        CGContextDrawPath(context, CGPathDrawingMode.FillStroke) 
        CGContextRestoreGState(context) 
    } 
    

    は私のカスタムオーバーレイレンダラーが初期化されているところであります、少なくとも)と呼び出しMKMapPointForCoordinateMKMapPointForCoordinateを使用する場合は、でなくcoordinatesにします。pointsではなく、coordinatesとします。自分のプロパティを定義している可能性もありますが、混乱を避けるためにプロパティの名前を変更する可能性があります。

  • pointForMapPointでマップポイントをスクリーンポイントに変換する必要があります。

  • また、CGContextSetFillColorWithColorを呼び出していますが、fillColorを渡しています。しかし、あなたのクラスがMKPolygonRendererのサブクラスであると仮定すると、fillColorはであり、CGColorではありません。

  • あなたはpoints、いくつかのプロパティにアクセスしているように見えるが、MKPolygonRendererpoints性質を持っているのではなく、points()方法はありません。

これらのことはすべてあなたのコードがどのようにコンパイルされているかわかりません。私はあなたがMKPolygonRendererからサブクラス化されていないと思うが、むしろサブクラスMKOverlayRendererとし、あなたがMKPolygonRenderをサブクラス化する場合は、あなたが自由のためのすべてのポリゴンの動作を取得し、唯一drawMapRectを実装する必要があります。ところで

class MyCustomMapRenderer: MKPolygonRenderer { 

    override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) { 
     //super.drawMapRect(mapRect, zoomScale: zoomScale, inContext: context) 

     CGContextSaveGState(context) 
     CGContextSetBlendMode(context, CGBlendMode.Exclusion) 
     CGContextSetFillColorWithColor(context, fillColor!.CGColor) 
     CGContextSetStrokeColorWithColor(context, UIColor.whiteColor().CGColor) 
     CGContextSetLineWidth(context, 1.0) 

     if polygon.pointCount > 1 { 
      CGContextBeginPath(context) 

      let point = pointForMapPoint(polygon.points()[0]) 
      CGContextMoveToPoint(context, CGFloat(point.x), CGFloat(point.y)) 
      for i in 1 ..< polygon.pointCount { 
       let point = pointForMapPoint(polygon.points()[i]) 
       CGContextAddLineToPoint(context, CGFloat(point.x), CGFloat(point.y)) 
      } 

      CGContextClosePath(context) 
      CGContextDrawPath(context, CGPathDrawingMode.FillStroke) 
     } 
     CGContextRestoreGState(context) 
    } 

} 

を、我々はおそらく考え出す、ポイントが見えていたかどうかをチェックする(ここでは、より洗練された可能性がありスケールが与えられてレンダリングするポイント...数千ポイントのポリゴンで、ビューの100x100の部分に拡大縮小されている場合は、すべてのポイントをレンダリングする必要はありません。 WWDC 2010 Customizing Maps with Overlaysを参照してください。

脇に、あなたのrendererForOverlayも興味があります。カスタム初期化メソッド(これは問題ありません)を呼び出していますが、overlaycurrentPolygonを渡しています。しかし、overlayポリゴンなので、私はこのcurrentPolygonが何であるか分かりません。 rendererForOverlayはステートレスなので、いくつかのプロパティを参照することをお勧めしませんが、メソッドに渡されたoverlayを使用してください。そうすることで、複数のポリゴンを持つことができ、地図ビューにどの画像がどのようなものであるかを把握させることができます。

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { 
    if let polygon = overlay as? MKPolygon { 
     let polygonRenderer = MyCustomMapRenderer(polygon: polygon) 
     polygonRenderer.fillColor = polyFactory!.getPolygonColor() 
     return polygonRenderer 
    } 
    fatalError("Unexpected overlay type") 
} 
+1

それは確かにそのトリックでした。ありがとう@ロブ!問題は、私がMKOverlayRendererをサブクラス化していて、それをもっと難しくすることだったと思います。 MKPolygonRendererのサブクラス化に切り替える際には、すばらしいことです!今後は、私の財産と変数の名前の多くが多少矛盾しているか、あまりにも混乱していることに気付きます。私は間違いなくプロセスが適切に機能しているので、名前を変更してリファクタリングします。再度、あなたの助けをありがとう! – Jamesar

0

スウィフト3

class MyRenderer: MKPolylineRenderer { 

    override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) { 

     context.saveGState() 
     context.setBlendMode(CGBlendMode.exclusion) 

     let clear = UIColor.clear 

     context.setFillColor(clear.cgColor) 

     let green = UIColor.green 

     context.setStrokeColor(green.cgColor) 

     context.setLineWidth(10.0) 

     if self.polyline.pointCount > 1 { 

      context.beginPath() 

      let point_ = self.point(for: self.polyline.points()[0]) 

      context.move(to: CGPoint(x: point_.x, y: point_.y)) 

      for element in 1 ..< self.polyline.pointCount { 

       let point_ = self.point(for: polyline.points()[element]) 

       context.addLine(to: CGPoint(x: point_.x, y: point_.y)) 

      } 

      context.closePath() 

      context.drawPath(using: .fillStroke) 

     } 

     context.restoreGState() 

    } 


} 
関連する問題