2014-09-04 28 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];