Я хочу нарисовать ломаную линию, когда пользователь перемещает палец по экрану. Я пишу код на основе какой-то статьи, и он работает до определенного момента. В какой-то момент все начинает лагать и приложение вылетает.
Я пытался убрать оверлеи и уменьшить количество очков, но это мне не помогло.
var rendersWorkaround: [MKOverlayRenderer] = []
var currentRender: MKOverlayRenderer?
var points: [CLLocationCoordinate2D] = []
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.rendersWorkaround.forEach { item in
self.mapView.removeOverlay(item.overlay)
}
self.rendersWorkaround = []
self.points = []
if let touch = touches.first {
let coordinate = mapView.convert(touch.location(in: mapView), toCoordinateFrom: mapView)
points.append(coordinate)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// if self.lastTouchTime != nil && (Date().timeIntervalSinceReferenceDate - self.lastTouchTime!) < 0.025 { return }
if self.rendersWorkaround.count > 10 {
let countForDelete: Int = Int((Double(self.rendersWorkaround.count) / 2.0).rounded())
for index in 0...countForDelete {
self.mapView.removeOverlay(self.rendersWorkaround[index].overlay)
}
self.rendersWorkaround.removeSubrange(0...countForDelete)
}
if let touch = touches.first {
let coordinate = mapView.convert(touch.location(in: mapView), toCoordinateFrom: mapView)
points.append(coordinate)
if points.count > 299 {
points = points.indices.compactMap { return $0 % 2 != 0 ? points[$0] : nil }
}
let polyline = MKPolyline(coordinates: points, count: points.count)
mapView.addOverlay(polyline)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let polygon = MKPolygon(coordinates: &points, count: points.count)
mapView.addOverlay(polygon)
points = []
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is MKPolyline {
let polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = .orange
polylineRenderer.lineWidth = 5
self.rendersWorkaround.append(polylineRenderer)
self.currentRender = polylineRenderer
return polylineRenderer
} else if overlay is MKPolygon {
let polygonView = MKPolygonRenderer(overlay: overlay)
polygonView.fillColor = .magenta
self.rendersWorkaround.append(polygonView)
return polygonView
}
return MKTileOverlayRenderer(overlay: overlay)
}