Лекция 8. Анимация. Демонстрация. CS193P Spring 2021.

Это восьмая Лекция курса Stanford CS193p, весна 2021 года. Лекция 8 полностью посвящена демонстрации различных возможностей анимации в SwiftUI:

  • matchedGeometryEffect, который действует при сдаче карт
  • переворот карты, который осуществляется нашим специальным Animatable модификатором Cardify
  •  анимация нашей геометрической фигуры Shape в виде “пирога” Pie
  • неявная анимация, которая крутит эмодзи при совпадении карт
  • перетасовка карт и выбор карты представляют явную анимацию
  • запуск анимации при появлении (.onAppear) некоторых вещей
  • как задерживать анимацию карт при их сдаче
  • как диагностировать проблемы, когда у нас не происходит анимация, которую мы ожидаем при появлении на экране и уходе с экрана View, которое является частью условного предложения if-else

Читать далее

Лекция 7. Модификаторы ViewModifier. Анимация. CS193P Spring 2021.

Это седьмая Лекция курса Stanford CS193p, весна 2021 года. Лекция  7 и Лекция 8 полностью посвящены анимации. Мы собираемся выяснить, как она работает. По ходу дела нам придется изучить модификаторы ViewModifier, которые очень сильно вовлечены в процесс анимации.

Объясняется протокол ViewModifier, который затем используется для того, чтобы сделать возможным преобразование любого View в карту игры Memorize путем «картафикации» ( от слова «карта»). Затем лекция переходит к углубленному рассмотрению анимации и начинает комплексную многолекционную демонстрацию анимации. 

Если Лекция 8 — это, по существу, демо-Лекция, на которой профессор Пол Хэгерти демонстрирует все возможные анимации, какие только вы можете себе представить, то на Лекции 7 изложены теоретические основы анимации и представлено начало (неявная анимация, чтобы заставить смайлик на Memorize карте вращаться, когда она совпадает с другой картой, и модификаторы ViewModifier) той огромной демонстрации, которая последует на Лекции 8.

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

Золотые правила анимации.

Только изменения могут анимироваться. Если ничего не изменяется, то ничего не будет анимироваться. Это фундаментальное правило.

 Какого рода изменения могут анимироваться?

Реально в SwiftUI, только 3 типа изменений:

  • аргументы модификаторов ViewModifiers,
  • геометрические фигуры Shapes, то есть аргументы при создании Shapes,
  • “появление” или «уход» Views на UI.

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

Модификаторы ViewModifiers — это основные “агенты изменений” в UI, но изменение аргументов ViewModifier должно произойти ПОСЛЕ того, как View разместился на UI. Другими словами, изменения аргументов модификаторов рассматриваются системой анимации только ПОСЛЕ момента присоединения View к  UI.

Читать далее

Лекция 4. Больше о MVVM enum Optional. CS193P Spring 2021.

Это четвертая Лекция курса Stanford CS193p, весна 2021 года, и она сразу начинается с продолжения демонстрационного примера прошлой Лекции 3, на которой были сконструированы модель Model и ViewModel для карточной игры «на запоминание» MemorizeView  (то есть UI) мы создали на Лекциях 1и 2. На этой Лекции архитектура MVVM реализуется во всей своей реактивной мощи.

После того, как MVVM заработает, профессор возвращается к слайдам, чтобы вкратце поговорить о двух вещах. Первая  — это еще один системный ТИП Swift, называемый перечислением enum, а вторая — это специальная версия перечисления enum, называемая Optional. Наверное, это одно из самых важных перечислений enum, если не самое главное enum во всем Swift.

Читать далее

Лекция 3. MVVM и система ТИПов в Swift. CS193P Spring 2021.

Это третья Лекция курса Stanford CS193p, весна 2021 года. На первых двух Лекциях мы много узнали о том, как создавать UI, используя SwiftUI на примере карточной игры «на запоминание» Memorize

На этой неделе мы узнаем, как “подцепить” наш UI к логике, которая знает, как играть в карточную игру “на совпадение”. Но сначала профессор рассматривает две действительно важные концептуальные идеи: MVVM и системные ТИПы языка программирования Swift.

MVVM

