summaryrefslogtreecommitdiff
path: root/platform/ios/demo/Examples/ObjectiveC/AnnotationViewMultipleExample.m
blob: ee6622fd4e701691cf36cfa4816d54834b7fdd51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#import "AnnotationViewMultipleExample.h"
@import Mapbox;

NSString *const MBXExampleAnnotationViewMultiple = @"AnnotationViewMultipleExample";

// MGLPointAnnotation subclass
@interface MyCustomPointAnnotation : MGLPointAnnotation
@property (nonatomic, assign) BOOL willUseImage;
@end

@implementation MyCustomPointAnnotation
@end
// end MGLPointAnnotation subclass

@interface AnnotationViewMultipleExample () <MGLMapViewDelegate>
@end

@implementation AnnotationViewMultipleExample

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // Create a new map view using the Mapbox Light style.
    MGLMapView *mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds
        styleURL:[MGLStyle lightStyleURLWithVersion:9]];
    
    mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    
    // Set the map's center coordinate and zoom level.
    mapView.centerCoordinate = CLLocationCoordinate2DMake(36.54,-116.97);
    mapView.zoomLevel = 9;
    mapView.delegate = self;
    [self.view addSubview:mapView];
    
    // Create four new point annotations with specified coordinates and titles.
    MyCustomPointAnnotation *pointA = [[MyCustomPointAnnotation alloc] init];
    pointA.title = @"Stovepipe Wells";
    pointA.coordinate = CLLocationCoordinate2DMake(36.4623,-116.8656);
    pointA.willUseImage = YES;
    
    MyCustomPointAnnotation *pointB = [[MyCustomPointAnnotation alloc] init];
    pointB.title = @"Furnace Creek";
    pointB.coordinate = CLLocationCoordinate2DMake(36.6071,-117.1458);
    pointB.willUseImage = YES;
    
    MyCustomPointAnnotation *pointC = [[MyCustomPointAnnotation alloc] init];
    pointC.title = @"Zabriskie Point";
    pointC.coordinate = CLLocationCoordinate2DMake(36.4208,-116.8101);
    
    MyCustomPointAnnotation *pointD = [[MyCustomPointAnnotation alloc] init];
    pointD.title = @"Mesquite Flat Sand Dunes";
    pointD.coordinate = CLLocationCoordinate2DMake(36.6836,-117.1005);
    
    // Fill an array with four point annotations.
    NSArray *myPlaces = @[pointA, pointB, pointC, pointD];
    
    // Add all annotations to the map all at once, instead of individually.
    [mapView addAnnotations:myPlaces];
}

// This delegate method is where you tell the map to load a view for a specific annotation based on the willUseImage property of the custom subclass.
- (MGLAnnotationView *)mapView:(MGLMapView *)mapView viewForAnnotation:(id <MGLAnnotation>)annotation {
    if ([annotation isKindOfClass:[MyCustomPointAnnotation class]]) {
        MyCustomPointAnnotation *castAnnotation = (MyCustomPointAnnotation *)annotation;
        
        if (castAnnotation.willUseImage) {
            return nil;
        }
    }
    
    // Assign a reuse identifier to be used by both of the annotation views, taking advantage of their similarities.
    NSString *reuseIdentifier = @"reusableDotView";
    
    // For better performance, always try to reuse existing annotations.
    MGLAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
    
    // If there’s no reusable annotation view available, initialize a new one.
    if (!annotationView) {
        annotationView = [[MGLAnnotationView alloc] initWithReuseIdentifier:reuseIdentifier];
        annotationView.frame = CGRectMake(0, 0, 30, 30);
        annotationView.layer.cornerRadius = annotationView.frame.size.width / 2;
        annotationView.layer.borderColor = [UIColor whiteColor].CGColor;
        annotationView.layer.borderWidth = 4.0;
        annotationView.backgroundColor = [UIColor colorWithRed:0.03 green:0.80 blue:0.69 alpha:1.0];
    }
    
    return annotationView;
}

// This delegate method is where you tell the map to load an image for a specific annotation based on the willUseImage property of the custom subclass.
- (MGLAnnotationImage *)mapView:(MGLMapView *)mapView imageForAnnotation:(id <MGLAnnotation>)annotation {

    if ([annotation isKindOfClass:[MyCustomPointAnnotation class]]) {
        MyCustomPointAnnotation *castAnnotation = (MyCustomPointAnnotation *)annotation;
        
        if (!castAnnotation.willUseImage) {
            return nil;
        }
    }
    
    // For better performance, always try to reuse existing annotations.
    MGLAnnotationImage *annotationImage = [mapView dequeueReusableAnnotationImageWithIdentifier:@"camera"];
    
    // If there is no reusable annotation image available, initialize a new one.
    if (!annotationImage) {
        UIImage *image = [UIImage imageNamed:@"camera"];
        image = [image imageWithAlignmentRectInsets:UIEdgeInsetsMake(0, 0, image.size.height/2, 0)];
        annotationImage = [MGLAnnotationImage annotationImageWithImage:image reuseIdentifier:@"camera"];
    }
    
    return annotationImage;
}

- (BOOL)mapView:(MGLMapView *)mapView annotationCanShowCallout:(id<MGLAnnotation>)annotation {
    // Always allow callouts to popup when annotations are tapped.
    return YES;
}

@end