Работаем с фреймворком iPhone SDK MapKit

Автор оригинала: Geeky stuff
  • Перевод
Не так давно я работал над приложением, где нужно было непосредственно в нем вывести на экран карту. Я попытался найти советы по данной теме в Интернет, но ничего не вышло. Не получилось найти и достойного урока с объяснением, как на карте в приложении показать адрес. Поэтому я решил написать свой собственный урок и надеюсь, он будет вам полезен.

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

1. Для начала создайте приложение типа "Window based" и присвойте проекту имя "MapApp".
2. Добавьте к проекту фреймворк "MapKit". (Удерживая нажатой клавишу, щелкните на папке "Frameworks" и выполните "Add -> Existing Frameworks".)
3. Создайте новый класс контроллера представления и назовите его "MapViewController". Добавьте текстовое поле, кнопку и представление карты.

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MapViewController : UIViewController<MKMapViewDelegate> {
IBOutlet UITextField *addressField;
IBOutlet UIButton *goButton;
IBOutlet MKMapView *mapView;
}

@end


* This source code was highlighted with Source Code Highlighter.


4. Теперь создайте xib-файл с именем «MapView.xib». В качестве типа укажите «MapViewController», внесите в него элементы «UITextField», «UIButton» и «MKMapView».



Обязательно проверьте, чтобы делегат для "mapView" был настроен на класс контроллера.

5. Закончив с представлением, обновите "MapAppDelegate", загрузив контроллер представления и само представление.

6. Выполните компоновку приложения и проверьте, верно ли отображается представление. Теперь у нас есть интерфейс для ввода адреса и кнопка для вывода нужной точки на карте.

7. Добавьте класс для отображения аннотации к локации. Назовем его "AddressAnnotation".

- (void)applicationDidFinishLaunching:(UIApplication *)application {
mapViewController = [[MapViewController alloc] initWithNibName:@"MapView" bundle:nil];
[window addSubview:mapViewController.view];
[window makeKeyAndVisible];
}


* This source code was highlighted with Source Code Highlighter.


Данный класс будет отображать заголовок и подзаголовок локации на карте.

8. Предлагаю добавить функцию, которая будет вызываться при щелчке на кнопке "Go". Содержащийся в ней код и будет отвечать за вывод адреса на карту. Назовем это действие "showAddress".

- (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];
}


* This source code was highlighted with Source Code Highlighter.


9. Представление карты отображает локацию, ориентируясь на ее долготу и широту, а адрес у нас в текстовой форме. Соответственно, нужно преобразовать его в "CLLocationCoordinate2D". Обратите внимание: в приведенном коде для такого преобразования мы вызываем функцию "addressLocation".

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


* This source code was highlighted with Source Code Highlighter.


Представленный выше код считывает введенный в текстовое поле адрес и получает локацию с сайта maps.google.com в CSV-формате. Следующим шагом приложение находит в файле широту и долготу. Возвращаемый google код 200 означает, что все прошло успешно.

10. Последним шагом добавляем функцию-делегат, которая будет выводить на карту аннотацию.

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


* This source code was highlighted with Source Code Highlighter.


Функция создает представление аннотации (зеленая булавка) с аннотацией, ранее добавленной в "MapView". При щелчке на булавке появляются заголовок и подзаголовок.

Вот как будет выглядеть карта после загрузки:



image

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

Исходный код к уроку можно скачать здесь.

Средняя зарплата в IT

110 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 8 657 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 4

    0
    спасибо тебе, добрый человек!
      +1
      Спасибо, все очень подробно рассписано; рецепту — путь в избранное. :)
      Наверное только можно было бы еще тайтл и сабтайтл заменить на что-нибудь разумное (видимо между
      addAnnotation = [[AddressAnnotation alloc] initWithCoordinate:location];

      и
      [mapView addAnnotation:addAnnotation];

      можно устанавливать свойтва аннотации)
        0
        А какая у гугла лицензия на этот функционал? Он разрешен к использованию в коммерческих приложениях?

        Я могу ошибаться, но какое-то время тому назад геокодинг для коммерческого использования предоставлялся гуглом только на коммерческой же основе.
          0
          коллега, экзампл похерился (404)
          не были бы вы так любезны перезалить, если конечно не сложно

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое