2016-09-30 139 views
1

有什么方法可以更改标记群集中的默认标记图标吗?iOS中的标记群集中的自定义标记图标

这里是我的代码...

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Set up the cluster manager with a supplied icon generator and renderer. 
    id<GMUClusterAlgorithm> algorithm = [[GMUNonHierarchicalDistanceBasedAlgorithm alloc] init]; 
    id<GMUClusterIconGenerator> iconGenerator = [[GMUDefaultClusterIconGenerator alloc] init]; 
    id<GMUClusterRenderer> renderer = [[GMUDefaultClusterRenderer alloc] initWithMapView:googleMapView 
                    clusterIconGenerator:iconGenerator]; 
    clusterManager = [[GMUClusterManager alloc] initWithMap:googleMapView 
                algorithm:algorithm 
                renderer:renderer]; 

    // Register self to listen to both GMUClusterManagerDelegate and 
    // GMSMapViewDelegate events. 
    [clusterManager setDelegate:self mapDelegate:self]; 

} 

- (void)loadView { 
    // Create a GMSCameraPosition that tells the map to display the 
    _camera = [GMSCameraPosition cameraWithLatitude:29.3117 
              longitude:47.4818 
               zoom:8]; 
    googleMapView = [GMSMapView mapWithFrame:CGRectZero camera:_camera]; 
    googleMapView.myLocationEnabled = YES; 
    googleMapView.settings.compassButton = YES; 
    googleMapView.settings.myLocationButton = YES; 
    googleMapView.delegate = self; 

    self.view = googleMapView; 
} 

-(void)setLocation:(CLLocation *)location 
{ 
    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude); 
    [googleMapView animateToLocation:center]; 
    [googleMapView animateToZoom:12]; 

    NSMutableArray *array = [NSMutableArray arrayWithObjects: 
          @"29.0827,48.1363", 
          @"29.2679,47.9927", 
          @"29.348706, 48.092425", 
          @"29.340925, 48.088477", 
          @"29.324912, 48.089850", 
          @"29.330599, 47.990630", 
          @"29.300364, 47.960589", 
          @"29.271917, 47.918017", 
          @"29.3032,47.936", nil]; 

    //remove all clusters before adding clusters 
    [clusterManager clearItems]; 

    for (int i = 0; i < [array count]; i++) 
    { 
     center = CLLocationCoordinate2DMake ([[array[i] componentsSeparatedByString:@","][0] floatValue], [[array[i] componentsSeparatedByString:@","][1] floatValue]); 

     // Add items to the cluster manager. 
     NSString *name = nil;//[NSString stringWithFormat:@"Item %d", i]; 
     id<GMUClusterItem> item =[[POIItem alloc] initWithPosition:center 
                   name:name]; 
     [clusterManager addItem:item]; 
    } 
    // Call cluster() after items have been added 
    // to perform the clustering and rendering on map. 
    [clusterManager cluster]; 
} 

请指引我...

+0

