2016-11-28 6 views
8

Я хочу отобразить пользовательский маркер, используя GMUClusterManager. Я выполнил все шаги для кластеризации маркеров here.Пользовательский маркер с использованием GMUClusterManager

но есть синий и красный цвет. enter image description here

Но когда я увеличиваю карту, на ней отображается только маркер красного цвета, но я этого не хочу.

есть метод экземпляра, где я реализовал свою логику, но не использовал.

- (instancetype)initWithMapView:(GMSMapView *)mapView clusterIconGenerator:(id<GMUClusterIconGenerator>)iconGenerator 
{ 
    if ((self = [super init])) { 

     GMSMarker *marker= [GMSMarker markerWithPosition:CLLocationCoordinate2DMake(24.0, 75.30)]; 

     UIView *customMarker =[[UIView alloc] initWithFrame:CGRectMake(0, 0, 63, 40)]; 
     customMarker.backgroundColor = [UIColor blueColor]; 

     marker.iconView = [self EmployeeMarker:0] ; 
     marker.appearAnimation = kGMSMarkerAnimationPop; 
     marker.map = mapView; 
    } 
    return self; 
} 

-(UIView *)EmployeeMarker:(int)labelTextInt{ 
    UIView *customMarker =[[UIView alloc] initWithFrame:CGRectMake(0, 0, 63, 40)]; 
    UIImageView *imgViewCustomMarker = [[UIImageView alloc]initWithFrame:CGRectMake(0, 15, 24, 25)]; 
    imgViewCustomMarker.image = [UIImage imageNamed:@"iconMapUser.png"]; 
    [customMarker addSubview:imgViewCustomMarker]; 
    UIView *viewRatingCustom = [[UIView alloc] initWithFrame:CGRectMake(15, 0, 40, 15)]; 
    viewRatingCustom.backgroundColor = [UIColor colorWithRed:192.0/255.0 green:192.0/255.0 blue:192.0/255.0 alpha:1.0]; 
    UILabel *lblRatingEmployees = [[UILabel alloc] initWithFrame:CGRectMake(8, 1, 17,8)]; 
    lblRatingEmployees.textColor = [UIColor colorWithRed:0.00/255.0 green:100.0/255.0 blue:150.0/255.0 alpha:1.0]; 
    lblRatingEmployees.text = @"1"; 
    lblRatingEmployees.font = [UIFont fontWithName:@"Helvetica-Bold" size:10]; 
    [lblRatingEmployees sizeToFit]; 
    [viewRatingCustom addSubview:lblRatingEmployees]; 
    UIImageView *imageViewStar = [[UIImageView alloc] initWithFrame:CGRectMake(25, 3, 10, 8)]; 
    imageViewStar.image = [UIImage imageNamed:@"iconBlueStar.png"]; 
    [viewRatingCustom addSubview:imageViewStar]; 
    [customMarker addSubview:viewRatingCustom]; 
    return customMarker; 
} 

Я использовал этот метод для отображения возможного количества маркеров, который по умолчанию является красным.

id<GMUClusterAlgorithm> algorithm = [[GMUNonHierarchicalDistanceBasedAlgorithm alloc] init]; 

id<GMUClusterIconGenerator> iconGenerator = [[GMUDefaultClusterIconGenerator alloc] init]; 


id<GMUClusterRenderer> renderer = 
    [[GMUDefaultClusterRenderer alloc] initWithMapView:_mapView 
           clusterIconGenerator:iconGenerator]; 

_clusterManager = 
    [[GMUClusterManager alloc] initWithMap:_mapView algorithm:algorithm renderer:renderer]; 

// Generate and add random items to the cluster manager. 

// [self generateClusterItems]; 


for (int i = 0; i<latitudeArray.count; i++) { 

    id<GMUClusterItem> item = 

    [[POIItem alloc]initWithPosition:CLLocationCoordinate2DMake([[latitudeArray objectAtIndex:i]doubleValue], [[longitudeArray objectAtIndex:i]doubleValue]) name:@"Name"]; 

    [_clusterManager addItem:item]; 
} 

