Статьи

Учебник по Google Maps iOS SDK: начало работы

  1. Начиная
  2. Создание ключей API
  3. Добавление SDK
  4. Получение местоположения
  5. Внедрение геокодирования
  6. В поисках чего-нибудь поесть
  7. Куда пойти отсюда?

Примечание об обновлении : Рон Клиффер обновил этот учебник до Xcode 9.2, iOS 11.2, Swift 4 и Google Maps SDK 2.5.0. Оригинальное руководство было написано Роном Клиффером.

Примечание об обновлении

До iOS 5 Google Maps были неотъемлемой частью iOS и были механизмом картирования, используемым всеми устройствами iOS. С выпуском iOS 6 в 2012 году Apple внесла кардинальные изменения и заменила Google Maps собственным картографическим движком: MapKit.

Всего несколько месяцев спустя Google выпустила собственное отдельное приложение Google Maps для iOS, а также Google Maps iOS SDK для разработчиков.

У MapKit и SDK Google Maps iOS iOS есть свои преимущества и недостатки, но это руководство поможет вам внедрить Google Maps в свои приложения, чтобы убедиться, насколько хорошо оно может работать в ваших приложениях геолокации.

В этом руководстве вы создадите приложение под названием Feed Me , которое будет определять текущее местоположение пользователя и искать близлежащие места, где можно поесть, выпить или даже сходить в магазин за едой. Результаты будут представлены в приложении с помощью Google Maps iOS SDK.

Этот урок предполагает некоторое знакомство с программированием на Swift и iOS. Если вы новичок в Swift или в программировании на iOS в целом, вы можете ознакомиться с некоторыми из наших другие учебники прежде чем продолжить.

Этот учебник также требует знакомства с CocoaPods , У вас должны быть установлены CocoaPods, чтобы следовать этому руководству. Чтобы узнать больше о CocoaPods, проверьте этот урок Джошуа Грин, опубликовано прямо здесь, на сайте.

Этот учебник использует Xcode 9.2 и iOS 11.2, и, конечно, требует знаний Auto Layout и Swift.

Начиная

Скачать Feed Me Стартовый проект Этот проект уже использует CocoaPods, поэтому откройте его с помощью файла Feed Me.xcworkspace .

Посмотрите вокруг, чтобы ознакомиться с проектом. Важные элементы, на которые следует обратить внимание:

  • MapViewController.swift : это основной контроллер представления этого проекта, и вы будете работать только с этим контроллером в этом руководстве.
  • GoogleDataProvider.swift : это класс-оболочка для выполнения вызовов Google API. Вы рассмотрите методы, которые он содержит позже в руководстве.
  • GooglePlace.swift : это модель результатов поиска мест, полученных от Google.
  • MarkerInfoView.swift : это подкласс UIView, который отображает детали мест. Он поставляется с соответствующим файлом XIB.

Прежде чем приступить к написанию кода, стоит посмотреть, как работает приложение. Создайте и запустите ваше приложение; Вы увидите следующий экран:

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

Это все, что можно увидеть в приложении на данный момент - это ваше дело, чтобы добавить немного магии!

Создание ключей API

В первую очередь вам понадобятся ключи API для Google Maps SDK и API Google, которые вы будете использовать. Если у вас еще нет учетной записи Google, создайте ее (они бесплатны!) И войдите в Консоль разработчиков Google ,

Нажмите « Создать проект» , назовите свой проект « Feed Me» и нажмите « Создать» :
Нажмите « Создать проект» , назовите свой проект « Feed Me» и нажмите « Создать» :

Если ваш проект не появляется сразу, обновите страницу, пока он не появится. Выберите вновь созданный проект, чтобы получить доступ к его настройкам. Выберите API и сервисы, а затем « Библиотека» в меню левой панели:

Найдите и включите эти API:

  • Google Maps SDK для iOS
  • Веб-служба API Google Адресов

Выберите Учетные данные в разделе API и сервисы в меню левой панели. Нажмите Создать учетные данные , а затем нажмите API ключ, чтобы создать ключ:

Скопируйте ключ и нажмите Закрыть :

Вскоре вы воспользуетесь ключом, но сначала добавите актуальный SDK Google Maps для iOS.

Добавление SDK

Откройте Podfile (в проекте Pods ) и добавьте следующее, прямо над концом:

под "GoogleMaps"

