Лекция 17 CS193P Spring 2016 — Segues, Core Location и MapKit.

Screen Shot 2015-12-27 at 2.26.54 PM

В Лекции 17 освещаются три основные темы:

  • Segues ( Modal, Unwind, Popover, Embed)
  • Core Location
  • MapKit

И в конце лекции начало большого демонстрационного примера, посвященного  картам и Segues, который продолжится на следующей Лекции 18.

Segues

Первым Пол Хэгерти рассматривает модальный  (Modal) segueModal segue — это segue к MVC, который полностью захватывает ваш экран. При использовании Modal segue вы берете на себя полную ответственность за обеспечение пользователя способом выхода из этой ситуации. Потому что этот MVC оказывается полностью в вашей “власти”.

Пол Хэгерти намеренно отложил рассмотрение модальных segues на конец семестра. Потому что, когда люди знакомятся с ними слишком рано, они им очень нравятся и они говорят :”О, я буду делать все модальным. Это так легко -создавать модальные segues.”

И действительно, их легко создавать, но нужно создавать их с осторожностью, потому что они блокируют то, что находится на эране. Пользователь бывает немного ошарашен появлением модального View Controller. Обычно пользователь предпочитает более осмысленные действия у экране, когда он может на что-то кликнуть и затем вернуться назад.

Но иногда ваше приложение не может продолжить работу без того, чтобы остановить пользователя и задать ему вопрос. Для этого случая очень подходят модальные View Controllers, которые всего лишь UIViewController, показываемые модально.

Затем рассматриваются все вопросы использования Modal segue: способы представления View Controllers с помощью Modal Segue, вид модальных View Controllers на экране, как убрать модальных View Controllers  с экрана, как можно передать результаты из модального MVC обратно, в тот View Controller, который представлял этот MVC?

Далее очень подробно рассматриваются Unwind Segues, которые подходят для передачи информации в обратном направлении при модальном представлении, они также хороши для “перепрыгивания” назад к любой карте из стэка в Navigation Controller. Они возвращают вас к тому,  кто представил вас как View Controller напрямую или косвенно.

Большой кусок Лекции 17 посвящен Popover Segues. Следует думать о Popover, как о стиле презентации модального View ControllerОчень важная часть — подготовка Popover segue, и именно в этом различие между Popover Segue и Modal Segue в коде. В методе prepareForSegue вы получите UIPopoverPresentationController , с помощью которого в дополнение к тем установкам, которые связаны с тем, куда стрелочка Popover указывает,  вы можете управлять адаптацией Popover к различным Size Classes, и профессор показывает, как адаптировать (или отказаться от адаптации вообще) Popover на iPhone (Compact Width Size Class). Еще одна очень важная деталь, касающаяся Popover — это размер  “всплывающего” окна. Вам действительно нравится, когда появляется абсолютно идеально подогнанное к размеру MVC. Потому что MVC могут быть разного размера. В любом случае вы хотели бы реально управлять размером. iOS определяет размер Popover в чисто объектно-ориентированной манере, спрашивая MVC, которое находится в Popover, какой размер это MVC предпочитает?

Следующий тип segue — Embed Segue для «вставки картинки в картинку». Это, когда вы берете self.view одного MVC (ну, вы знаете, это топовый уровень View) и помещаете его внутрь  иерархии views другого MVC.  И получается вставка View в другой MVC, но оно полностью управляется исходным MVC. Это очень мощная техника инкапсуляции. Но в то же время очень легкая в использовании. Xcode делает процесс такой “вставки” реально легким.

Core Location

Core Location и Map Kit — это в действительности две части одного и того же пазла.

Фреймворк Core Location — это “внутренность” всего этого, не-UI способ найти ваше местоположение, а MapKit — это наоборот пользовательский интерфейс, который показывает ваше местоположение на карте.

Основной объект в Core Location называется CLLocation,  CL — это сокращение для Core Location

CLLocation имеет координаты coordinate (широту latitude и долготу longitude), высоту altitude,горизонтальную и вертикальную точность определения местоположения horizontal /verticalAccuracy, потому что точность определения местоположения зависит от того, как вы получили эти данные, и данные могут быть как очень точными (порядка нескольких метров), так и очень неточными (порядка километров). Также есть метка времени timestamp, которой метятся данные местоположения, в дальнейшем вы увидите, что это очень важно. Также  Core Location получает скорость speed, если система определила, что вы движетесь в данный момент, а также курс  course, который говорит о том, в каком направлении вы движетесь, если, конечно, система определила, что вы находитесь в движении в данный момент.

Когда вы имеете дело с получением данных о местоположении, вы задаете точность (accuracy), определяя тем самым какой механизм будет использовать ваше устройство для получения местоположения с заданной точностью — GPS, узлы WiFi или триангуляцию по вышкам сотовой связи. Эти механизмы сильно отличаются в плане потребления энергии батареи, которая становится определяющим фактором при определении местоположения.

В лекции 17 очень подробно рассказывается о различных способах мониторинга местоположения: непрерывное, основанное на «значительных изменениях»,  основанное на регионе. Особое внимание уделяется тому, как получить у пользователя авторизацию на использование данных о его местоположении. Данные о местоположении можно получить и в фоновом режиме (background), но для этого требуется настройка Capabilities вашего проекта. 

 Map Kit

Представляя  MapKit, профессор рассказывает об всем, что показывается на карте:  MKMapView (визуальное представление карты), MKAnnotation (представление элементов UI ввиде булавки с красной головкой), MKDirections (направления), MKOverlay («наложения»), MKMapCamera (используется для  3D отображения карты), MKLocalSearch (мощный инструмент поиска места в Мире по имени).

Рассматриваются методы делегата MKMapViewDelegate.

Весь теоретический материал показывается в большом демонстрационном примере,  в котором помимо возможностей MapKit Пол Хэгерти показыет возможности Swift : наблюдателя {didSet}, в котором одной строкой выполняется парсинг GPX файла, используется возможность вынесения «хвостового» замыкания за круглые скобки. Но самое интересное начинается, когда профессор наделяет путевую точку waypoint, полученную из GPX файла и которая знать ничего не знает о MapKit, свойствами MKAnnotation. Причем делает это с помощью extension без затрат памяти, используя только вычисляемые переменные. Получается как бы «двуликий» объект, и далее в коде мы разворачиваем его нужным лицом в зависимости от контекста: иногда это путевая точка GPX.Waypoint, если нам нужны гиперссылки на фотографии, сделанные в этой путевой точке, иногда как булавку с красной головкой MKAnnotation, когда нам нужно показать ее на карте.

Лекция и слайды на английском языке представлены в iTunes название “17. Segues, Core Location, and MapKit”. Код демонстрационного примера «Trax L18» для Swift 3.0  и Xcode 8 код находится на Github, а для Swift 3 .2  и Xcode 9 — также на Github.

Русскоязычный неавторизованный конспект Лекции 17, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также Google Doc доступны на платной основе