2016-10-16 2 views
0

저는 iOS를 처음 접했습니다. 제 목표는 Swift 3과 MapKit을 사용하여지도보기에 맞춤 오버레이를 추가하는 것입니다. 나는 이것을 따라 갔다 Add inverted circle overlay to map view. 어떤 제안 결국 오버레이 경로 (원)을 제외하지 않고 표시됩니다지도보기에 맞춤 오버레이 추가하기

import UIKit 
import MapKit 

class MyMapOverlayRenderer: MKOverlayRenderer { 

let diameter: Double 
let fillColor: UIColor 

init(overlay: MKOverlay, diameter: Double, fillColor: UIColor) { 

    self.diameter = diameter 
    self.fillColor = fillColor 
    super.init(overlay: overlay) 

} 

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

    let path = UIBezierPath(rect: CGRect(x: mapRect.origin.x, y: mapRect.origin.y, width: mapRect.size.width, height: mapRect.size.height)) 
    path.usesEvenOddFillRule = true 
    let radiusInMapPoints = diameter * MKMapPointsPerMeterAtLatitude(self.overlay.coordinate.latitude) 
    let radiusSquared = MKMapSize(width: radiusInMapPoints, height: radiusInMapPoints) 
    let regionOrigin = MKMapPointForCoordinate(self.overlay.coordinate) 
    var regionRect = MKMapRect(origin: regionOrigin, size: radiusSquared) 
    regionRect = MKMapRectOffset(regionRect, -radiusInMapPoints/2, -radiusInMapPoints/2) 
    regionRect = MKMapRectIntersection(regionRect, MKMapRectWorld) 

    let cornerRadius = CGFloat(regionRect.size.width/Double(2)) 

    let excludePath = UIBezierPath(roundedRect: CGRect(x: regionRect.origin.x, y: regionRect.origin.y, width: regionRect.size.width, height: regionRect.size.height), cornerRadius: cornerRadius) 
    path.append(excludePath) 


    context.setFillColor(fillColor.cgColor) 
    context.addPath(path.cgPath) 
    context.fillPath() 

} 
} 

: 여기 코드인가?

답변

0

그것을 해결 단지) (반전 추가 :

path.append(excludePath.reversing()) 

전체 기능 코드 :

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

    let path = UIBezierPath(rect: CGRect(x: mapRect.origin.x, y: mapRect.origin.y, width: mapRect.size.width, height: mapRect.size.height)) 
    path.usesEvenOddFillRule = true 
    let radiusInMapPoints = diameter * MKMapPointsPerMeterAtLatitude(MKMapPointsPerMeterAtLatitude(overlay.coordinate.latitude)) 

    let radiusSquared = MKMapSize(width: radiusInMapPoints, height: radiusInMapPoints) 

    let regionOrigin = MKMapPointForCoordinate(overlay.coordinate) 

    var regionRect = MKMapRect(origin: regionOrigin, size: radiusSquared) 

    regionRect = MKMapRectOffset(regionRect, -radiusInMapPoints/2, -radiusInMapPoints/2) 
    regionRect = MKMapRectIntersection(regionRect, MKMapRectWorld) 

    let midX = (regionOrigin.x + regionRect.origin.x)/2 
    let midY = (regionOrigin.y + regionRect.origin.y)/2 

    let cornerRadius = CGFloat(regionRect.size.width/Double(2)) 
    let excludePath = UIBezierPath(roundedRect: CGRect(x: midX, y: midY, width: regionRect.size.width/2, height: regionRect.size.height/2), cornerRadius: cornerRadius) 

    path.append(excludePath.reversing()) 

    context.setFillColor(fillColor.cgColor) 
    context.addPath(path.cgPath) 
    context.fillPath() 

}