Затем откройте терминал и перейдите в каталог, содержащий ваш проект Feed Me, с помощью команды cd:

CD ~ / Путь / К / Папка / Содержит / Feed Me

Введите следующую команду, чтобы установить Google Maps iOS SDK:

под установку

Вы должны увидеть вывод, похожий на следующий:

Загрузка зависимостей Установка GoogleMaps (2.5.0) с использованием SwiftyJSON (4.0.0) Создание проекта Pods Интеграция проекта клиента

Теперь у вас есть GoogleMaps в вашем проекте. Разве CocoaPods не делает жизнь намного легче? :]

Откройте AppDelegate.swift и замените его содержимое следующим:

import UIKit import GoogleMaps // 1 let googleApiKey = "ENTER_KEY_HERE" @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {var window: UIWindow? Приложение func (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {// 2 GMSServices.provideAPIKey (googleApiKey) возвращает true}}

Здесь есть два новых элемента:

  1. Константа для хранения вашего ключа Google API. Замените ENTER_KEY_HERE на ключ API Google, который вы создали ранее.
  2. Ваше приложение будет создавать экземпляры служб Google Maps с помощью ключа API, используя метод класса GMSServices provideAPIKey ().

Затем откройте Main.storyboard, чтобы вызвать Interface Builder. Откройте библиотеку объектов , выбрав третью вкладку на панели инструментов представления - Утилиты -, а затем выберите третью вкладку на панели инструментов библиотеки - Библиотека объектов - как показано на снимке экрана ниже:

Найдите сцену MapViewController и перетащите простой UIView из библиотеки объектов в приблизительный центр представления MapViewController. Измените цвет фона представления на светло-серый. Затем откройте схему документа с помощью редактора \ Показать схему документа и измените порядок иерархии представления, чтобы дерево объектов выглядело следующим образом:

Чтобы превратить этот простой UIView в GMSMapView, выберите только что добавленное представление и откройте инспектор удостоверений , выбрав третью вкладку слева на панели инструментов «Утилиты». Измените класс представления на GMSMapView, как показано на снимке экрана ниже:

Ваша сцена MapViewController теперь должна выглядеть так:
Ваша сцена MapViewController теперь должна выглядеть так:

Затем вам нужно добавить некоторые ограничения, чтобы карта заполнила весь экран. Выберите « Вид карты» в структуре документа, а затем выберите вторую кнопку справа в нижнем правом углу окна Interface Builder - кнопку « Закрепить» . Убедитесь, что параметр Ограничить поля не отмечен - это гарантирует, что карта заполнит все доступное пространство на экране - и добавит 0 (ноль) пространственных ограничений сверху, слева, снизу и справа от суперпредставления.

Ваш редактор Pin должен выглядеть так:
Ваш редактор Pin должен выглядеть так:

Нажмите Добавить 4 ограничения, чтобы добавить ограничения в вид карты.
Ваша сцена MapViewController должна выглядеть следующим образом, где серая область представляет GMSMapView :
Нажмите Добавить 4 ограничения, чтобы добавить ограничения в вид карты

Прежде чем создавать и запускать проект, добавьте IBOutlet для вида карты. Для этого вызовите помощник редактора, выбрав вторую вкладку на панели инструментов редактора:

Выберите представление карты в Интерфейсном Разработчике, удерживайте нажатой клавишу Ctrl и перетащите линию из представления карты в MapViewController.swift . Появится всплывающее окно; установите тип соединения на Outlet и имя для mapView. Сохраните тип как GMSMapView и нажмите « Подключиться» :

Это создаст свойство GMSMapView в MapViewController.swift и автоматически подключит его в Интерфейсном Разработчике . Перед сборкой и запуском добавьте следующее в начало файла после импорта UIKit:

импортировать GoogleMaps

Создайте и запустите свой проект; Теперь вы должны увидеть карту примерно так:

Вы используете Google Maps iOS SDK в своем приложении - но вы можете сделать больше, чем просто показать основную карту, верно? :]

Получение местоположения

Feed Me - это поиск мест рядом с пользователем, и вы не сможете этого сделать, не узнав местоположение пользователя.

Сначала откройте MapViewController.swift и добавьте следующее свойство:

приватный let locationManager = CLLocationManager ()

Это добавит и создаст экземпляр свойства CLLocationManager с именем locationManager.

Затем найдите viewDidLoad () и добавьте эти две строки внизу:

locationManager.delegate = self locationManager.requestWhenInUseAuthorization ()

