gpt4 book ai didi

ios - MKPolyline 只画点而不画线

转载 作者:行者123 更新时间:2023-11-29 12:35:21 26 4
gpt4 key购买 nike

我正在尝试跟踪用户的路线并绘制路线的线条,但是 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;
}

最佳答案

map View 传递给 didUpdateUserLocation 委托(delegate)方法的 userLocation 对象每次都是相同的对象

对象内部的坐标可能每时每刻都不同,但每次调用委托(delegate)方法总是指向同一个容器对象。

具体来说,它始终指向 map View 的 userLocation 属性指向的同一对象 (mapView.userLocation)。如果你 NSLog userLocationmapView.userLocation 并且注意到它们的内存地址每次都是相同的,你可以看到这一点。


出于这个原因,当代码这样做时:

[self.trackPointArray addObject:userLocation];

它只是多次将相同的对象引用添加到数组。

稍后,当代码循环遍历 trackPointArray 数组时,每次调用 [location coordinate] 都会返回相同的坐标,因为 location始终指向同一个对象 (mapView.userLocation) 并且坐标在循环期间不会改变。

因此每次调用委托(delegate)方法时,都会创建一条具有 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];

关于ios - MKPolyline 只画点而不画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26506407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com