MKPolyline рисует только точки вместо линий
Я пытаюсь отследить маршрут пользователя и нарисовать линии маршрута, но addOverlay
только дает мне правильные точки, но нет связи между каждой точкой.
-(void)viewWillAppear:(BOOL)animated{
self.trackPointArray = [[NSMutableArray alloc] init];
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(CLLocation *)userLocation
{
[self.trackPointArray addObject:userLocation];
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1000, 1000);
[self.myMapView setRegion:[self.myMapView regionThatFits:region] animated:YES];
NSInteger stepsNumber = self.trackPointArray.count;
CLLocationCoordinate2D coordinates[stepsNumber];
for (NSInteger index = 0; index < stepsNumber; index++) {
CLLocation *location = [self.trackPointArray objectAtIndex:index];
coordinates[index] = [location coordinate];
}
MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:stepsNumber];
[self.myMapView addOverlay:polyLine];
}
- (MKOverlayRenderer *)mapView:(MKMapView *)myMapView rendererForOverlay:(id<MKOverlay>)overlay
{
MKPolylineRenderer *polylineRenderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
polylineRenderer.lineWidth = 4.0f;
polylineRenderer.strokeColor = [UIColor redColor];
return polylineRenderer;
}
1 ответ
userLocation
возражать didUpdateUserLocation
Метод делегата всегда один и тот же объект.
coordinate
внутри объекта может быть разным в каждый момент, но каждый вызов метода делегата всегда указывает на один и тот же контейнерный объект.
В частности, он всегда указывает на тот же объект, что и вид карты userLocation
свойство указывает на (mapView.userLocation
). Вы можете увидеть это, если вы NSLog
userLocation
а также mapView.userLocation
и обратите внимание, что их адреса памяти одинаковы каждый раз.
По этой причине, когда код делает это:
[self.trackPointArray addObject:userLocation];
он просто добавляет одну и ту же ссылку на объект в массив несколько раз.
Позже, когда код перебирает trackPointArray
массив, каждый вызов [location coordinate]
возвращает одну и ту же координату каждый раз, потому что location
всегда указывает на один и тот же объект (mapView.userLocation
) и координата не изменяется во время цикла.
Таким образом, каждый раз, когда вызывается метод делегата, создается ломаная линия с N координатами (все одинаковые), которая в итоге рисует "точку".
Причина, по которой вы видите несколько точек, заключается в том, что код не удаляет предыдущие наложения.
Чтобы все это исправить, одним из простых способов является создание нового CLLocation
экземпляр каждый раз, когда вы хотите добавить обновленные координаты:
CLLocation *tpLocation = [[CLLocation alloc]
initWithLatitude:userLocation.coordinate.latitude
longitude:userLocation.coordinate.longitude];
[self.trackPointArray addObject:tpLocation];
Кроме того, вы должны удалить предыдущее наложение перед добавлением обновленной строки. Вы не заметите предыдущие строки, если не сделаете этого, но они будут там, используя память и производительность:
[self.myMapView removeOverlays:self.myMapView.overlays];
[self.myMapView addOverlay:polyLine];