自定义标记使用GMUClusterManager

我想使用GMUClusterManager显示自定义标记。 我在这里遵循了标记聚类的所有步骤。

但是有这样的蓝色和红色的图标。 在这里输入图像说明

但是,当我放大那个地图时,它只显示红色的标记,但我不想那样。

有实例方法,我已经实现了我的逻辑,但没有用。

  - (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]; 

所以请帮助我添加自定义标记,而不是默认的红色。

您需要创build符合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]; 

这是我的项目的例子: 在这里输入图像说明

您可能需要查看教程 – 使用Google的Maps SDK实用程序库(Google-Maps-iOS-Utils)的Marker Clustering ,这是您要在应用程序上实现的一个完美示例。 您也可以尝试使用博客中的Google 示例代码 。 最后github报道了一个关于如何自定义添加到集群pipe理器的标记的问题? ,它可能会帮助您了解如何自定义GMUClusterManager中的标记。 希望这可以帮助。

从版本1.1.0开始,添加了新function,以便轻松定制标记(请参阅更多信息 )。

您可以添加GMUClusterRendererDelegateGMUDefaultClusterRenderer.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;