Chris Judd - Intro to MapKit

57
Christopher M. Judd Introduction to MapKit Wednesday, April 27, 2011

Transcript of Chris Judd - Intro to MapKit

Page 1: Chris Judd - Intro to MapKit

Christopher M. Judd

Introduction to MapKit

Wednesday, April 27, 2011

Page 2: Chris Judd - Intro to MapKit

Christopher M. JuddPresident/Consultant of

leader

Columbus Developer User Group (CIDUG)

Wednesday, April 27, 2011

Page 3: Chris Judd - Intro to MapKit

Remarkable Ohio

Free

Developed for eTech Ohio and Ohio Historical CenterWednesday, April 27, 2011

Page 4: Chris Judd - Intro to MapKit

University System Of Ohio

FreeDeveloped for eTech Ohio and University System Of Ohio

Wednesday, April 27, 2011

Page 5: Chris Judd - Intro to MapKit

Your mobile phone has more computing power than all of NASA in 1969. NASA launched a man to the moon.

Wednesday, April 27, 2011

Page 6: Chris Judd - Intro to MapKit

We launch a bird into pigs.twitter

Wednesday, April 27, 2011

Page 7: Chris Judd - Intro to MapKit

MapKit Basics

Wednesday, April 27, 2011

Page 8: Chris Judd - Intro to MapKit

MapKit

MKMapView

Wednesday, April 27, 2011

Page 9: Chris Judd - Intro to MapKit

Current Location

Core Location FrameworkWednesday, April 27, 2011

Page 10: Chris Judd - Intro to MapKit

Current Location

Core Location FrameworkWednesday, April 27, 2011

Page 11: Chris Judd - Intro to MapKit

Current Location

Core Location FrameworkWednesday, April 27, 2011

Page 12: Chris Judd - Intro to MapKit

Current Location

Core Location FrameworkWednesday, April 27, 2011

Page 13: Chris Judd - Intro to MapKit

1 kilometer

Current Location

Core Location FrameworkWednesday, April 27, 2011

Page 14: Chris Judd - Intro to MapKit

1 kilometer

Current Location

Core Location Framework

100 meters

Wednesday, April 27, 2011

Page 15: Chris Judd - Intro to MapKit

1 kilometer

10 meters

Current Location

Core Location Framework

100 meters

Wednesday, April 27, 2011

Page 16: Chris Judd - Intro to MapKit

Map Types

Wednesday, April 27, 2011

Page 17: Chris Judd - Intro to MapKit

Map Types

StandardWednesday, April 27, 2011

Page 18: Chris Judd - Intro to MapKit

Map Types

Standard SatelliteWednesday, April 27, 2011

Page 19: Chris Judd - Intro to MapKit

Map Types

Standard Satellite HybridWednesday, April 27, 2011

Page 20: Chris Judd - Intro to MapKit

Annotations

Wednesday, April 27, 2011

Page 21: Chris Judd - Intro to MapKit

Classes and Protocols

Wednesday, April 27, 2011

Page 22: Chris Judd - Intro to MapKit

Adding Maps

Wednesday, April 27, 2011

Page 23: Chris Judd - Intro to MapKit

1. Add MapView component to view2. Add MapKit Framework to target libraries3. Run Application

Adding Maps Steps

Wednesday, April 27, 2011

Page 24: Chris Judd - Intro to MapKit

Add Map View Component

Wednesday, April 27, 2011

Page 25: Chris Judd - Intro to MapKit

Add MapKit Framework

Wednesday, April 27, 2011

Page 26: Chris Judd - Intro to MapKit

Run Application

Wednesday, April 27, 2011

Page 27: Chris Judd - Intro to MapKit

Display Current Location

Wednesday, April 27, 2011

Page 28: Chris Judd - Intro to MapKit

Show User Location

Wednesday, April 27, 2011

Page 29: Chris Judd - Intro to MapKit

Simulator Location

Wednesday, April 27, 2011

