相关疑难解决方法(0)

如何更新MKPolyline/MKPolylineView?

我正在尝试创建一个定期更新的折线(MKPolyline)叠加层,以模拟对象的移动.我可以通过删除旧的叠加层,更新折线并再次添加叠加层来实现此目的,但这会导致闪烁.

对于一个点注释(MKPointAnnotation),你可以简单地改变其坐标,视图将无需拆卸和重新添加注释,可以自动地更新顺利.

这也可能以某种方式覆盖?

iphone objective-c mapkit ios4

15
推荐指数
2
解决办法
8753
查看次数

平滑调整MKCircle的大小

在调整NSSlider时,如何在UIMapView上平滑调整MKCircleView的大小?苹果已经成功地做到这一点在查找好友创建地理围栏时,应用程序(http://reviewznow.com/wp-content/uploads/2013/03/find-my-friends-location-alerts-01.jpg),所以我想这在某种程度上是可能的.到目前为止,我已经尝试了以下解决方案,但结果非常"闪烁":

第一次尝试

我添加了一个具有更新半径的新MKCircleView,并在移除滑块更改值后立即移除(如此处建议MKOverlay不能平滑地调整大小).我也尝试过另一种方法:首先删除叠加层,然后添加一个新叠加层,但使用相同的"flickery"结果.

- (void)sliderChanged:(UISlider*)sender
{
    double radius = (sender.value * 100);
    [self addCircleWithRadius:radius];
    [mapView removeOverlays:[self.mapView.overlays firstObject]];
}
Run Code Online (Sandbox Code Playgroud)

第二次尝试

在链接的SO答案中,他建议NSOperation可用于"帮助您更快地创建MKCircle对象",从而在幻灯片更改值时使用上述添加/删除叠加层的方法使调整大小更加平滑.我做了一个实现,每当滑块改变时我就开始一个新的线程.在每个线程中,我删除所有旧的叠加层并添加一个新的叠加层.也许他还有其他一些实现方式,因为我这样做的方式在更改滑块时仍然会出现相同的闪烁.

- (void)sliderChanged:(UISlider*)sender
{
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                             selector:@selector(updateOverlayWithScale:)
                                                                               object:[NSNumber numberWithFloat:sender.scale]];
     [self.queue addOperation:operation];
}
Run Code Online (Sandbox Code Playgroud)

每个线程运行的方法:

- (void)updateOverlayWithScale:(NSNumber *)scale
{
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:self.currentMapPin.coordinate
                                                     radius:100*[scale floatValue]];


    [self.mapView performSelectorOnMainThread:@selector(removeOverlays:) withObject:self.mapView.overlays waitUntilDone:NO];
    [self.mapView performSelectorOnMainThread:@selector(addOverlay:) withObject:circle waitUntilDone:NO];
}
Run Code Online (Sandbox Code Playgroud)

第三次尝试

我还尝试实现我自己的MKOverlayView子类,它根据scale属性绘制自己.每当滑块改变时,我调用setNeedsDisplay并让它自己重绘,但我得到相同的闪烁.

- (void)sliderChanged:(UISlider*)sender
{
     self.currentOverlayView.scale = sender.scale
     [self.currentOverlayView setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)

而在我的自定义重叠视图我实现drawMapRect:zoomScale:inContext的:(CGContextRef)背景下这样的

- (void)drawMapRect:(MKMapRect)mapRect
          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)context
{
     double …
Run Code Online (Sandbox Code Playgroud)

objective-c mapkit mkmapview ios mkoverlay

8
推荐指数
1
解决办法
2715
查看次数

MapKit:更新 MKCircle 叠加层的半径属性而不闪烁

我有一个MKMapView (self.mapView),其中添加了具有特定半径 (self.location.radius) 的MKCircle覆盖 (self.radiusOverlay)。

MKMapView正下方有一个UISlider (self.radiusSlider),它可以在Value Changed上更改叠加层的半径:

- (void)viewWillAppear:(BOOL)animated {

    self.radiusOverlay = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake([self.location.latitude floatValue], [self.location.longitude floatValue]) radius:[self.location.radius floatValue]];

    [self.mapView addOverlay:self.radiusOverlay];

    self.radiusSlider.value = [self.location.radius floatValue];
}
Run Code Online (Sandbox Code Playgroud)

这是进行半径更新的方法:

- (IBAction)updateLocationRadius:(UISlider *)sender {

    [self.mapView removeOverlay:self.radiusOverlay];

    self.location.radius = [NSNumber numberWithFloat:sender.value];

    self.radiusOverlay = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake([self.location.latitude floatValue], [self.location.longitude floatValue]) radius:[self.location.radius floatValue]];
    [self.mapView addOverlay:self.radiusOverlay];
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但看起来不太好:通过删除并重新添加self.radiusOverlay我导致覆盖层闪烁。

我该怎么做才能避免这种闪烁?

objective-c mapkit

5
推荐指数
0
解决办法
3180
查看次数

标签 统计

mapkit ×3

objective-c ×3

ios ×1

ios4 ×1

iphone ×1

mkmapview ×1

mkoverlay ×1