Chris Judd - Intro to MapKit

Post on 27-Mar-2015

387 views 0 download

transcript

Christopher M. Judd

Introduction to MapKit

Wednesday, April 27, 2011

Christopher M. JuddPresident/Consultant of

leader

Columbus Developer User Group (CIDUG)

Wednesday, April 27, 2011

Remarkable Ohio

Free

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

University System Of Ohio

FreeDeveloped for eTech Ohio and University System Of Ohio

Wednesday, April 27, 2011

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

Wednesday, April 27, 2011

We launch a bird into pigs.twitter

Wednesday, April 27, 2011

MapKit Basics

Wednesday, April 27, 2011

MapKit

MKMapView

Wednesday, April 27, 2011

Current Location

Core Location FrameworkWednesday, April 27, 2011

Current Location

Core Location FrameworkWednesday, April 27, 2011

Current Location

Core Location FrameworkWednesday, April 27, 2011

Current Location

Core Location FrameworkWednesday, April 27, 2011

1 kilometer

Current Location

Core Location FrameworkWednesday, April 27, 2011

1 kilometer

Current Location

Core Location Framework

100 meters

Wednesday, April 27, 2011

1 kilometer

10 meters

Current Location

Core Location Framework

100 meters

Wednesday, April 27, 2011

Map Types

Wednesday, April 27, 2011

Map Types

StandardWednesday, April 27, 2011

Map Types

Standard SatelliteWednesday, April 27, 2011

Map Types

Standard Satellite HybridWednesday, April 27, 2011

Annotations

Wednesday, April 27, 2011

Classes and Protocols

Wednesday, April 27, 2011

Adding Maps

Wednesday, April 27, 2011

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

Adding Maps Steps

Wednesday, April 27, 2011

Add Map View Component

Wednesday, April 27, 2011

Add MapKit Framework

Wednesday, April 27, 2011

Run Application

Wednesday, April 27, 2011

Display Current Location

Wednesday, April 27, 2011

Show User Location

Wednesday, April 27, 2011

Simulator Location

Wednesday, April 27, 2011

iSimulate

$15.99 in App StoreWednesday, April 27, 2011

Change Map Types

Wednesday, April 27, 2011

Map

Satellite

HybridWednesday, April 27, 2011

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

Adding Annotations

Wednesday, April 27, 2011

@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

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

Positioning Map

Wednesday, April 27, 2011

Multiple Pins Can be hard to see from far away

Applications with a geographical focus should frame the region

Wednesday, April 27, 2011

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

Decorating Annotations

Wednesday, April 27, 2011

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

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

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

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

Free Map Icons

Wednesday, April 27, 2011

Be CreativeWednesday, April 27, 2011

Callouts

Wednesday, April 27, 2011

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

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

Directions

Wednesday, April 27, 2011

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

Alternatives

Wednesday, April 27, 2011

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

New Free BSD

Wednesday, April 27, 2011

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

Wednesday, April 27, 2011

Resources

The Objective-C Programming Language

Wednesday, April 27, 2011

Columbus History Map Source

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

President/Consultant/Authoremail: cjudd@juddsolutions.comweb: www.juddsolutions.comblog: juddsolutions.blogspot.comtwitter: javajudd

Christopher M. Judd

Wednesday, April 27, 2011