Page 30: Chris Judd - Intro to MapKit

iSimulate

$15.99 in App StoreWednesday, April 27, 2011

Page 31: Chris Judd - Intro to MapKit

Change Map Types

Wednesday, April 27, 2011

Page 32: Chris Judd - Intro to MapKit

Map

Satellite

HybridWednesday, April 27, 2011

Page 33: Chris Judd - Intro to MapKit

switch (((UISegmentedControl *)sender).selectedSegmentIndex) { case 0: { mapView.mapType = MKMapTypeStandard; break; } case 1: { mapView.mapType = MKMapTypeSatellite; break; } default: { mapView.mapType = MKMapTypeHybrid; break; } }

Map

Satellite

Hybrid

Wednesday, April 27, 2011

Page 34: Chris Judd - Intro to MapKit

Adding Annotations

Wednesday, April 27, 2011

Page 35: Chris Judd - Intro to MapKit

@interface HistoryMarker : NSObject <MKAnnotation> { CLLocationCoordinate2D _coordinate;}

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate;

@end

@implementation HistoryMarker

@synthesize coordinate = _coordinate;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate { if((self = [super init])) { _coordinate = coordinate; } return self;}

@end

Basic Custom AnnotationHistoryMarker.h

HistoryMarker.m

Extend MKAnnotation

Implement required coordinate property

Wednesday, April 27, 2011

Page 36: Chris Judd - Intro to MapKit

- (void)viewDidLoad { [super viewDidLoad]; CLLocationCoordinate2D coordinate = {39.960307, -82.98685}; HistoryMarker* marker = [[HistoryMarker alloc] initWithCoordinate:coordinate]; [_mapView addAnnotation:marker];}

Add Annotation*Controller.m

Wednesday, April 27, 2011

Page 37: Chris Judd - Intro to MapKit

Positioning Map

Wednesday, April 27, 2011

Page 38: Chris Judd - Intro to MapKit

Multiple Pins Can be hard to see from far away

Applications with a geographical focus should frame the region

Wednesday, April 27, 2011

Page 39: Chris Judd - Intro to MapKit

Zooming

- (IBAction)zoomCurrentLocation:(id)sender { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(

_mapView.userLocation.location.coordinate, 500, 500); [_mapView setRegion:region animated:TRUE];}

- (IBAction)zoomColumbus:(id)sender { CLLocationCoordinate2D columbusCenterCoordinate = {39.971793, -82.983396}; MKCoordinateSpan span = MKCoordinateSpanMake( 0.390456, 0.390456); MKCoordinateRegion region = MKCoordinateRegionMake(columbusCenterCoordinate, span); [_mapView setRegion:region animated:TRUE];}

Wednesday, April 27, 2011

Page 40: Chris Judd - Intro to MapKit

Decorating Annotations

Wednesday, April 27, 2011

Page 41: Chris Judd - Intro to MapKit

Changing Annotation Appearance

@interface ColumbusHistoryMapViewController : UIViewController <MKMapViewDelegate> { IBOutlet MKMapView* _mapView;}

@property (nonatomic, retain) MKMapView* mapView;

@end

*Controller.h

@implementation ColumbusHistoryMapViewController- (void)viewDidLoad {

[super viewDidLoad];_mapView.delegate = self;

// Details removed for brevity}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if(annotation == mapView.userLocation) { return nil; }

// Details removed for brevity

return annotationView;}

// Details removed for brevity

@end

*Controller.m

Implement MKMapViewDelegate protocol

Assign delegate

Implement viewForAnnotation

Returning nil will perform default behavior

Wednesday, April 27, 2011

Page 42: Chris Judd - Intro to MapKit

Coloring Pins

MKPinAnnotationColorPurple

MKPinAnnotationColorGreenMKPinAnnotationColorRed

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if(annotation == mapView.userLocation) { return nil; } MKPinAnnotationView *annotationView = nil; annotationView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"historyMarker"]; if(nil == annotationView) { annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"historyMarker"]; } annotationView.pinColor = MKPinAnnotationColorPurple; return annotationView;}

