Лекция 10. Жесты. CS193P Spring 2021.

Это Лекция 10 курса Stanford CS193p, весна 2021 года.

На прошлой Лекции 9 мы узнали многое о многопоточности. Мы также стали специалистами по технологии Drag & Drop (перетягивание и «сброс)», теперь пришло время использовать этот механизм для формирования нашего фонового изображения background. Мы хотим иметь возможность перетаскивать (Drag) изображение из Safari, “сбрасывать” его на наш документ и формировать background нашего документа. В таком сценарии мы будет отвечать только за “сброс” (Drop), перетаскивание (Drag) выполняется Safari. Так что нам даже не нужен модификатор .onDrag, нам достаточно иметь просто .onDrop.

В нашем documentBody уже есть модификатор .onDrop, предназначенный для «сброса» наших маленьких эмодзи из палитры, теперь мы заинтересованы также в получении URL-адресов изображения .url, а также самого изображения .image. Профессор показывает, как просто можно дополнять перечень «сбрасываемых» и загружаемых объектов в модификатор .onDrop.

Но дело в том, что сброс URL-адреса изображения предполагает последующую его загрузку из интернета, а это может занять несколько секунд или даже минуту при медленном интернете. В этом случае, если не предпринять надлежащие меры, наше приложение может просто «замереть», заставить пользователя нервничать и он может буквально “убить” наше приложение, a затем вообще стереть его со своего устройства. Необходимость любой ценой сохранить отзывчивость UI для пользователя вынуждает нас использовать многопоточность, о которой мы говорили на слайдах на прошлой лекции. На этом стэнфордском курсе использование многопоточности рассматривается исключительно в этом очень важном аспекте, связанным с НЕ блокировкой UI. Мы не будем блокировать UI, если все, что может заблокировать наш UI, будет выполняться на другом потоке. О том, как это можно сделать, было рассказано на прошлой Лекции 9, а на этой Лекции профессор конкретно демонстрирует это в приложении EmojiArt.

Читать далее

Лекция 9. EmojiArt Drag / Drop. CS193P Spring 2021.

Это девятая Лекция курса Stanford CS193p, весна 2021 года. На Лекции 9 профессор рассматривает несколько разнообразных тем, прежде, чем погрузится в совершенно новый демонстрационный пример EmojiArt :

  • Коллекции Collection Identifiable элементов
  • Цвета: Color,  UIColor и  CGColor
  • Изображения: Image, UIImage
  • Drag & Drop в SwiftUI
  • Демонстрационный пример EmojiArt, MVVM, Drag & Drop эмодзи 
  • Многопоточное программирование в части НЕ блокировки UI

Коллекции Collection Identifiable элементов

Начинается Лекция 9 с очень интересной темы — коллекции Collection идентифицируемых Identifiable структур struct, которые являются Value ТИПами. Понятно, почему к таким коллекциям возник повышенный интерес в SwiftUI. Дело в том, что одна из основных синтаксических конструкций SwiftUI ForEach — превращает элементы именно такой коллекции в Views, которые в последующем объединяются в контейнеры вроде ZStack, VStack, HStack и т.д. Конечно, хочется комфортно общаться с такими коллекциями, а не использовать каждый раз довольно неуклюжий вариант firstIndex(where: { $0.id = card.id }). В этой ситуации профессор демонстрирует нам применение так называемого протокольно-ориентированного программирования в Swift, когда в расширениях extension соответствующих протоколов protocol вы реализуете нужные вам функции. Конечно, это продвинутое программирование в Swift, но выглядит оно просто, элегантно и мощно. В результате мы получаем для массивов Array, а также множеств Set и словарей Dictionary с Identifiable элементами такие удобные функции как remove, index (matching:) и индексацию (subscripting), которая позволяет изменять свойства элементов коллекции напрямую.

Читать далее

Задание 6 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery с постоянным хранением (persistent). Решение.

Содержание

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Programming: Project 6: Persistent Image Gallery″. На русском языке вы можете скачать Задание 6 здесь: «Задание VI: Галерея изображений Image Gallery с постоянным хранением (persistent)»

Для решения Задания 6 необходимо ознакомиться с Лекцией 7, Лекцией 11Лекцией 12 , Лекции 13 и Лекцией 14.

Цель этого Задания 6 — понять  работу FileManager, URL, Codable, UIDocument и UIDocumentBrowserViewController и изучить, как пользоваться iOS API полностью самостоятельно по документации.

