Above & Beyond Air Combat - скоро в App Store Lumines - скоро на iPhone
Авг 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“. При щелчке на булавке появляются заголовок и подзаголовок.

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

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

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...


3 Responses to “Уроки iPhone SDK: Работаем с фреймворком iPhone SDK MapKit”

  1. 1. Марк Says:

    А с календарем ты не работал?

  2. 2. Мурат Джусупов Says:

    Спасибо. Но до одного из пунктов пришлось самому додумываться (насчет 5 пункта - про перетаскивание мышью вьюшки из созданного xib-файла в имеющийся).

  3. 3. Artem Says:

    Рад что было полезно.

Оставьте комментарий