2016-09-30 137 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 –