Это Задание использует код, который вы создали в Задании 5, но, возможно, вы захотите начать новый Xcode проект “с нуля” (так что вы сможете использовать Document Base App шаблон).

Мое решение обязательных и допонительных пунктов Задания 6 находится на Github  для iOS 11 и на Github для iOS 12:

ImageGallery_6_Requied_OLD — сохранение Модели в файловой системе без UIDocumentBrowserViewController

ImageGallery_6_Requed_Browser— подключение UIDocumentBrowserViewController, но пока присутствует кнопка «Sav

ImageGallery_6_Requed_Browser_No_Save_Button — работает UIDocumentBrowserViewController, но НЕТ кнопки «Save», используется URLCache,

ImageGallery_6_Requed_Browser_No_Save_Button_LocalImage — присутствует UIDocumentBrowserViewController, НЕТ кнопки «Save«, используется URLCache, сохранение изображений, для которых нет URL, производится в локальной файловой системе, документ имеет свой  UTI .imagegallery.

Пункты 1, 2 обязательные

  1. Документы Image Gallery в вашем приложении теперь должны сохраняться постоянно.
  2. Вы можете полностью убрать поддержку таблицы UITableView, добавленную на прошлой неделе.

Приложение Image Gallery — это как раз такое приложение, которое естественно хочется превратить в приложение, основанное на документах, то есть Document based app. Потому что с помощью Image Gallery вы можете создавать тематические живописные Галереи Изображений, и определенно вы захотите их сохранить.

Читать далее

Задание 5 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery. Решение дополнительных пунктов.

Содержание

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Programming: Project 5: Image Gallery″. На русском языке вы можете скачать Задание 5 здесь:  Задание 5.pdf

Для решения Задания 5 необходимо ознакомиться с Лекцией 7, Лекцией 11Лекцией 12 и началом Лекции 13.

Логически выполнение обязательных пунктов Задания 5 распалось на две части: первая часть ( ей был посвящен пост «Задание 5 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery. Решение обязательных пунктов. Часть 1) обеспечивает работу одной Галереи Изображений Image Gallery и использует исключительно коллекцию Collection View, а вторая часть ( ей был посвящен пост «Задание 5 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery. Решение обязательных пунктов. Часть 2.») обеспечивает работу со списком имен Галерей Изображений с помощью таблицы Table View, которая взаимодействует с коллекцией изображений Collection View.

Этот пост мы посвятим оставшимся дополнительным пунктам (Extra Credit) Задания 5.

Мое решение обязательных и дополнительных пунктов Задания 5 находится на Github для iOS 11 и на Github для iOS 12 в папке ImageGallery_V. В разных папках размещен код для нескольких последовательных этапов выполнения Задания 5:

  1. ImageGalleryOnly — работает только коллекция изображений Сollection View
  2. ImageGalleryRequiedTable — работает только таблица имен Table View
  3. ImageGalleryRequiedTwoSeguesSplit View Controller с двумя Segues для разных ПРОТОТИПОВ
  4. ImageGalleryRequiedGenericSegueSplit View Controller с одним Segue и ручным «переездом»
  5. ImageGalleryRequiedNoSegueSplit View Controller без Segue для iPad (обязательные пункты в наиболее комфортном для пользователя исполнении)
  6. ImageGalleryRequiedNoSegueExtra — ОКОНЧАТЕЛЬНЫЙ ВАРИАНТ Задания 5 с обязательными и дополнительными пунктами.

Пункт 1 дополнительный (Extra Credit)

Позвольте пользователям перетаскивать Drag элементы коллекции Collection View в “мусорный бак” (возможно на навигационной панели вверху), что удалит этот URL из Галереи изображений (Image Gallery).

Идея того, как это можно сделать, заключается в следующем.

Читать далее

Задание 5 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery. Решение обязательных пунктов. Часть 2.

Содержание

В Задании 5 вы должны освоить работу с Table View, Collection View, Scroll View и Text Fields, понять, как работает многопоточность (multithreading) и механизма Drag & Drop

Разработка Задания 5 начинается “с нуля”. Оно не имеет отношения к первым 4-м Заданиям этого семестра.

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Programming: Project 5: Image Gallery″. На русском языке вы можете скачать Задание 5 здесь: Задание 5.pdf.

Для решения Задания 5 необходимо ознакомиться с Лекцией 7, Лекцией 11Лекцией 12 и началом Лекции 13.

