В Лекции 17 освещаются три основные темы:
- Segues ( Modal, Unwind, Popover, Embed)
- Core Location
- MapKit
И в конце лекции начало большого демонстрационного примера, посвященного картам и Segues, который продолжится на следующей Лекции 18.
Segues
Первым Пол Хэгерти рассматривает модальный (Modal) segue. Modal 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 доступны на платной основе