Adde делегаты, а также кластерный метод.

[_clusterManager cluster]; 
[_clusterManager setDelegate:self mapDelegate:self]; 

Так что, пожалуйста, помогите мне для добавления пользовательских маркеров вместо красного, который находится в состоянии дефолта.

ответ

7

Вам нужно создать пользовательский класс, который соответствует по GMUClusterIconGenerator протоколу:

CustomClusterIconGenerator.h файла

@interface CustomClusterIconGenerator : NSObject 
<GMUClusterIconGenerator> 

@end 

CustomClusterIconGenerator.m файла

@implementation CustomClusterIconGenerator 

- (UIImage *)iconForSize:(NSUInteger)size { 
    // Return custom icon for cluster 
    return [UIImage imageNamed:@"Your Custom Cluster Image"]; 
} 

- (UIImage *)iconForMarker { 
    // Return custom icon for pin 
    return [UIImage imageNamed:@"Your Custom Marker Image"]; 
} 

- (CGPoint)markerIconGroundAnchor { 
    // If your marker icon center shifted, return custom value for anchor 
    return CGPointMake(0, 0); 
} 

- (CGPoint)clusterIconGroundAnchor { 
    // If your cluster icon center shifted, return custom value for anchor 
    return CGPointMake(0, 0); 
} 

@end 

, а затем то, вместо того,

id<GMUClusterIconGenerator> iconGenerator = [[GMUDefaultClusterIconGenerator alloc] init]; 

использование

CustomClusterIconGenerator *iconGenerator = [[GMUDefaultClusterIconGenerator alloc] init]; 

Вот пример из моего проекта: enter image description here

+0

CustomClusterIconGenerator iconGenerator = [[GMUDefaultClusterIconGenerator Alloc] инициализации]; в этом месте есть погрешность. –

+0

iconForMarker не работает .. как clusterd маркер работает с использованием этого кода - (UIImage *) iconForSize: (NSUInteger) размер –

+0

@MadBurea извините, была опечатка. Должен быть 'CustomClusterIconGenerator * iconGenerator'. Я обновил ответ. –

3

Вы можете проверить учебник - Marker Clustering with Google's Utility library for Maps SDK (Google-Maps-iOS-Utils), это настоящий идеальный образец на вещи, которые вы хотите реализовать на вашем приложение. Также есть sample codes от blog, которые вы можете попробовать. Наконец, в github сообщалось о проблеме Way to customize individual markers added to cluster manager?, это может помочь вам понять, как настроить маркеры в GMUClusterManager. Надеюсь это поможет.

+0

. Не используйте все ссылки, которые я пробовал все ранее. –

1

Начиная с версии 1.1.0 были добавлены новые функции для легкой настройки маркеров (read more).

Вы можете добавить GMUClusterRendererDelegate и GMUDefaultClusterRenderer.h и добавить метод - (void)renderer:(id<GMUClusterRenderer>)renderer willRenderMarker:(GMSMarker *)marker;

Там вы можете настроить свои маркеры и кластеры.Например:

- (void)renderer:(id<GMUClusterRenderer>)renderer willRenderMarker:(GMSMarker *)marker{ 
    if ([marker.userData conformsToProtocol:@protocol(GMUCluster)]) { 
     marker.icon=[UIImage imageNamed:@"custom_cluster_image.png"]; 
    }else if ([marker.userData conformsToProtocol:@protocol(GMUClusterItem)]) { 
     marker.icon=[UIImage imageNamed:@"custom_marker_image.png"]; 
    } 
} 

Не забудьте установить делегат правильно:

id<GMUClusterRenderer> renderer = [[GMUDefaultClusterRenderer alloc] initWithMapView:_mapView clusterIconGenerator:iconGenerator]; 
((GMUDefaultClusterRenderer *)renderer).delegate=self;