2014-09-04 42 views
2

我正在使用MapView来处理项目。你可以通过Tab键拖放一个别针并按住。当你选择销钉时,会出现一定半径的圆。但是现在用户应该决定圆圈的半径。这应该可以通过UISlider进行。用UI滑块动态更改MKCircle半径

问题是,圆半径不会动态变化。圆圈出现,您移动滑块并没有任何反应。再次取消选择该引脚,将添加另一个带有新的UISlider值的环。

当前代码: 在.h文件中:

@property (retain, nonatomic) MKCircle *pinCircle; 

在.m文件:

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { 

    _radius.hidden= false; 

    CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude:[(MKPointAnnotation*)[view annotation] coordinate].latitude longitude:[(MKPointAnnotation*)[view annotation] coordinate].longitude]; 
    _pinCircle = [MKCircle circleWithCenterCoordinate:pinLocation.coordinate radius:_radius.value*1000]; 
    [_mapView addOverlay:_pinCircle]; 
    [_pinCircle autorelease]; 

} 

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { 
    _radius.hidden= true; 
    } 

- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay 
{ 
    MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay]; 
    circleView.strokeColor = [UIColor greenColor]; 
    circleView.fillColor = [[UIColor greenColor] colorWithAlphaComponent:0.4]; 
    return [circleView autorelease]; 
} 

我知道我必须要使用这个动作:

- (IBAction)radiusSliderChange:(id)sender { 
    NSLog(@"Slidervalue changed"); 
    [self.pinCircle removeFromSuperview]; 
} 

但这导致以下错误:

-[MKCircle removeFromSuperview]: unrecognized selector sent to instance 0x18b919d0 

据亚历杭德罗·F.卡雷拉的文章中,我得到了以下错误:

https://www.dropbox.com/s/saxhns992jex606/Bildschirmfoto%202014-09-04%20um%2020.20.21.png?dl=0

回答

1

您可以ADRESS您MKCircle * pinCircle在.h文件中,比访问它像“self.pinCircle”。在这之后,你就可以使用[self.pinCircle removeFromSuperview];将其删除.. :-)

+0

感谢您的回答,但我收到以下错误。看到我上面的编辑。 – Eric 2014-09-04 17:40:23

+1

要删除地图上的所有引脚,可以使用[mapView removeOverlays:[mapView overlays]];试试吧:-) – stepik21 2014-09-04 18:28:51

+0

谢谢@ stepik21我试图重新创建围栏使用滑块..你的代码行工作正常** [mapView removeOverlays:[mapView覆盖]]; ** votup你的评论谢谢.. – vaibhav 2016-05-17 12:33:33

2

您必须在初始化设置为零(pinCircle =零;),那么你必须检查:

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    if(pinCircle != nil) // click two annotations 
    { 
     [_mapView removeOverlay: _pinCircle]; 
     _pinCircle = nil; 
    } 
    _radius = 100; // start value to define 
    [self createCircle: view.annotation.coordinate]; 
} 

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
{ 
    if(pinCircle != nil) 
    { 
     [_mapView removeOverlay: _pinCircle]; 
     _pinCircle = nil; 
    } 
} 

- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay 
{ 
    MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay]; 
    circleView.strokeColor = [UIColor greenColor]; 
    circleView.fillColor = [[UIColor greenColor] colorWithAlphaComponent:0.4]; 
    return [circleView autorelease]; 
} 

你已使用Storyboard为此,您必须具有滑块变量,如pinCircle

- (IBAction)radiusSliderChange:(id)sender { 
    _radius = _slider.value; // radius property of circle is readonly so you must create other one 
    [_mapView removeOverlay: _pinCircle]; 
    [self createCircle:_pinCircle.coordinate]; 
} 

- (void)createCircle:(CLLocationCoordinate)coord 
{ 
    _pinCircle = [MKCircle circleWithCenterCoordinate:coord radius:_radius.value*1000]; 
    [_mapView addOverlay:_pinCircle]; 
    [_pinCircle autorelease]; 
} 
+0

嗨,非常感谢你。你的回答给我多次我不能处理的错误。我发布了他们上面 – Eric 2014-09-04 18:24:33

+0

这通常是正确的想法,但我认为你可能已经以不同和令人困惑的方式使用OP的现有变量名称。例如,问题中的_radius是UISlider本身。另一个潜在的问题是在内存管理和引用pinCircle/_pinCircle(self.pinCircle将是首选)。指出应该使用新的rendererForOverlay委托方法以及切换到ARC也很好。 – Anna 2014-09-04 18:26:37

+0

我使用相同的后置符号。当然,最好使用私有或属性变量,并将ARC用于内存管理。这仅仅是作者的喜好。 :) – 2014-09-04 18:29:31

1

您需要在更改滑块值后删除先前添加的叠加层。

- (IBAction)sliderForJixRadiusValueChanged:(id)sender { 
    // self.mapSelectorManager.circleRadius = self.sliderForJixRadius.value; 

     [_mapView removeOverlays:arrOverlay]; 

     MKCircle *circle= [MKCircle circleWithCenterCoordinate:_droppedAt1 radius: (_sliderForJixRadius.value)*10000]; 
     [_mapView addOverlay:circle]; 
     [arrOverlay addObject:circle];