Это сделает MapViewController делегатом locationManager и запросит доступ к местоположению пользователя.

Затем откройте проект Feed Me в верхней части навигатора проекта, выберите цель Feed Me и перейдите на вкладку Info , выберите первую строку в разделе « Свойства пользовательской цели iOS » и нажмите значок +, чтобы добавить новую строку.

Выберите Конфиденциальность - Расположение при использовании Описание использования в качестве ключа, выберите String для типа и введите следующий текст в качестве значения:

Получив доступ к вашему местоположению, это приложение поможет вам найти хорошее место, где можно поесть.

Когда вы закончите, это должно выглядеть примерно так:

Прежде чем вы сможете запустить приложение, вам необходимо настроить MapViewController на соответствие протоколу CLLocationManagerDelegate.

Добавьте следующее расширение в конец MapViewController.Swift :

// MARK: - CLLocationManagerDelegate // 1 расширение MapViewController: CLLocationManagerDelegate {// 2 func locationManager (_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {// 3 сторожевой статус == .authorizedWhenInUstManager_WareStation} {return} // возвращение} {} () // 5 mapView.isMyLocationEnabled = true mapView.settings.myLocationButton = true} // 6 func locationManager (_ manager: CLLocationManager, didUpdateLocations location: [CLLocation]) {guard let location = location.first else {return} // 7 mapView.camera = GMSCameraPosition (target: location.coordinate, zoom: 15, азимут: 0, displayAngle: 0) // 8 locationManager.stopUpdatingLocation ()}}

Принимая каждый пронумерованный комментарий по очереди:

  1. Вы создаете расширение MapViewController, которое соответствует CLLocationManagerDelegate.
  2. locationManager (_: didChangeAuthorization :) вызывается, когда пользователь предоставляет или отменяет разрешения на местоположение.
  3. Здесь вы подтверждаете, что пользователь предоставил вам разрешение во время использования приложения.
  4. Как только разрешения будут установлены, спросите у менеджера местоположения обновления на местоположении пользователя.
  5. GMSMapView имеет две функции, касающиеся местоположения пользователя: myLocationEnabled рисует голубую точку, в которой находится пользователь, в то время как myLocationButton, если задано значение true, добавляет на карту кнопку, которая при касании центрирует карту в местоположении пользователя.
  6. locationManager (_: didUpdateLocations :) выполняется, когда менеджер местоположений получает новые данные о местоположении.
  7. Это обновляет камеру карты, чтобы сосредоточиться вокруг текущего местоположения пользователя. Класс GMSCameraPosition объединяет все параметры положения камеры и передает их на карту для отображения.
  8. Сообщите locationManager, что вы больше не заинтересованы в обновлениях; Вы не хотите следовать за пользователем, так как его первоначальное местоположение достаточно для работы.

Создайте и запустите ваше приложение; как только он загрузится, вам будет выдано предупреждение с запросом разрешения на местоположение. Нажмите на Разрешить :
Создайте и запустите ваше приложение;  как только он загрузится, вам будет выдано предупреждение с запросом разрешения на местоположение

Теперь вы должны увидеть карту вокруг вашего местоположения. Прокрутите карту и нажмите кнопку « Найти» , и карта вернется к вашему местоположению следующим образом:

Прокрутите карту и нажмите кнопку « Найти» , и карта вернется к вашему местоположению следующим образом:

Внедрение геокодирования

Теперь, когда у вас есть местоположение пользователя, было бы хорошо, если бы вы могли показать уличный адрес этого местоположения. У Google Maps есть объект, который делает именно это: GMSGeocoder. Это берет простую координату и возвращает читаемый адрес улицы.

Во-первых, вам нужно добавить некоторый интерфейс, чтобы представить адрес пользователю.

Откройте Main.storyboard и добавьте UILabel в сцену MapViewController . Убедитесь, что вы добавили метку в представление MapViewController, а не в GMSMapView.

Затем откройте инспектор Атрибутов и присвойте метке следующие атрибуты:

  • Установить выравнивание по центру .
  • Установите Линии в 0 . Удивительно, но это позволяет метке занимать столько строк, сколько нужно для размещения текста. Пойди разберись! :]
  • Установите фон на белый с непрозрачностью 85% .

Инспектор атрибутов метки и дерево объектов сцены должны выглядеть следующим образом:

