在UITableView上出列并重新排队时,MKMapView会一直缩小

时间:2017-05-19 23:31:58

标签: ios swift uitableview mkmapview

我正在构建一个具有UITableController的应用程序,该UITableController具有自定义UITableViewCell,其中包含带有一些文本的MKMapView。我正确地显示了内容,但是当单元格从视图中出列或从视图中移除时,一旦它再次出现,地图就会略微缩小,并且它会越来越多地逐渐缩小并重新排队。有人可以帮我从这里出去吗?我已经进入故事板编辑器并关闭了mapView的所有缩放和滚动,我不确定为什么视图会继续缩小。

TableViewController.swift

....
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MapTableViewCell
    cell.mapView.delegate = self
    showRoute(routes: locationStructArray[indexPath.row].route, color: UIColor.green, mapView: cell.mapView)

    return cell
}

func showRoute(routes:[MKRoute], color: UIColor, mapView: MKMapView){
    for i in 0..<routes.count{
        plotPolyLine(route: routes[i], color: color, mapView: mapView)
    }
}

func plotPolyLine(route: MKRoute, color: UIColor, mapView: MKMapView){
    let poly = route.polyline
    let mypoly = MyColoredPolyline(points: poly.points(), count: poly.pointCount)
    mypoly.color = color
    mapView.add(mypoly)
    if mapView.overlays.count == 1 {
        mapView.setVisibleMapRect(mypoly.boundingMapRect, edgePadding: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0), animated: false)
    }
    else {
        let polylineBoundingRect =  MKMapRectUnion(mapView.visibleMapRect, mypoly.boundingMapRect)
        mapView.setVisibleMapRect(polylineBoundingRect, edgePadding: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0), animated: false)
    }
}

extension TableViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let route: MyColoredPolyline = overlay as! MyColoredPolyline

        let pr = MKPolylineRenderer(polyline: route)
        pr.lineWidth = 3.0
        pr.strokeColor = route.color
        return pr
    }
}

编辑 GIF,其中添加了建议:http://gph.is/2qAx6Ls

1 个答案:

答案 0 :(得分:1)

cell.mapView.removeOverlays(cell.mapView.overlays)

我认为这是因为您忘记从同一地图视图中删除旧的多段线,以便重复使用:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = ...
  cell.mapView.delegate = self
  cell.mapView.removeOverlays(cell.mapView.overlays)
  showRoute(routes: locationStructArray[indexPath.row].route, color: UIColor.green, mapView: cell.mapView)
  return cell
}

更好的方法是使用MapTableViewCell prepareForReuse()方法做到这一点:

class MapTableViewCell: UITableViewCell {
  ...

  override func prepareForReuse() {
    super.prepareForReuse()
    mapView.removeOverlays(mapView.overlays)
  }
}