MVVM — это, по сути, способ организации всего кода в нашем приложении. 

Системные ТИПы в Swift, очевидно, позволяют нам делать все, что мы делаем в языке программирования Swift и, следовательно, в SwiftUI.

MVVM, как и MVC, разделяет весь код нашего приложения на код пользовательского интерфейса (UI), то есть то, что мы называем View, от логики нашего приложения, которую мы называем моделью Model.

Model —  полностью UI НЕзависима. Model вбирает в себя все данные Data и логику Logic, которые  описывают “ЧТО” делает ваше приложение. View — это то, «КАК» ваше приложение предстает перед пользователем,  Model — это то, “ЧТО”  ваше приложение делает на самом деле. Model — единственный источник ИСТИНЫ (“Truth”) для данных, которые представляют нашу игру. 

 View всегда будет отражением текущего состояния Model. View по большому счету вообще не имеет состояния State (то есть оно stateless). Ему не нужно хранить слишком много информации о состояниях State, потому что ИСТИНА (“Truth”) о состоянии игры всегда находится в Model. В демонстрационном приложении Memorize, который мы делали на прошлой неделе, всё своё время мы проводили за написанием кода для переменной var body нашего View. Этот var body всегда должен что-то возвращать на основе текущего состояния Model. Views — неизменны (immutable). Их нельзя изменить. Следовательно, нет другого способа изменить наш View, кроме как целиком перестроить var body. Следовательно, 100% того, как  выглядит View, определяется исключительно тем, что находится в  реализации переменной var body.

Мы называем этот вид кодирования декларативным, потому что мы декларируем в переменной var body, как выглядит пользовательский интерфейс (UI) нашего View. Конец истории. Это противоположно виду кодирования, к которому мы привыкли и который мы называем императивным.

Читать далее

Лекция 2. Узнаем ещё больше о SwiftUI. CS193P Spring 2021.

Это вторая Лекция курса Stanford CS193p, весна 2021 года. В первой лекции мы начали создавать карту с некоторым текстом Text («Hello, world!») («Привет мир!») для карточной игры «на запоминание» Memorize

В первой Лекции мы научились модифицировать текст Text, изменив его цвет foregroundColor(.red), создав вокруг него Отступы padding(), а затем объединив его с другим View, прямоугольником с закругленными углами RoundedRectangle, с помощью ZStack

На Лекции 2 мы сделаем еще больший скачок и создадим несколько карт вместо одной. Профессор не создает полную сетку из карт за один раз…

… а делает это постепенно, шаг за шагом, по ходу дела проводя обучение как языку программирования Swift «с нуля», как он и обещал, так и SwiftUI, постепенно открывая его поразительные возможности. Я вкратце перечислю его шаги.

Читать далее

Лекция 1. Начало работы со SwiftUI. Часть 2. CS193P Spring 2021.

Это продолжение Лекции 1. Начало работы со SwiftUI. CS193P Spring 2021.

Начало Лекции 1 можно посмотреть здесь.

Мы вернемся к синтаксису some View через секунду и поймем, что на самом деле это означает. Но сначала я хочу поговорить об этом небольшом фрагменте кода:

Что это такое? Это просто код, который следует сразу после переменной var body: some View. На самом деле это функция, и я сказал вам, что Swift — это язык функционального программирования, а в языках функционального программирования функции действительно очень важны.

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

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

Читать далее

Лекция 12 CS193P Spring 2020 — Core Data.

На Лекции 12 курса Стэнфорда CS193p — «Developing  Application for iOS» Spring 2020 («Разработка приложений для iOS») Пол Хэгерти продолжает излагать темы, которые не являются обязательными на этом курсе, но могут реально понадобится студентам в создании полноценных финальных проектов. Рассматривается уже вторая из таких дополнительных тем, а именно супер эффективная объектно-ориентированная система постоянного хранения в iOS — база данных Core Data

В начале профессор рассматривает теоретические основы Core Data и вопросы её интеграции в SwiftUI. Потом следует большой демонстрационный пример, цель которого состоит в преобразовании приложения Enroute таким образом, чтобы использовать базу данных Core Data для хранения всей информации, поступающей от трекера полетов FlightAware, и построении полноценного UI исключительно на просмотре базы данных Core Data.