Наконец, добавьте к метке левое, нижнее и правое ограничения 0, как показано ниже:

Наконец, добавьте к метке левое, нижнее и правое ограничения 0, как показано ниже:

Это прикрепит ярлык к нижней части экрана и растянет его по всей ширине экрана.

Ваша сцена раскадровки должна выглядеть следующим образом:

Далее создайте розетку для этикетки. Выберите помощник редактора и нажмите Ctrl + перетащите с метки в структуре документа на MapViewController.swift . Установите тип подключения Outlet , имя addressLabel и нажмите Connect .

Это добавляет свойство к вашему MapViewController, которое вы можете использовать в своем коде:

@IBOutlet слабая переменная addressLabel: UILabel!

Добавьте метод ниже к MapViewController:

private func reverseGeocodeCoordinate (_ координат: CLLocationCoordinate2D) {// 1 let geocoder = GMSGeocoder () // 2 geocoder.reverseGeocodeCoordinate (координата) {ответ, ошибка в охране, пусть адрес = ответ? .firstResult (), пусть строки = address.lines else {return} // 3 self.addressLabel.text = lines.joined (разделитель: "\ n") // 4 UIView.animate (withDuration: 0.25) {self.view.layoutIfNeeded ()}}}

Еще раз, вот что делает каждый закомментированный раздел:

  1. Создает объект GMSGeocoder, чтобы превратить координаты широты и долготы в адрес улицы.
  2. Запрашивает геокодер для обратного геокодирования координаты, переданные методу. Затем он проверяет, есть ли адрес в ответе типа GMSAddress. Это модельный класс для адресов, возвращаемых GMSGeocoder.
  3. Устанавливает текст addressLabel в адрес, возвращаемый геокодером.
  4. Как только адрес установлен, анимируйте изменения в собственном размере содержимого метки.

Вы захотите вызывать этот метод каждый раз, когда пользователь меняет свою позицию на карте. Для этого вы будете использовать GMSMapViewDelegate.

Добавьте еще одно расширение в конец MapViewController.swift следующим образом:

// MARK: - расширение GMSMapViewDelegate MapViewController: GMSMapViewDelegate {}

Это объявит, что MapViewController соответствует протоколу GMSMapViewDelegate.

Затем добавьте следующую строку кода в viewDidLoad ():

mapView.delegate = self

Это делает MapViewController делегатом представления карты.

Наконец, добавьте следующий метод к недавно добавленному расширению:

func mapView (_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {reverseGeocodeCoordinate (position.target)}

Этот метод вызывается каждый раз, когда карта прекращает движение и устанавливает новую позицию, где вы затем делаете вызов, чтобы изменить геокодирование новой позиции и обновить текст addressLabel.

Создайте и запустите ваше приложение; вы увидите адрес вашего текущего местоположения - реальный или смоделированный - всплывающее в нижней части экрана:

Заметили что-нибудь не так с этой картинкой?

[spoiler] Логотип Google и кнопка Locate скрываются за ярлыком! [/ spoiler]

К счастью, GMSMapView предоставляет очень простое решение для этого: заполнение . Когда к карте применено заполнение, все визуальные элементы будут размещены в соответствии с этим заполнением.

Вернитесь к reverseGeocodeCoordinate (_ :) и добавьте эти строки непосредственно перед блоком анимации:

// 1 let labelHeight = self.addressLabel.intrinsicContentSize.height self.mapView.padding = UIEdgeInsets (top: self.view.safeAreaInsets.top, left: 0, bottom: labelHeight, right: 0)

Теперь замените блок анимации на:

UIView.animate (withDuration: 0.25) {// 2 self.pinImageVerticalConstraint.constant = ((labelHeight - self.view.safeAreaInsets.top) * 0.5) self.view.layoutIfNeeded ()}

Они делают две вещи:

  1. Перед блоком анимации это добавляет отступы сверху и снизу карты. Верхний отступ равен верхнему безопасному вкладку области просмотра, а нижний - высоте метки.
  2. Обновляет положение булавки местоположения в соответствии с отступом карты, регулируя ограничение вертикального расположения.

Создайте и запустите ваше приложение снова; на этот раз логотип Google и кнопка поиска переместятся на новую позицию, как только метка станет видимой:

Переместить карту вокруг; вы заметите, что адрес меняется каждый раз, когда карта переходит в новую позицию. Давайте добавим визуальный эффект, чтобы смягчить изменение адреса.

Добавьте следующий метод в расширение GMSMapViewDelegate:

func mapView (_ mapView: GMSMapView, жест willMove: Bool) {addressLabel.lock ()}

Этот метод вызывается каждый раз, когда карта начинает двигаться. Он получает Bool, который сообщает вам, произошло ли движение из-за жеста пользователя, такого как прокрутка карты, или из-за движения. Вы вызываете lock () для addressLabel для загрузки анимации.

Когда есть блокировка (), также должна быть разблокировка (). Добавьте следующее в верхнюю часть закрытия reverseGeocodeCoordinate (координаты :):

self.addressLabel.unlock ()

Примечание : для полной реализации lock () и unlock (), проверьте UIViewExtensions.swift .

Создайте и запустите ваше приложение; когда вы прокручиваете карту, вы должны увидеть анимацию загрузки на адресной метке, например:

Создайте и запустите ваше приложение;  когда вы прокручиваете карту, вы должны увидеть анимацию загрузки на адресной метке, например:

В поисках чего-нибудь поесть

Теперь, когда карта настроена и у вас есть местоположение пользователя, пришло время кормить этого пользователя!

Вы будете использовать API Google Адресов для поиска мест, где можно поесть и выпить по месту нахождения пользователя. Google Places API - это бесплатный API веб-службы, который можно использовать для запроса, чтобы найти заведения, географические местоположения или другие достопримечательности рядом с любой данной точкой.

Google Maps iOS SDK предоставляет вам класс GMSMarker для отметки местоположений на карте. Каждый маркерный объект содержит координату и изображение значка и отображается на карте при добавлении.

Для этого приложения вам потребуется дополнительная информация о каждом маркере, поэтому вам нужно создать подкласс GMSMarker.

Создайте новый класс касания Cocoa , назовите его PlaceMarker и сделайте его подклассом GMSMarker. Убедитесь, что вы выбрали Swift в качестве языка для этого файла.

Замените содержимое PlaceMarker.swift следующим:

import UIKit import GoogleMaps класс PlaceMarker: GMSMarker {// 1 let place: GooglePlace // 2 init (place: GooglePlace) {self.place = place super.init () position = place.coordinate icon = UIImage (named: place.placeType + "_pin") groundAnchor = CGPoint (x: 0.5, y: 1) emergeAnimation = .pop}}

Это относительно простой фрагмент кода:

  1. Добавьте свойство типа GooglePlace в PlaceMarker.
  2. Объявите новый назначенный инициализатор, который принимает GooglePlace в качестве единственного параметра и полностью инициализирует PlaceMarker с позицией, изображением значка, привязкой к позиции маркера и анимацией внешнего вида.

Затем добавьте еще два свойства в MapViewController.swift следующим образом:

private let dataProvider = GoogleDataProvider () private let searchRadius: Double = 1000

Вы будете использовать dataProvider (определенный в GoogleDataProvider.swift ), чтобы совершать звонки в Google Places Web API , и searchRadius, чтобы определять, как далеко от местоположения пользователя (в метрах) искать места.

Добавьте следующий метод в MapViewController:

private func fetchNearbyPlaces (координата: CLLocationCoordinate2D) {// 1 mapView.clear () // 2 dataProvider.fetchPlacesNearCoordinate (координата, radius: searchRadius, типы: searchTypes) {места в местах.forEach {// 3 let marker = PlaceMarker (место : $ 0) // 4 marker.map = self.mapView}}}

Давайте рассмотрим то, что вы только что добавили:

  1. Очистить карту от всех маркеров.
  2. Используйте dataProvider для запроса Google о близлежащих местах в searchRadius, отфильтрованных по выбранным пользователем типам.
  3. Выполните итерации по результатам, возвращенным при закрытии завершения, и создайте PlaceMarker для каждого результата.
  4. Установите карту маркера. Эта строка кода указывает карте на визуализацию маркера.

Вот вопрос за 64 000 долларов: когда вы хотите вызвать этот метод?

Во-первых, пользователь может разумно ожидать увидеть места поблизости при запуске приложения.

Найдите locationManager (_: didUpdateLocations :) и добавьте следующую строку кода в конце:

fetchNearbyPlaces (координата: местоположение. координата)

Во-вторых, пользователь имеет возможность изменять типы мест, отображаемых на карте, поэтому вам нужно будет обновить результаты поиска, если выбранные типы изменятся.

Найдите typesController (_: didSelectTypes :) и добавьте следующую строку кода в конец:

fetchNearbyPlaces (координата: mapView.camera.target)

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

Откройте Main.storyboard и перетащите UIBarButtonItem из библиотеки объектов в левую часть панели навигации MapViewController. Измените Идентификатор кнопки на Обновить , как показано ниже:

Выберите Ассистент редактора и Ctrl + перетащите с кнопки Обновить в MapViewController.swift . Выберите Action и назовите метод refreshPlaces. Вставьте следующий код в недавно добавленный метод:

fetchNearbyPlaces (координата: mapView.camera.target)

Создайте и запустите свой проект; вокруг карты появятся метки местоположения. Измените типы поиска в TypesTableViewController и посмотрите, как меняются результаты:

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

Добавьте следующий метод в расширение GMSMapViewDelegate в MapViewController.swift :

func mapView (_ mapView: GMSMapView, markerInfoContents marker: GMSMarker) -> UIView? {// 1 охранник let placeMarker = маркер как? PlaceMarker else {return nil} // 2 охранник let infoView = UIView.viewFromNibName ("MarkerInfoView") как? MarkerInfoView else {return nil} // 3 infoView.nameLabel.text = placeMarker.place.name // 4 если let photo = placeMarker.place.photo {infoView.placePhoto.image = photo} else {infoView.placePhoto.image = UIImage (named: "generic")} возвращение infoView}

Этот метод вызывается каждый раз, когда пользователь нажимает маркер на карте. Если вы вернете вид, он появится над маркером. Если возвращается ноль, ничего не происходит. Как это происходит?

  1. Сначала вы применяете повернутый маркер к PlaceMarker.
  2. Затем вы создаете MarkerInfoView из его кончика. Класс MarkerInfoView - это подкласс UIView, который поставляется с начальным проектом для этого учебного пособия.
  3. Затем вы применяете название места к названию.
  4. Проверьте, есть ли фото для этого места. Если это так, добавьте это фото в информационный вид. Если нет, добавьте общую фотографию вместо.

Прежде чем запускать приложение, вы должны убедиться, что указатель местоположения не закрывает информационное окно. Добавьте следующий метод в расширение GMSMapViewDelegate:

func mapView (_ mapView: GMSMapView, маркер didTap: GMSMarker) -> Bool {mapCenterPinImage.fadeOut (0.25) возвращает false}

Этот метод просто скрывает указатель местоположения при нажатии на маркер. Метод возвращает false, чтобы указать, что вы не хотите переопределять поведение по умолчанию - центрировать карту вокруг маркера - при касании маркера.

Очевидно, что в какой-то момент булавка должна вновь появиться. Добавьте следующее в конец mapView (_: willMove :):

if (жест) {mapCenterPinImage.fadeIn (0.25) mapView.selectedMarker = nil}

Это проверяет, произошло ли движение от жеста пользователя; если это так, он скрывает контакт местоположения, используя метод fadeIn (_ :). Если для параметра selectedMarker карты установлено значение nil, будет удален представленный в данный момент информационный вид.

Наконец, добавьте следующий метод к расширению GMSMapViewDelegate:

func didTapMyLocationButton (для mapView: GMSMapView) -> Bool {mapCenterPinImage.fadeIn (0.25) mapView.selectedMarker = nil return false}

Этот метод запускается, когда пользователь нажимает кнопку « Найти» ; карта будет в центре на месте пользователя. Возврат false снова означает, что он не отменяет поведение по умолчанию при нажатии кнопки.

Создайте и запустите ваше приложение; выберите маркер, и вы увидите, что расположение булавки исчезнет. Прокрутка карты закрывает информационный вид и возвращает булавку:

Прокрутка карты закрывает информационный вид и возвращает булавку:

Вот и все, вы сделали это! Теперь у вас есть полнофункциональное приложение Google Maps. :]

Куда пойти отсюда?

Вот ссылка на завершить проект из этого урока. Поскольку SDK Google Maps очень большой по размеру, мы исключили его из проекта, поэтому обязательно выполните установку pod перед сборкой.

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

Моя цель здесь не в том, чтобы убедить вас, что Google Maps iOS SDK лучше, чем собственный MapKit от Apple; Тем не менее, вот несколько плюсов и минусов Карт Google:

Pros

  • Частые обновления в SDK от Google.
  • Единый интерфейс для кроссплатформенных (iOS и Android) приложений.
  • Карты Google часто бывают более подробными, особенно за пределами США. Например:

    Например:

Cons

  • В отличие от Google Maps, MapKit является родным для iOS, что означает, что он всегда синхронизируется с iOS и работает с Swift из коробки.
  • Отсутствие стабильности по сравнению с MapKit.
  • MapKit имеет гораздо лучшую интеграцию с CoreLocation и CoreAnimation.

Из этого туториала вы узнали только основы того, что может сделать SDK Google Maps. Есть еще много всего, чему можно научиться; Вы должны обязательно проверить полная документация для более интересных функций SDK может предложить.

Среди других вещей, которые вы можете сделать с помощью Google Maps iOS SDK, - показ маршрутов, карты помещений, наложения, слои листов, просмотр улиц и расширенная интеграция с приложением Google Maps. Чтобы заработать очки, попробуйте использовать некоторые из этих функций для улучшения приложения Feed Me.

Еще раз спасибо адвокатам разработчиков Google Бретту Моргану и Тодду Керпельману, которые вместе со мной работали над поиском наилучшего способа интеграции API Google Адресов в это руководство.

Если у вас есть какие-либо вопросы, советы или вы просто хотите показать свое классное картографическое приложение, не стесняйтесь писать об этом в обсуждении ниже!

Похожие

Как сделать игру как Doodle Jump с помощью Corona Tutorial Part 1
Это сообщение в блоге от члена команды iOS Tutorial Team Якоб Гундерсен , инди-разработчик игр, который управляет Инди Амбиции блог. Проверьте его последнее приложение - Фактор Самурай! Готов поспорить, что когда вы проснулись этим утром, вашей
Google Fiber ищет экспертов Центра управления сетью (NOC)
Я использовал бета-версию Google Maps Navigation на своем Google Nexus One, и она показала себя оче...
Я использовал бета-версию Google Maps Navigation на своем Google Nexus One, и она показала себя очень хорошо,
Firefox выбирает Google в качестве поиска по умолчанию в США, удивительно Yahoo
САН-ФРАНЦИСКО (Рейтер) - Алфавит Инк ( GOOGL.O Во вторник Google восстановил свое место в качестве поисковой системы по умолчанию в браузере Firefox от Mozilla Corp в США и других регионах, так как производитель браузеров ошеломил Verizon Communication Inc ( VZ.N ) Yahoo, отменив свою сделку.
Официальный браузер Tor для iOS, Onion Browser, теперь бесплатный в App Store
... вопросам конфиденциальности Майк Тигас продает свой Onion Browser, который шифрует и туннелирует веб-трафик пользователей через сеть Tor, в официальном Магазин приложений за разумную сумму 99 центов.
Гаджеты для Сайтов Google
В Google, гаджеты являются приложениями HTML и JavaScript, которые могут быть встроены в веб-страницы и другие приложения, включая сайты. Эти гаджеты предоставляют возможность включать в ваш сайт внешний и динамический контент, такой как миниатюрные приложения и списки на основе базы данных, объединенные с текстом и изображениями для удобного взаимодействия
Android 4.0 в VirtualBox
Эту информацию немного сложно найти в интернете. Это как установить Android 4.0 (Ice Cream Sandwich) в VirtualBox "Сделай сам" (установка из ISO-образа). Есть некоторые люди, которые сделали предустановленные образы VirtualBox, но одна проблема, с которой вы можете столкнуться при этом, заключается в том, что серийный номер Android будет соответствовать всем, кто использует тот же образ, что и вы, поскольку Android генерирует этот номер при первой
Talking Tech Tactics с «Футбольным менеджером 2011»
Джон Тиррелл
В магазине Google Play есть много отличных приложений. К сожалению, лучшее обычно оплачивается. Тем не менее, на...
В магазине Google Play есть много отличных приложений. К сожалению, лучшее обычно оплачивается. Тем не менее, наступает момент, когда данная программа либо продвигается, либо вы можете купить ее совершенно бесплатно. Вот что произошло сейчас - я выбрал для вас несколько интересных приложений, которые можно скачать бесплатно. TaskLife Performance Tracker Это очень простое приложение, которое для многих может оказаться неотъемлемой частью их жизни. Почему? Когда мы хотим что-то
Safari против Google Chrome. Какой браузер лучше всего подходит для MacBook?
... веб-браузер в мире на данный момент, и он доминирует даже в MacOS. Поскольку Internet Explorer заменен Microsoft Edge, который занимает чуть более 5 процентов Chrome доминирует в чартах с долей рынка более 59%. Safari находится на пятом месте с долей рынка чуть более трех процентов. Для пользователей Mac Safari - это выбор по умолчанию, который вполне подходит для большинства пользователей.
Мастеринг Git - Heart Internet Blog - Сосредоточение на всех аспектах сети
Написание кода и управление хорошим рабочим процессом является сложной задачей. Вещи могут легко запутаться, и ошибки могут появиться из ниоткуда. Вот где Git приходит. Независимо от того, кто вы или сколько кода вы пишете ежедневно, использование Git изменит ваш рабочий процесс и поведение при кодировании в лучшую сторону и сделает возможным сотрудничество в группах. У вас есть проблемы, такие как непонятные имена файлов (например, final, final2, final3)? Вы изо всех сил пытаетесь сказать,

Комментарии

Куда пойти отсюда?
Куда пойти отсюда? Здесь пример проекта со всем кодом из учебника до сих пор. Проверять, выписываться часть вторая из учебника, где мы будем стрелять стрелами, перемещать экран и создавать монстров в кратчайшие сроки! :] Если вы хотите узнать больше о Corona, вы можете обратиться к следующим ресурсам: Кроме того, если
ХОТИТЕ ОРИГИНАЛЬНОСТИ, НО НЕТ ТРУДНОЙ РАБОТЫ?
ХОТИТЕ ОРИГИНАЛЬНОСТИ, НО НЕТ ТРУДНОЙ РАБОТЫ? Ищите этот предмет для разговорного освещения, но не хотите делать это сами? Старинные Трубы Творения подберет для вас идеальное освещение как внутри, так и снаружи,
Как создать контент в Google Direct Answer?
Как создать контент в Google Direct Answer? Если вы ищете вдохновение для создания нового контента на сайте, ознакомьтесь с доступными онлайн-инструментами, которые помогут вам. Прежде всего, это поиск по фразе, такой как Инструмент подсказки ключевых слов или Ubersuggest , Выбрав польский язык в качестве диапазона, вы узнаете, какие слова или вопросы связаны с выбранной вами фразой. Если ваш бренд специализируется
Netflix доступен только через Google Chrome?
Netflix доступен только через Google Chrome? На момент написания этой статьи, да, Google Chrome на данный момент является единственным браузером, который обеспечивает воспроизведение контента Netflix изначально в Linux. Это не будет иметь место слишком долго, так как Firefox реализовал поддержку EME в версиях Firefox для Windows, поэтому поддержка Firefox в Linux на этом этапе неизбежна. NSS, последняя часть головоломки была предоставлена ​​Mozilla, но Firefox не может
Видишь, куда я иду?
Видишь, куда я иду? Конечно, эта история займет годы, чтобы разыграть. Google Fiber может стать не чем иным, как грандиозным экспериментом. И вообще, я не хочу, чтобы малые предприятия были осторожны с продажами провайдеров услуг широкополосного доступа. Тем не менее, я думаю, что у бренда Google есть невероятное облако с сегодняшними предпринимателями и недавними выпускниками колледжа. И эти выпускники могут расширить свои кошельки для большего количества сервисов Google,
Кто угодно может высказать свое мнение о чем угодно, поэтому хорошо, что Google заранее оценил этот контент для читателя и отсортировал его… верно?
Кто угодно может высказать свое мнение о чем угодно, поэтому хорошо, что Google заранее оценил этот контент для читателя и отсортировал его… верно? Понять SEO как возможность Пожалуйста, не поймите это неправильно: миллиарды проиндексированных страниц должны быть как-то отсортированы, поэтому необходимо ранжирование. Благодаря SEO у всех есть одинаковые возможности катапультироваться в Google. Оптимизация веб-сайта - это методология, которая соответствует Интернету и сравнима

Разве CocoaPods не делает жизнь намного легче?
Application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
ReverseGeocodeCoordinate (координата) {ответ, ошибка в охране, пусть адрес = ответ?
Вот вопрос за 64 000 долларов: когда вы хотите вызвать этот метод?
Охранник let placeMarker = маркер как?
ViewFromNibName ("MarkerInfoView") как?
Как это происходит?
Куда пойти отсюда?
Почему?
Какой браузер лучше всего подходит для MacBook?

Новости