chris judd - intro to mapkit
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: [email protected]: www.juddsolutions.comblog: juddsolutions.blogspot.comtwitter: javajudd
Christopher M. Judd
Wednesday, April 27, 2011