我正在构建一个具有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
答案 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)
}
}