Центральной частью этого Задания 5 является коллекция изображений Collection View, которая моделирует Галерею Изображений Image Gallery. Необходимо обеспечить ее работоспособность, настроить ее параметры для отображения изображений в удобной и визуально привлекательной форме, подключить определенные жесты для операций над ее элементами, а также наделить ее механизмом Drag & Drop, который позволит добавлять изображения из других приложений, например, поисковой системы Google, и избавляться от ненужных элементов, кидая их в «Мусорный контейнер». В приложении предполагается создание целой серии таких тематических Галерей Изображений, каждой из которых будет дано имя, а список имен всех Галерей размещен в таблице Table View, которую тоже можно будет редактировать.

Логически выполнение обязательных пунктов Задания 5 распадается на две части: первая часть ( ей был посвящен пост «Задание 5 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery. Решение обязательных пунктов. Часть 1.») будет обеспечивать работу одной Галереи Изображений Image Gallery и будет использовать исключительно коллекцию Collection View, а вторая часть будет обеспечивать работу со списком имен Галерей Изображений с помощью таблицы Table View, функционирование которой мы отработаем отдельно, а затем подстыкуем к ней коллекцию Collection View, уже настроенную под Галерею изображений Image Gallery.

Вторая часть будет представлена в этом посте.

Мое решение обязательных пунктов Задания 5 находится на Github для iOS 11 и на Github для iOS 12  в папке ImageGallery_V. Задание очень большое и сложное, поэтому я разместила код для нескольких последовательных этапов его выполнения, что позволит вам проверять ваш код на разных стадиях выполнения Задания 5:

  1. ImageGalleryOnly — работает только коллекция изображений Сollection View
  2. ImageGalleryRequiedTable — работает только таблица имен Table View
  3. ImageGalleryRequiedTwoSeguesSplit View Controller с двумя Segues для разных ПРОТОТИПОВ
  4. ImageGalleryRequiedGenericSegueSplit View Controller с одним Segue и ручным «переездом»
  5. ImageGalleryRequiedNoSegueSplit View Controller без Segue для iPad (наиболее комфортный для пользователя), это ОКОНЧАТЕЛЬНЫЙ ВАРИАНТ выполнения обязательных пунктов Задания 5.

Читать далее

Что нового в Swift 4.2

Оглавление

  1. Bool.toggle
  2. Алгоритмы для Sequence и Collection
  3. Перечисление всех cases enum
  4. Случайные числа
  5. Hashable redesign
  6. Условное соответствие (протоколам)
  7. Dynamic member lookup
  8. #error and #warning
  9. MemoryLayout.offset(of:)
  10. @inlinable
  11. Immutable withUnsafePointer

Требования

Этому playground требуется Xcode 10 или свежий слепок Swift 4.2. Скачать Xcode 10 beta можно здесь а слепок Swift 4.2 здесь.

Обратите внимание

Этот playground фокусируется на новых, ориентированных на программистов особенностях, которые могут быть легко продемонстрированы в формате playground. Swift 4.2 содержит гораздо больше изменений, чем перечислено здесь. Под капотом Swift 4.2 множество усовершенствований, в том числе новые возможности Swift Package Manager.

Взгляните на полный список изменений (changelog), а также на полный список реализованных в Swift 4.2 предложений (который содержит ряд предложений реализованных, но не упомянутых в changelog).

Читать далее

Задание 5 Stanford CS 193P Fall 2017. Галерея изображений Image Gallery. Решение обязательных пунктов. Часть 1.

Содержание

В этом Задании вы должны освоить работу с Table View, Collection View, Scroll View и Text Fields, понять, как работает многопоточность (multithreading). 

Разработка этого Задания начинается “с нуля”. Оно не имеет отношения к первым 4-м Заданиям этого семестра.

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Programming: Project 5: Image Gallery″. На русском языке вы можете скачать Задание 5 здесь: Задание 5.pdf.

Для решения Задания 5 необходимо ознакомиться с Лекцией 11Лекцией 12 и началом Лекции 13.

Мое решение Задания 5 находится на Github для iOS 11 и на Github для iOS 12 в папке ImageGallery_V. Для этого поста это вариант ImageGalleryOnly.

Центральной частью этого Задания 5 является коллекция изображений Collection View, которая моделирует Галерею Изображений Image Gallery. Необходимо обеспечить ее работоспособность, настроить ее параметры для отображения изображений в удобной и визуально привлекательной форме, подключить определенные жесты для операций над ее элементами, а также наделить ее механизмом Drag & Drop, который позволит добавлять изображения из других приложений, например, поисковой системы Google, и избавляться от ненужных элементов, кидая их в «Мусорный контейнер». В приложении предполагается создание целой серии таких тематических Галерей Изображений, каждой из которых будет дано имя, а список имен всех Галерей размещен в таблице Table View, которую тоже можно будет редактировать.

