objective-c - 将 MKPolygon Objective-C 代码转换为 Swift

标签 objective-c swift mkmapview mkpolygon

我有以下 Objective-C 方法:

- (void)addPolygonToMap {
    NSInteger numberOfPoints = [self.coordinates count];
    
    if (numberOfPoints > 4) {
        CLLocationCoordinate2D points[numberOfPoints];
        for (NSInteger i = 0; i < numberOfPoints; i++) {
            points[i] = [self.coordinates[i] MKCoordinateValue];
        }
        
        self.polygon = [MKPolygon polygonWithCoordinates:points count:numberOfPoints];
        [self.mapView addOverlay: self.polygon];
    }
    
    self.isDrawingPolygon = NO;
    [self.drawPolygonButton setTitle:@"draw" forState:UIControlStateNormal];
    self.canvasView.image = nil;
    [self.canvasView removeFromSuperview];
}

我尝试将其转换为 Swift:

func addPolygonToMap() {
    var numberOfPoints: NSInteger = self.coordinates.count
    
    if (numberOfPoints > 4) {
        var points: [CLLocationCoordinate2D] = []
        var coordsPointer = UnsafeMutablePointer<CLLocationCoordinate2D>.alloc(numberOfPoints)

        for i in 0..<numberOfPoints {
            points.append(coordsPointer[i])
        }
        
        self.polygon = MKPolygon(coordinates: &points, count: numberOfPoints)
        self.mapView.addOverlay(self.polygon)
        
        coordsPointer.dealloc(numberOfPoints)
    }
    
    self.isDrawingPolygon = false
    self.drawPolygonButton.setTitle("Draw", forState: .Normal)
    self.canvasView.image = nil
    self.canvasView.removeFromSuperview()
}

最后,当委托(delegate)方法被调用时,它实际上并没有添加 overlaymapView .我什么也看不见。

我假设这是我的 self.addPolytonToMap()方法,但我不是 100% 确定。整个场景在我的 Objective-C 项目中运行良好。

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if (overlay is MKPolygon) {
        var overlayPathView = MKPolygonRenderer(overlay: overlay)
        overlayPathView.fillColor = UIColor.cyanColor().colorWithAlphaComponent(0.2)
        overlayPathView.strokeColor = UIColor.cyanColor().colorWithAlphaComponent(0.2)
        overlayPathView.lineWidth = 5
        
        return overlayPathView
    } else if (overlay is MKPolyline) {
        var overlayPathView = MKPolylineRenderer(overlay: overlay)
        overlayPathView.strokeColor = UIColor.blueColor().colorWithAlphaComponent(0.7)
        overlayPathView.lineWidth = 5
        
        return overlayPathView
    }
    
    return nil
}

更新:

我刚刚注意到在我的 Objective-C 版本中,points[i].latitude一切顺利,但是当我执行以下操作时,我得到了一个奇怪的输出:

println(coordsPointer[i].latitude)

输出:

1.63041663127611e-321

1.64523860065135e-321

1.65511991356818e-321

1.68970450877706e-321

1.7045264781523e-321

1.72922976044436e-321

这可以解释为什么我没有看到 overlay , 但是我对 UnsafeMutablePointer<> 的体验是有限的。

最佳答案

通过修改 addPolygonToMap() 方法修复:

func addPolygonToMap() {
    var numberOfPoints: NSInteger = self.coordinates.count

    if (numberOfPoints > 4) {
        var points: [CLLocationCoordinate2D] = []

        for i in 0..<numberOfPoints {
            points.insert(self.coordinates[i].MKCoordinateValue, atIndex: i)
        }

        self.polygon = MKPolygon(coordinates: &points, count: numberOfPoints)
        self.mapView.addOverlay(self.polygon)
    }

    self.isDrawingPolygon = false
    self.drawPolygonButton.setTitle("Draw", forState: .Normal)
    self.canvasView.image = nil
    self.canvasView.removeFromSuperview()
}

感谢 @Volker 的帮助。

关于objective-c - 将 MKPolygon Objective-C 代码转换为 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208535/

相关文章:

ios - 将 GCD 与 View 动画混合

swift - UIGestureRecognizer 导致未捕获的异常错误

ios - 当用户缩小并且注释彼此太靠近时隐藏 MKAnnotations

iphone - 如何将 MKMapView 用户位置蓝点更改为选择的图像?

swift - 类不符合协议(protocol)。为什么?

ios - Swift MKMapView Pin 注释问题

ios - 两个连续 HTTP GET 的嵌套 NSURLSessionDataTask

javascript - 如何从 wkWebview/webView 中的 Objective-C 更改 `&lt;input&gt;` 元素属性(例如值)

ios - 是否最好使用带有单元格标识符的静态字符串?

ios - 横向锁定相机