如果你有一个版本> 1.1.0 [在这里看到我的回答(https://stackoverflow.com/a/47560077/5792077) – Gerardo

+0

如果你有一个版本> 1.1.0 [请看我的答案](https://stackoverflow.com/a/47560077/5792077) – Gerardo

回答

1

我看到你使用谷歌 - 地图 - IOS-utils的。问题是没有改变标记图标的API。您只能直接在库的代码中执行此操作。我已将自定义代码粘贴到方法中

- (GMSMarker *)markerWithPosition:(CLLocationCoordinate2D)position 
         from:(CLLocationCoordinate2D)from 
        userData:(id)userData 
        clusterIcon:(UIImage *)clusterIcon 
        animated:(BOOL)animated{ 
//... 
    if (clusterIcon != nil) { 
     marker.icon = clusterIcon; 
     marker.groundAnchor = CGPointMake(0.5, 0.5); 
    } else { 
    if([[marker.userData class] isSubclassOfClass:[POIItem class]]){ 
     POIItem *item = (POIItem *)marker.userData; 
     MarkerIcon* markerView = (MarkerIcon *)[[NSBundle mainBundle] loadNibNamed:@"MarkerIcon" owner:marker options:nil][0]; 
     marker.iconView = markerView; 
     marker.groundAnchor = CGPointMake(0.5, 0.5); 
    } 
    } 
} 

这不是一种更好的方式来更改代码。但那一刻我找不到更好的解决方案。

+0

感谢您的解决方案,但方法会骑在我刷新我的pod文件时。 –

+0

我手动添加了这个库,因为我无法通过Cocoapods进行安装。 (它与use_framework指令冲突)。所以我定制了很多。但是,做这样的事情并直接更改源代码当然不是最佳做法。 – Marina

+0

@Marina,我可以使用上面的代码为基于类别的单个标记设置不同的图标吗? –

1

我已经解决了这个问题。

我用googleMaps Api版本:8.1。

这里是我的代码...

#import "Clustering/GMUClusterItem.h" 

// Point of Interest Item which implements the GMUClusterItem protocol. 
@interface POIItem : NSObject<GMUClusterItem> 

@property(nonatomic, readonly) CLLocationCoordinate2D position; 
@property(nonatomic, readonly) NSString *name; 

- (instancetype)initWithPosition:(CLLocationCoordinate2D)position name:(NSString *)name; 

@end 

1.creat地图。

@interface BasicViewController()<GMUClusterManagerDelegate, GMSMapViewDelegate, 
            GMUClusterRendererDelegate> 
@end 

typedef NS_ENUM(NSInteger, ClusterAlgorithmMode) { 
    kClusterAlgorithmGridBased, 
    kClusterAlgorithmQuadTreeBased, 
}; 

@implementation BasicViewController { 
    GMSMapView *_mapView; 
    GMUClusterManager *_clusterManager; 
} 

- (void)loadView { 

    //创建地图 
    GMSCameraPosition *camera = 
     [GMSCameraPosition cameraWithLatitude:kCameraLatitude longitude:kCameraLongitude zoom:10]; 

    _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; 

    self.view = _mapView; 
} 

2.creat GMUClusterManager对象。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //添加标注算法方式 
    id<GMUClusterAlgorithm> algorithm = [self algorithmForMode:kClusterAlgorithmQuadTreeBased]; 

    //标注icon 
    id<GMUClusterIconGenerator> iconGenerator = [self iconGeneratorWithImages];//[self defaultIconGenerator]; 

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

    GMUDefaultClusterRenderer *renderer = 
     [[GMUDefaultClusterRenderer alloc] initWithMapView:_mapView 
            clusterIconGenerator:iconGenerator]; 
    renderer.delegate = self; 

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

    // Generate and add random items to the cluster manager. 
    //将标注添加到地图上 
    [self generateClusterItems]; 

    // Call cluster() after items have been added to perform the clustering and rendering on map. 
    //展示 
    [_clusterManager cluster]; 

    // Register self to listen to both GMUClusterManagerDelegate and GMSMapViewDelegate events. 
    [_clusterManager setDelegate:self mapDelegate:self]; 

    UIBarButtonItem *removeButton = 
     [[UIBarButtonItem alloc] initWithTitle:@"Remove" 
             style:UIBarButtonItemStylePlain 
             target:self 
             action:@selector(removeClusterManager)]; 
    self.navigationItem.rightBarButtonItems = @[ removeButton ]; 
} 

3.in方法:

/*You can set marker image here 

if [marker class] is POIItem. 

*/ 

- (void)renderer:(id<GMUClusterRenderer>)renderer willRenderMarker:(GMSMarker *)marker { 

    if ([marker.userData isKindOfClass:[POIItem class]]) { 

    POIItem *item = marker.userData; 

    marker.title = item.name; 

    ******marker.icon = [UIImage imageNamed:@"register"];****** 

    } 
} 
+1

我很抱歉。我的google地图版本是:2.1.1 –