В этой небольшой статье расскажу про изменения во фреймворке UIKit, которые мне показались важными и полезными. Сразу оговорюсь — еще не имел возможности опробовать описываемые нововведения, так что статья в основном теоретическая.
Для начала — то, что лично я ожидал еще в iOS 5 — поддержка NSAttributedString в текстовых компонентах — UILabel, UITextView, UITextField, а так же поддержка отрисовки строк с атрибутами и различные вспомогательные методы для этого. Конечно, весь этот функционал был доступен и раньше, используя Core Text, но работать с API стиля Core Foundation все же сложнее, так что можно смело ожидать улучшения поддержки форматирования текста (Rich Text) во многих сторонних приложениях. В качестве примера можно посмотреть стандартное приложение Mail.
Очень важное нововведение — в iOS 6 появится Auto Layout от MacOS Lion. Теперь задавать положение компонентов интерфейса относительно друг друга станет проще. В кратце, Auto Layout позволяет задать набор ограничений (constraints), связывающих компоненты, например позволяет задавать границы размеров, зависимости между компонентами. Надеюсь это позволит облегчить создание интерфейса для нескольких языков (сейчас иногда приходится создавать отдельный nib/storyboard), включая арабские с написанием справа налево, а также упростит настройку интерфейса в зависимости от ориентации устройства. На данный момент документации для iOS по Auto Layout еще нет, нам предлагают документацию от MacOS.
UITableView, конечно, не могли оставить без внимания. Добавлен класс UITableViewHeaderFooterView для задания пользовательских view верхних и нижних колонтитулов (header/footer) секций. Также при создании данному классу можно задать reuseIdentifier, в таком случае UITableView поместит колонтитул в очередь для повторного использования. Приятное нововведение — возможность регистрации класса либо nib’а, который будет использоваться для создания очередной ячейки таблицы. Обновился протокол делегата таблицы, теперь он позволяет узнавать когда таблица перестает использовать ячейку либо колонтитул для отрисовки, также появились дополнительные методы для управления подсветкой ячеек. UITableViewController обзавелся свойством refreshControl, позволяющим задать UIRefreshControl для обновления таблицы. Возможно этот контрол есть pull to refresh, возможно он будет отличаться.
Появилось интересное развитие UITableView — UICollectionView, который позволяет задать расположение данных в несколько колонок, по кругу итд. В целом внутреннее устройство очень похоже на таблицу — есть источник данных (data source) с похожим протоколом, есть делегат и контроллер. Но есть и серьезные отличия — данный класс изначально работает с учетом последних изменений в TableView, т.е. требует регистрации класса либо nib’а, которые будут использоваться для создания новых ячеек и дополнительных view (Supplementary View и Decoration View). Так же появился общий класс UICollectionReusableView, от которого наследуется как класс ячейки UICollectionViewCell так и классы, используемые в качестве дополнительных. Важное отличие от таблицы — класс UICollectionViewLayout, который собственно позволяет задать расположение ячеек и их вид с помощью атрибутов, которые объединены в класс UICollectionViewLayoutAttributes. Интересно что в том числе есть атрибуты transform3D и zIndex, что позволит создавать интересные расположения ячеек в трехмерном пространстве. Разработчикам нужно будет создавать собственные реализации класса UICollectionViewLayout, либо использовать предоставленную конкретную реализацию, представляющую собой расположение элементов сеткой — UICollectionViewFlowLayout. Примеры использования уже можно увидеть на скриншотах беты iOS 6, например интерфейс выбора как поделиться какой-либо информацией (Facebook, Twitter, Print и т.д.) скорее всего реализован на основе UICollectionViewFlowLayout.
Следующее интересное нововведение — UIActivityViewController, позволяющий упростить шаринг данных и заменить сторонние ShareKit и прочие аналоги. При создании контроллеру передается массив объектов, над которыми могут быть произведены действия и массив самих действий. На данный момент поддерживаются Facebook, Twitter, Weibo (как быстро полюбили Китай!), отправка данных по почте, с помощью приложения Messages, печать объекта, копирование объекта на Pasteboard и установка объекта (изображения) контакту. Также возможно создание собственных сервисов.
Ну и последнее — UI State Preservation позволяет сохранить состояние и при повторном запуске восстановить его. Во время сохранения приложение указывает какие view и контроллеры нужно сохранить плюс сохраняет дополнительные данные, и при восстановлении указанные view и контроллеры будут восстановлены. При должном использовании это позволит еще сильнее упростить работу пользователей с приложениями iOS — не надо сохранять, экспортировать, синхронизировать, вспоминать что делал и т.д., iOS предоставляет все больше и больше решений для разработчиков чтобы сделать работу пользователей/клиентов еще приятнее.
Ну и кратенький вывод. Я описал основные, на мой взгляд, изменения во фреймворке UIKit, хотя и остальные фреймворки получили солидные изменения, появились и новые фреймворки (Social, Pass Kit). И хотя каждая новая версия iOS кажется все менее значительной, я это отношу к зрелости самой платформы, ведь текущая версия iOS предоставляет потрясающие возможности, и удивить разработчиков становится все сложнее и сложнее. Те же изменения, которые представила Apple, позволят сделать общение пользователя с приложениями еще более приятным, и именно эти качественные изменения в iOS 6 составляют на мой взгляд наибольший интерес для разработчиков. Появление же Auto Layout от старшего собрата в очередной раз показывает влияние iOS и MacOS друг на друга. Долго ли осталось ждать их объединения и как это произойдет?
NSAttributedString и UIKit
Для начала — то, что лично я ожидал еще в iOS 5 — поддержка NSAttributedString в текстовых компонентах — UILabel, UITextView, UITextField, а так же поддержка отрисовки строк с атрибутами и различные вспомогательные методы для этого. Конечно, весь этот функционал был доступен и раньше, используя Core Text, но работать с API стиля Core Foundation все же сложнее, так что можно смело ожидать улучшения поддержки форматирования текста (Rich Text) во многих сторонних приложениях. В качестве примера можно посмотреть стандартное приложение Mail.
Auto Layout в iOS
Очень важное нововведение — в iOS 6 появится Auto Layout от MacOS Lion. Теперь задавать положение компонентов интерфейса относительно друг друга станет проще. В кратце, Auto Layout позволяет задать набор ограничений (constraints), связывающих компоненты, например позволяет задавать границы размеров, зависимости между компонентами. Надеюсь это позволит облегчить создание интерфейса для нескольких языков (сейчас иногда приходится создавать отдельный nib/storyboard), включая арабские с написанием справа налево, а также упростит настройку интерфейса в зависимости от ориентации устройства. На данный момент документации для iOS по Auto Layout еще нет, нам предлагают документацию от MacOS.
Изменения в UITableView
UITableView, конечно, не могли оставить без внимания. Добавлен класс UITableViewHeaderFooterView для задания пользовательских view верхних и нижних колонтитулов (header/footer) секций. Также при создании данному классу можно задать reuseIdentifier, в таком случае UITableView поместит колонтитул в очередь для повторного использования. Приятное нововведение — возможность регистрации класса либо nib’а, который будет использоваться для создания очередной ячейки таблицы. Обновился протокол делегата таблицы, теперь он позволяет узнавать когда таблица перестает использовать ячейку либо колонтитул для отрисовки, также появились дополнительные методы для управления подсветкой ячеек. UITableViewController обзавелся свойством refreshControl, позволяющим задать UIRefreshControl для обновления таблицы. Возможно этот контрол есть pull to refresh, возможно он будет отличаться.
Преемник UITableView — UICollectionView
Появилось интересное развитие UITableView — UICollectionView, который позволяет задать расположение данных в несколько колонок, по кругу итд. В целом внутреннее устройство очень похоже на таблицу — есть источник данных (data source) с похожим протоколом, есть делегат и контроллер. Но есть и серьезные отличия — данный класс изначально работает с учетом последних изменений в TableView, т.е. требует регистрации класса либо nib’а, которые будут использоваться для создания новых ячеек и дополнительных view (Supplementary View и Decoration View). Так же появился общий класс UICollectionReusableView, от которого наследуется как класс ячейки UICollectionViewCell так и классы, используемые в качестве дополнительных. Важное отличие от таблицы — класс UICollectionViewLayout, который собственно позволяет задать расположение ячеек и их вид с помощью атрибутов, которые объединены в класс UICollectionViewLayoutAttributes. Интересно что в том числе есть атрибуты transform3D и zIndex, что позволит создавать интересные расположения ячеек в трехмерном пространстве. Разработчикам нужно будет создавать собственные реализации класса UICollectionViewLayout, либо использовать предоставленную конкретную реализацию, представляющую собой расположение элементов сеткой — UICollectionViewFlowLayout. Примеры использования уже можно увидеть на скриншотах беты iOS 6, например интерфейс выбора как поделиться какой-либо информацией (Facebook, Twitter, Print и т.д.) скорее всего реализован на основе UICollectionViewFlowLayout.
UIActivityViewController — замена ShareKit
Следующее интересное нововведение — UIActivityViewController, позволяющий упростить шаринг данных и заменить сторонние ShareKit и прочие аналоги. При создании контроллеру передается массив объектов, над которыми могут быть произведены действия и массив самих действий. На данный момент поддерживаются Facebook, Twitter, Weibo (как быстро полюбили Китай!), отправка данных по почте, с помощью приложения Messages, печать объекта, копирование объекта на Pasteboard и установка объекта (изображения) контакту. Также возможно создание собственных сервисов.
UI State Preservation
Ну и последнее — UI State Preservation позволяет сохранить состояние и при повторном запуске восстановить его. Во время сохранения приложение указывает какие view и контроллеры нужно сохранить плюс сохраняет дополнительные данные, и при восстановлении указанные view и контроллеры будут восстановлены. При должном использовании это позволит еще сильнее упростить работу пользователей с приложениями iOS — не надо сохранять, экспортировать, синхронизировать, вспоминать что делал и т.д., iOS предоставляет все больше и больше решений для разработчиков чтобы сделать работу пользователей/клиентов еще приятнее.
Вывод?
Ну и кратенький вывод. Я описал основные, на мой взгляд, изменения во фреймворке UIKit, хотя и остальные фреймворки получили солидные изменения, появились и новые фреймворки (Social, Pass Kit). И хотя каждая новая версия iOS кажется все менее значительной, я это отношу к зрелости самой платформы, ведь текущая версия iOS предоставляет потрясающие возможности, и удивить разработчиков становится все сложнее и сложнее. Те же изменения, которые представила Apple, позволят сделать общение пользователя с приложениями еще более приятным, и именно эти качественные изменения в iOS 6 составляют на мой взгляд наибольший интерес для разработчиков. Появление же Auto Layout от старшего собрата в очередной раз показывает влияние iOS и MacOS друг на друга. Долго ли осталось ждать их объединения и как это произойдет?