|
Авг
26
|
Не так давно я работал над приложением, где нужно было непосредственно в нем вывести на экран карту. Я попытался найти советы по данной теме в Интернет, но ничего не вышло. Не получилось найти и достойного урока с объяснением, как на карте в приложении показать адрес. Поэтому я решил написать свой собственный урок и надеюсь, он будет вам полезен.
Предлагаю создать простое приложение, которое будет отображать введенный пользователем адрес непосредственно на карте. Назовем его “MapApp“.
1. Для начала создайте приложение типа “Window based” и присвойте проекту имя “MapApp“.
2. Добавьте к проекту фреймворк “MapKit“. (Удерживая нажатой клавишу , щелкните на папке “Frameworks” и выполните “Add -> Existing Frameworks“.)
3. Создайте новый класс контроллера представления и назовите его “MapViewController“. Добавьте текстовое поле, кнопку и представление карты.
1 2 3 4 5 6 7 8 9 10 | #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> @interface MapViewController : UIViewController<MKMapViewDelegate> { IBOutlet UITextField *addressField; IBOutlet UIButton *goButton; IBOutlet MKMapView *mapView; } @end |
4. Теперь создайте xib-файл с именем “MapView.xib”. В качестве типа укажите “MapViewController”, внесите в него элементы “UITextField”, “UIButton” и “MKMapView”.

Обязательно проверьте, чтобы делегат для “mapView” был настроен на класс контроллера.
5. Закончив с представлением, обновите “MapAppDelegate“, загрузив контроллер представления и само представление.
6. Выполните компоновку приложения и проверьте, верно ли отображается представление. Теперь у нас есть интерфейс для ввода адреса и кнопка для вывода нужной точки на карте.
7. Добавьте класс для отображения аннотации к локации. Назовем его “AddressAnnotation“.
1 2 3 4 5 | - (void)applicationDidFinishLaunching:(UIApplication *)application { mapViewController = [[MapViewController alloc] initWithNibName:@"MapView" bundle:nil]; [window addSubview:mapViewController.view]; [window makeKeyAndVisible]; } |
Данный класс будет отображать заголовок и подзаголовок локации на карте.
8. Предлагаю добавить функцию, которая будет вызываться при щелчке на кнопке “Go“. Содержащийся в ней код и будет отвечать за вывод адреса на карту. Назовем это действие “showAddress“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | - (IBAction) showAddress { //Скрываем клавиатуру [addressField resignFirstResponder]; MKCoordinateRegion region; MKCoordinateSpan span; span.latitudeDelta=0.2; span.longitudeDelta=0.2; CLLocationCoordinate2D location = [self addressLocation]; region.span=span; region.center=location; if(addAnnotation != nil) { [mapView removeAnnotation:addAnnotation]; [addAnnotation release]; addAnnotation = nil; } addAnnotation = [[AddressAnnotation alloc] initWithCoordinate:location]; [mapView addAnnotation:addAnnotation]; [mapView setRegion:region animated:TRUE]; [mapView regionThatFits:region]; } |
9. Представление карты отображает локацию, ориентируясь на ее долготу и широту, а адрес у нас в текстовой форме. Соответственно, нужно преобразовать его в “CLLocationCoordinate2D“. Обратите внимание: в приведенном коде для такого преобразования мы вызываем функцию “addressLocation“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | -(CLLocationCoordinate2D) addressLocation { NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [addressField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]]; NSArray *listItems = [locationString componentsSeparatedByString:@","]; double latitude = 0.0; double longitude = 0.0; if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) { latitude = [[listItems objectAtIndex:2] doubleValue]; longitude = [[listItems objectAtIndex:3] doubleValue]; } else { //Отображение ошибки } CLLocationCoordinate2D location; location.latitude = latitude; location.longitude = longitude; return location; } |
Представленный выше код считывает введенный в текстовое поле адрес и получает локацию с сайта maps.google.com в CSV-формате. Следующим шагом приложение находит в файле широту и долготу. Возвращаемый google код 200 означает, что все прошло успешно.
10. Последним шагом добавляем функцию-делегат, которая будет выводить на карту аннотацию.
1 2 3 4 5 6 7 8 | - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) annotation{ MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"]; annView.pinColor = MKPinAnnotationColorGreen; annView.animatesDrop=TRUE; annView.canShowCallout = YES; annView.calloutOffset = CGPointMake(-5, 5); return annView; } |
Функция создает представление аннотации (зеленая булавка) с аннотацией, ранее добавленной в “MapView“. При щелчке на булавке появляются заголовок и подзаголовок.
Вот как будет выглядеть карта после загрузки:

Мы разобрали простой пример отображения карты внутри приложения. Надеюсь, он был вам полезен.


Август 31st, 2009 at 16:43
А с календарем ты не работал?
Сентябрь 22nd, 2009 at 07:26
Спасибо. Но до одного из пунктов пришлось самому додумываться (насчет 5 пункта - про перетаскивание мышью вьюшки из созданного xib-файла в имеющийся).
Сентябрь 22nd, 2009 at 09:01
Рад что было полезно.