Логически выполнение обязательных пунктов Задания 5 распадается на две части: первая часть ( ей посвящен этот пост) будет обеспечивать работу одной Галереи Изображений Image Gallery и будет использовать исключительно коллекцию Collection View, а вторая часть будет обеспечивать работу со списком имен Галерей Изображений с помощью таблицы Table View, функционирование которой мы отработаем отдельно, а затем подстыкуем к ней коллекцию Collection View, уже настроенную под Галерею изображений Image Gallery.

Вторая часть будет представлена в следующем посте.

Читать далее

Сказ о том как один из flatMap превратился в compactMap

Swift совмещает возможности объектно-ориентированного и функционального программирования. Если объектно-ориентированная часть оттачивалась десятилетиями на Objective-C и вошла составной частью в SwiftObjective-C и Swift практически одинаковый SDK), то часть, связанная с функциональным программированием продолжает оставаться в тени, изредка «поблескивая» отдельными довольно простыми решениями. Но вот появился прекрасный ресурс pointfree.co, посвященный исключительно функциональному программированию в Swift. Мы решили воспользоваться этим и представить вашему вниманию перевод бесплатного фрагмента, касающегося переименования одной из перегрузок (overload) функции высшего порядка flatMap в compactMap. Но это лишь повод для того, чтобы вы смогли проследить ход мысли программистов, заточенных на функциональное программирование. Столкнувшись с переименованием перегрузки (overload) функции обычный один программист лишь испытает раздражение, другой проведет методичный, но узкий анализ причины этого переименования, а гуру по функциональному программированию может сделать пару любопытных открытий, элегантно дополняющих арсенал функционального программирования на Swift.

Swift 4.1 упразднил и переименовал определенную перегрузку (overload) функции flatMap. Что делает этот flatMap отличным от других? Мы исследуем это и в результате увидим, как понимание этого различия поможет нам изучить обобщение этой операции над другими структурами и получить новый полезный код!

Читать далее

Лекция 17 CS193P Fall 2017 — Core Motion & Camera.

Лекция 17 посвящена некоторых специфических API доступа к оборудованию (hardware) нашего устройства. Рассматриваются два API: это Core Motion, отвечающее, главным образом, за определение местоположения устройства в пространстве в процессе перемещения устройства, и Фотокамера (Camera), с помощью которой мы можем сделать фотографию и/или видео и разместить их в своем приложении.

Итак, CoreMotion — это объектно-ориентированное API для доступа к первичным датчикам движения на вашем устройстве. Core Motion поставляет в приложение данные первичных датчиков Apple приборов: акселерометра (accelerometer), гироскопа (gyro) и магнитометра (magnetometer).

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

Датчики движения в iOS — удивительный механизм. И надо отдать должное инженерам Apple — подключение датчиков к приложению является предельно простым, а их дальнейшее использование не ограничивает вас ни в чём. Как и все приложения, дополненные реальностью, они захватывают в первую очередь тем, что дают вам в руки инструмент для преобразования информации об окружающем вас мире в виртуальный мир вашего телефона. Профессор показывает  демонстрационный пример игры в карты Playing Cards, дополняя ее элементами реального Мира, а именно реальным ускорением свободного падения, полученным с акселерометра. Эти показания датчика движения нашего устройства (iPhone или iPad) «подцепляются» к «поведению» гравитации UIGravityBehavior, действующему в динамическом аниматоре Dynamic Animator.  Читать далее

Лекция 16 CS193P Fall 2017 — Еще больше Segues.

Вся Лекция 16 посвящена Segues. Мы уже изучили на прошлых Лекциях Show segue и Show Detail segue, которые работают в Navigation Controllers и Split View Controllers.

На Лекции 16 изучаются все оставшиеся типы Segues: Modal, Unwind, Popover, Emded.

Сначала излагается теоретическая часть по каждому виду Segue, а затем для этого вида Segue следует небольшой демонстрационный пример, показывающий Segue в действии. В результате у профессора формируется блестящий демонстрационный пример, в котором несмотря на различия Segues — Modal и Popover адаптируют свое представление на iPhone, а функционирование Emded вообще не зависит от платформы, все Segues создают новые MVCs,  а Unwind — нет, —  все они работают «бок о бок» в одном приложении и даже разделяют код.

Читать далее