Limited to 3 colors

Wednesday, April 27, 2011

Page 43: Chris Judd - Intro to MapKit

Annotation Images- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if(annotation == mapView.userLocation) { return nil; } MKAnnotationView *annotationView = nil; annotationView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"historyMarker"]; if(nil == annotationView) { annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"historyMarker"]; } annotationView.image = [UIImage imageNamed:@"history.png"]; return annotationView;}

Wednesday, April 27, 2011

Page 44: Chris Judd - Intro to MapKit

http://code.google.com/p/google-maps-icons/

Free Map Icons

Wednesday, April 27, 2011

Page 45: Chris Judd - Intro to MapKit

Be CreativeWednesday, April 27, 2011

Page 46: Chris Judd - Intro to MapKit

Callouts

Wednesday, April 27, 2011

Page 47: Chris Judd - Intro to MapKit

Enable Callouts- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if(annotation == mapView.userLocation) { return nil; } MKAnnotationView *annotationView = nil; annotationView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"historyMarker"]; if(nil == annotationView) { annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"historyMarker"]; } annotationView.image = [UIImage imageNamed:@"history.png"]; annotationView.canShowCallout = YES; return annotationView;}

@implementation HistoryMarker

- (NSString *)title { return _name;}

- (NSString *)subtitle { return [NSString stringWithFormat:@"%f, %f", _coordinate.latitude, _coordinate.longitude];}

@end

Set canShowCallout

Implement title and optionally subtitle on

MKAnnotation Implementation

Wednesday, April 27, 2011

Page 48: Chris Judd - Intro to MapKit

Add Behavior to Callouts- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if(annotation == mapView.userLocation) { return nil; } MKAnnotationView *annotationView = nil; annotationView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"historyMarker"]; if(nil == annotationView) { annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"historyMarker"]; } annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; annotationView.image = [UIImage imageNamed:@"history.png"]; annotationView.canShowCallout = YES; return annotationView;}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

HistoryMarker* historyMarker = (HistoryMarker*)view.annotation; NSLog(@"Historical Marker %@ was selected.", historyMarker.name); //Could open a detail view, navigate to a website, call, etc.

}

Implement calloutAccessoryControlTapped

Wednesday, April 27, 2011

Page 49: Chris Judd - Intro to MapKit

Directions

Wednesday, April 27, 2011

Page 50: Chris Judd - Intro to MapKit

http://mapki.com/index.php?title=Google_Map_Parameters

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

HistoryMarker* historyMarker = (HistoryMarker*)view.annotation; NSString* url = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%f,%f&saddr=%f,%f", historyMarker.coordinate.latitude, historyMarker.coordinate.longitude, _mapView.userLocation.location.coordinate.latitude,

_mapView.userLocation.location.coordinate.longitude]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; }

Wednesday, April 27, 2011

Page 51: Chris Judd - Intro to MapKit

Alternatives

Wednesday, April 27, 2011

Page 52: Chris Judd - Intro to MapKit

http://code.google.com/p/route-me/

New Free BSD

Wednesday, April 27, 2011

Page 53: Chris Judd - Intro to MapKit

http://developers.cloudmade.com/projects/show/iphone-apiWednesday, April 27, 2011

Page 54: Chris Judd - Intro to MapKit

Wednesday, April 27, 2011

Page 55: Chris Judd - Intro to MapKit

Resources

The Objective-C Programming Language

Wednesday, April 27, 2011

Page 56: Chris Judd - Intro to MapKit

Columbus History Map Source

https://github.com/cjudd/ColumbusHistoryMap_iOSWednesday, April 27, 2011

Page 57: Chris Judd - Intro to MapKit

President/Consultant/Authoremail: [email protected]: www.juddsolutions.comblog: juddsolutions.blogspot.comtwitter: javajudd

Christopher M. Judd

Wednesday, April 27, 2011