IPhone рдХреЗ рд▓рд┐рдП рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦреЗ, рдЬрд┐рд╕рдореЗрдВ рдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдк рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рдмрд╣реБрдд рд╣реА рд╢рд╛рдВрдд, рд╕реВрдЪрдирд╛рддреНрдордХ рдФрд░ рджреГрд╢реНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдорд╛рд░реНрдЧреЛрдВ рдХреА рдХрдореА рд╣реИред
рдиреАрдЪреЗ рдореИрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред
рджреЛ рджрд░реНрд╢рди
IOS SDK рдХреЗ рдореЗрд░реЗ рдЬреНрдЮрд╛рди рдиреЗ рдореБрдЭреЗ 2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рдУрд░ рдЕрдЧреНрд░рд╕рд░ рдХрд┐рдпрд╛:
- рдкрд░рд┐рд╕рд░ред MKOverlayView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдЖрд╕рд╛рдиред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдореИрдкреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕реНрд░реЛрдд рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рднреА рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рднреА рдореЛрдбрд╝ рдкрд░ рдЭреВрда рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рдмрд┐рдВрджреБ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЗрд╕рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗрдЧреАред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ MapKit.framework рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ UIViewController рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ UINavigationController рдХреЗ рдвреЗрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ MKMapView рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрди рдФрд░ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдордВрдЬрд┐рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддреЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрд░рдо рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдо рдЧрдВрддрд╡реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдирд╛рдо рдФрд░ рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдЗрд╕ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рдмрдЯрди "рд░реВрдЯ", рдЬреЛ рдпреВрдирд╛рд╡реАрдЧреЗрд╢рдирдмрд╛рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
@interface RouteController : UIViewController <MKMapViewDelegate, MKReverseGeocoderDelegate> {
MKPointAnnotation * _pointAnnotaion;
NSString * _selfAddress;
}
- ( id ) initWithPlaceCoordinate : ( CLLocationCoordinate2D ) coorinate
placeName : ( NSString * ) name
placeAddress : ( NSString * ) address;
@end
@implementation RouteController
- ( id ) initWithPlaceCoordinate : ( CLLocationCoordinate2D ) coorinate placeName : ( NSString * ) name placeAddress : ( NSString * ) address {
self = [ super init ] ;
if ( self ) {
self.navigationItem.rightBarButtonItem = [ [ [ UIBarButtonItem alloc ] initWithTitle : @ ""
style : UIBarButtonItemStyleBordered
target : self
action : @selector ( routeAction ) ]
autorelease ] ;
self.navigationItem.rightBarButtonItem.enabled = NO ;
_pointAnnotaion = [ MKPointAnnotation new ] ;
_pointAnnotaion.title = name;
_pointAnnotaion.subtitle = address;
_pointAnnotaion.coordinate = coorinate;
}
return self;
}
- ( void ) dealloc {
[ _pointAnnotaion release ] ;
[ _selfAddress release ] ;
[ super dealloc ] ;
}
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдмрд┐рдирд╛ xib рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ self.view рдПрдХ MKMapView рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред
- ( void ) loadView {
MKMapView * mapView = [ [ [ MKMapView alloc ] initWithFrame : [ UIScreen mainScreen ] .bounds ] autorelease ] ;
mapView.showsUserLocation = YES ;
mapView.delegate = self;
[ mapView addAnnotation : _pointAnnotaion ] ;
self.view = mapView;
}
рдПрдХ рдмрд╛рд░ рдЬрдм рдирдХреНрд╢рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MKReverseGeocoder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (MKReverseGeocoder рдХреЛ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣рд╛рдБ рдирд╣реАрдВ рдмрддрд╛рдКрдБрдЧрд╛)ред
#pragma mark - Map view delegate
- ( void ) mapView : ( MKMapView * ) mapView didUpdateUserLocation : ( MKUserLocation * ) userLocation {
MKReverseGeocoder * geocoder = [ [ MKReverseGeocoder alloc ] initWithCoordinate : userLocation.coordinate ] ;
geocoder.delegate = self;
[ geocoder start ] ;
}
#pragma mark - Reverse geocoder delegate
- ( void ) reverseGeocoder : ( MKReverseGeocoder * ) geocoder didFindPlacemark : ( MKPlacemark * ) placemark {
[ geocoder autorelease ] ;
NSArray * formattedAddress = [ placemark.addressDictionary objectForKey : @ "FormattedAddressLines" ] ;
[ _selfAddress release ] ;
_selfAddress = [ [ formattedAddress componentsJoinedByString : @ "," ] retain ] ;
MKMapView * mapView = ( MKMapView * ) self.view;
for ( id<MKAnnotation> annotation in [ mapView annotations ] ) {
if ( [ annotation isKindOfClass : [ MKUserLocation class ] ] ) {
( ( MKUserLocation * ) annotation ) .subtitle = _selfAddress;
}
}
self.navigationItem.rightBarButtonItem.enabled = YES ;
}
- ( void ) reverseGeocoder : ( MKReverseGeocoder * ) geocoder didFailWithError : ( NSError * ) error {
[ geocoder autorelease ] ;
}
рд╣рдордиреЗ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ _selfAddress рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ "рд░реВрдЯ" рдмрдЯрди рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдПрдБред "рдорд╛рд░реНрдЪ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣
maps.google.com/maps рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ? Daddr = & saddr =, рдЬрд╣рд╛рдБ рдХреНрд░рдорд╢рдГ Daddr рдФрд░ saddr рдХрд╛ рдЕрдВрдд рдкрддрд╛ рдФрд░ рдорд╛рд░реНрдЧ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред
#pragma mark - Private methods
- ( NSString * ) escapedStringFromString : ( NSString * ) string {
NSString * result = ( NSString * ) CFURLCreateStringByAddingPercentEscapes (
NULL , /* allocator */
( CFStringRef ) string ,
NULL , /* charactersToLeaveUnescaped */
( CFStringRef ) @ "!*'();:@&=+$,/?%#[]" ,
kCFStringEncodingUTF8 ) ;
return [ result autorelease ] ;
}
#pragma mark - Public methods
- ( void ) routeAction {
NSString * daddr = [ self escapedStringFromString : [ _pointAnnotaion subtitle ] ] ;
NSString * saddr = [ self escapedStringFromString : _selfAddress ] ;
NSString * routeURL = [ NSString stringWithFormat : @ "maps.google.com/maps?daddr=%@&saddr=%@" , daddr, saddr ] ;
[ [ UIApplication sharedApplication ] openURL : [ NSURL URLWithString : routeURL ] ] ;
}
@end
рдпрджрд┐ URL рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ "рдореИрдкреНрд╕" рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреБрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдорд╛рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА
Apple Url рдпреЛрдЬрдирд╛______________________
рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ Habr Editor рдореЗрдВ ┬й SoftCoder.ru рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