2014-02-20 6 views
4

Мне интересно, есть ли способ изменить цвет или изображение выбранного маркера, а затем изменить его, когда он больше не выбран. Я вижу, что Yelp, который использует Apple Maps, изменяет цвет/изображение выбранного маркера, а затем возвращается к оригиналу, как только он больше не выбран, и задавался вопросом, было ли у SDK Google Map iOS что-то подобное или кто-то столкнулся эта проблема и нашли решение.Изменить выбранный маркер Карты Google или изменить цвет маркера? [iOS]

То, что я пробовал:

Я просмотрел документацию Google на маркеры (found here) и вижу, что у них есть marker.opacity, который изменяет непрозрачность и marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];, которая меняет цвет маркеров.

Я попытался вручную изменить его в -(UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker;, добавив следующую строку marker.icon = [GMSMarker markerImageWithColor: [UIColor differentColor]]; или эту строку marker.icon = [UIImage imageNamed:@"differentColorImage"]; но при нажатии из/инфо-окна маркеров, изображение/цвет остается неизменным.

У кого-нибудь есть мысли? Все помогает. Заранее спасибо!

ответ

4

Просто, если кто-нибудь приходит и видит это, я решил эти проблемы, используя свой собственный метод и собственные переменные. Я использовал две глобальные переменные: GMSMarker *selectedMarker и BOOL isMarkerActive. Внутри mapview:markerInfoWindow Я проверяю, активен ли маркер, если это означает, что перед этим один актив был активным, так что не используйте этот маркер. После этого я устанавливаю текущий маркер выбранным маркером, устанавливаем bool в true и затем выделяем этот маркер, как показано ниже.

if(self.isMarkerActive == TRUE){ 
    [self unhighlightMarker:self.selectedMarker]; 
} 
self.selectedMarker = marker; 
self.isMarkerActive = TRUE; 
[self highlightMarker:marker]; 

Внутри метода highlightMarker я проверяю, если послал маркер я послал равно выбранного маркера карты содержат в

-(void)highlightMarker:(GMSMarker *)marker{ 
    if(self.mapView.selectedMarker isEqual:marker]){ 
     marker.icon = [UIImage imageNamed:@"marker-selected-icon"]; 
    } 
} 

Сделайте то же самое в методе unhighlightMarker

-(void)unhighlightMarker:(GMSMarker*)marker{ 
    marker.icon = [UIImage imageNamed:@"marker-icon"]; 
} 

Наконец, я проверьте наличие кранов на карте и убедитесь, что значение bool истинно и что выбранный маркер карты не равен nil

- (void)mapView:(GMSMapView *)amapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate{ 
    if(self.isMarkerActive == TRUE){ 
     if(amapView.selectedMarker != nil){ 
      self.isMarkerActive = FALSE; 
      [self unhighlightMarker:self.selectedMarker]; 
      self.selectedMarker = nil; 
      amapView.selectedMarker = nil; 
     } 
    } 
} 

Надеюсь, это поможет кому-то еще.

+1

Это блестящее решение. Спасибо. –

+0

Используя этот метод, мы можем выделить и выделить не более одного маркера? Предположим, у меня есть 5 маркеров, и я выбрал 3 из них, теперь я хочу, чтобы какой-либо из них был возможен, если это возможно? – Aneesh

+0

@ Анешь, ты должен уметь. Нужно немного обновить логику, но я не понимаю, почему нет. Я бы сделал массив с маркерами. Использование, которое позволяет перебирать список маркеров и отмечать те, что указаны в списке. – Chris

6

Чтобы изменить иконку маркера, выбранного и не выбрали, что я сделал, было, Сначала я добавить все GMSMarker в array.After, что внутри функции делегата didTapMarker: Я был выбран маркер и изменить значок этого маркера

 - (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker 
     { 
     marker.icon=[UIImage imageNamed:@"selectedicon.png"];//selected marker 

      for (int i=0; i<[markerArray count]; i++) 
      { 
      GMSMarker *unselectedMarker=markerArray[i]; 
     //check selected marker and unselected marker position 
      if(unselectedMarker.position.latitude!=marker.position.latitude && unselectedMarker.position.longitude!=marker.position.longitude) 
      { 
       unselectedMarker.icon=[UIImage imageNamed:@"unselectedicon.png"]; 
      } 
      } 


     return NO; 
     } 

Это работает для меня.

Смежные вопросы