И, надо отдать должное Apple, она решает проблему взаимодействия столь разных Миров как Core Data и SwiftUI фантастически элегантным способом.

Читать далее

Лекция 11 CS193P Spring 2020 — Enroute Picker.

На Лекции 11 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») Пол Хэгерти констатирует, что основные темы SwiftUI уже пройдены на предыдущих 10 Лекциях и сейчас студенты должны сосредоточиться на создании финального проекта. Пол Хэгерти выкладывает Лекции 11-14 в поддержку тем, которые не являются обязательными, но могут реально понадобится студентам в создании полноценных финальных проектов. На Лекции 11, первой из этой череды Лекций, рассматривается очень важная тема — Picker (средство выбора). Эта тема рассматривается в контекст нового приложения, не Memorize и не Emoji Art, это приложение под названием Enroute.

Приложение Enroute, по сути, использует API, которое доступно в интернете от компании FlightAware, и вы можете видеть, что оно действительно загружает информацию о рейсах. На рисунке в заголовке этого поста вы видите, что приложение Enroute загружает рейсы, которые находятся по пути в Сан-Франциско в международный аэропорт KSFO. Это код аэропорта. Нам сообщают, например, что SkyWest рейс прибывает сегодня в 11:42, то есть через 2 минуты. Он летит из Лос-Анджелеса. Нам сообщают обо всех рейсах, различных авиакомпаний, различных аэропортах отправления и т.д. В отличие от других демонстрационных примерах, которые мы разрабатывали «с нуля», на Лекции 11 мы получаем готовое начальное приложение Enroute, которое способно загружать рейсы с сайта FlightAware. 

Наша задача на Лекции 11 состоит в том, чтобы разработать UI, с помощью которого можно будет осуществлять фильтрацию рейсов по аэропорту прибытия destination, по аэропорту отправления origin, по авиакомпании airline и по тому, находятся рейсы уже в воздухе или еще ожидают вылета на земле inTheAir. Надо сказать, типичная задача для многих приложений. И нам будет необходим Picker, чтобы сделать это, потому что мы собираемся выбирать аэропорты, выбирать авиакомпании и делать другие подобные вещи. Picker отлично для этого подходит. Весь демонстрационный пример Лекции 11 посвящен созданию такого UI в виде Редактора Фильтра с помощью Picker (95% времени) и Toggle (5% времени).

Читать далее

Лекция 9 CS193P Spring 2020 — Поток данных (Data Flow).

На Лекции 9 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») Пол Хэгерти рассматривает супер важную тему — Property Wrappers (“Обертки Свойства”). Мы наконец-то поймем, что такие вещи, как @State и @Published, делают “под капотом”. Далее профессор слегка затрагивает тему “издателей” Publishers, потому что если мы начинаем говорить о @Published, то быстро приходим к этой очень важной теме, однако на этой Лекции 9 дается лишь некоторый обзор на эту тему, более подробно эта тема будет обсуждаться позже. 

Затем мы погружаемся в демонстрационный пример, в котором профессор показывает нам где, когда и как используются “издатели” Publishers, а также говорит о @Binding, который является новой для нас Property Wrapper (“Оберткой Свойства”). Сочетание этих двух механизмов позволяет нам ссылаться на «единственный источник истины» (source of truth) для данных, а не требовать их копирования, что может быть подвержено ошибкам.

Читать далее

Лекция 7 CS193P Spring 2020 — Многопоточный EmojiArt.


На Лекции 7 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») вначале рассматриваются две короткие темы: цвета Colors и изображениях Images. SwiftUI цвет Color рассматривается в сравнении со старым, но очень функциональным классом UIColorSwiftUI изображение Image рассматривается в сравнении со старым, но очень функциональным классом UIImage. Затем профессор полностью погружается в главную тему Лекции 7 — многопоточность, и завершает Лекцию громадным демонстрационным приложением EmojiArt, разрабатываемым «с нуля»  с использованием таких SwiftUI API, как ScrollView, Image, Drag & Drop, overlay для создания инструментов «эмоджи художника”.

Читать далее