SlideShare a Scribd company logo
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Нестандартная верстка для
стандартных компонентов в iOS
Зимин Александр
iOS Developer
UI Engineer
CocoaHeads
Russia
macOS Developer
Co-Founder
Организатор
Маркетинг, Дизайн, Аналитика, …
План
• Верстка в iOS
• Table View/Collection View
• 4 примера-истории
• Советы и оптимизация
Верстка в iOS
• Распространение элементов на экране
• Отступы, размеры, выравнивания, …
• Динамические коллекции
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Airbnb
Airbnb
UICollectionView
Custom Pagining
UICollectionView
Custom Pagining
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
UITableView UICollectionView
Table View/Collection View
Scroll View
• Контент может быть больше
экрана
• Позволяет прокручивать по
оси x и y
Cell
Cell
Cell
Table View
Cell
Cell
Cell
Table View
Data Source
Delegate
Cell
Cell
Cell
Table View
Data Source
Delegate
Cell Data
Cell
Cell
Cell
Table View
Data Source
Delegate
Cell Data
“Although UITableView allows vertical scrolling only”
Cell
Cell
Cell
Table View
Data Source
Delegate
Cell Data
“Although UITableView allows vertical scrolling only”
Cell Height
Cell
Cell
Cell
Table View
Data Source
Delegate
Cell Data
“Although UITableView allows vertical scrolling only”
Cell Height
Dynamic Height
Cell
Cell
Cell
Table View
Data Source
Delegate
Cell Data
“Although UITableView allows vertical scrolling only”
Cell Height
Dynamic Height
8
Cell Cell
Cell
Cell Cell
Collection View
Data Source
Delegate
Cell Cell
Cell
Cell Cell
Collection View
Data Source
Delegate
Cell Data
Cell Cell
Cell
Cell Cell
Collection View
Data Source
Delegate
Cell Data
Cell Cell
Cell
Cell Cell
Collection ViewCollection View Layout
Data Source
Delegate
Cell Data
Cell Cell
Cell
Cell Cell
Collection ViewCollection View Layout
Layout
Attributes
Пример
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
• override func systemLayoutSizeFitting(:, :, :) -> CGSize
• Нет ничего плохого в комбинировании Auto Layout и
ручного подсчета
• Типы динамического контента:
• Картинки (UIImageView)
• Текст (UILabel, UITextView)
• Нестандартные элементы (Custom UIView/UIControl)
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
• UILabel
• func sizeThatFits(_ size: CGSize) -> CGSize
• String/NSAttributedString
• func boundingRect(with size: CGSize, options:
NSStringDrawingOptions = [], attributes: [String : Any]? = nil,
context: NSStringDrawingContext?) -> CGRect
goo.gl/pBdZlI
• UILabel
• func sizeThatFits(_ size: CGSize) -> CGSize
• String/NSAttributedString
• func boundingRect(with size: CGSize, options:
NSStringDrawingOptions = [], attributes: [String : Any]? = nil,
context: NSStringDrawingContext?) -> CGRect
goo.gl/pBdZlI
• UILabel
• func sizeThatFits(_ size: CGSize) -> CGSize
• String/NSAttributedString
• func boundingRect(with size: CGSize, options:
NSStringDrawingOptions = [], attributes: [String : Any]? = nil,
context: NSStringDrawingContext?) -> CGRect
• func boundingRect(with size: CGSize, options:
NSStringDrawingOptions = [], context:
NSStringDrawingContext?) -> CGRect
goo.gl/pBdZlI
• UIImageView
• UIImage
• CGSize
• Заранее заданный размер
• Динамическая верстка у таблиц и коллекций
существует уже давно (iOS 8+)
• В ней нет ничего плохого, и она вам упростит жизнь
• Вы всегда можете комбинировать auto layout и
ручной подсчет
• Посчитать размер String/NSAttributedString легко
Итоги демо
Пример
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Collection View Layout
Collection View Layout
prepare()
Collection View Layout
prepare()
var collectionViewContentSize: CGSize
Collection View Layout
prepare()
var collectionViewContentSize: CGSize
func layoutAttributesForElements(in rect:
CGRect) -> [UICollectionViewLayoutAttributes]?
Collection View Layout
prepare()
var collectionViewContentSize: CGSize
func layoutAttributesForElements(in rect:
CGRect) -> [UICollectionViewLayoutAttributes]?
Collection View Layout
prepare()
var collectionViewContentSize: CGSize
func layoutAttributesForElements(in rect:
CGRect) -> [UICollectionViewLayoutAttributes]?
func shouldInvalidateLayout(forBoundsChange
newBounds: CGRect) -> Bool
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
• Для любой нестандартной верстки вам хватит
UICollectionView
• Нестандартный paging находится там же
• Для оптимизации кэшируйте все заранее или в
процессе
Итоги демо
• Заготавливайте ваши значения в prepare()
• Кэшируйте значения
• Не стоит всегда возвращать true из `shouldInvalidateLayout`
• Будьте осторожнее с `estimatedItemSize`
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
• Не все то золото, что блестит
• Не жалейте ресурсов на проверку всех
поддерживаемых iOS
• Использование таких элементов по-прежнему
оправдано
Итоги демо
Анимация
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
• Вы всегда можете показать взаимодействие
пользователя с контентом
• Чем интереснее возможность, тем сложнее ее
поддерживать
Итоги демо
• Динамическая верстка — это хорошо
• Любую верткую можно реализовать на
UICollectionView, и это просто
• Чем интереснее возможность — тем больше
ответственность
• Все это можно еще анимировать
Итоги
• WWDC 2016 Inclusive App Design — https://developer.apple.com/videos/play/
wwdc2016/801/
• WWDC 2016 Making Apps Adaptive Part 1/2 — https://developer.apple.com/
videos/play/wwdc2016/222/, https://developer.apple.com/videos/play/
wwdc2016/233/
• Подсчет высоты строки — https://goo.gl/pBdZlI
Ссылки
• WWDC 2016 Inclusive App Design — https://developer.apple.com/videos/play/
wwdc2016/801/
• WWDC 2016 Making Apps Adaptive Part 1/2 — https://developer.apple.com/
videos/play/wwdc2016/222/, https://developer.apple.com/videos/play/
wwdc2016/233/
Ссылки
Спасибо за
внимание!
Зимин Александр
azimin@me.com
@ZiminAlex

More Related Content

PDF
Евгений Ртищев "Мобильная платформа на ReactNative"
PDF
Филипп Кекс "Как научить роботов играть в игры?"
PDF
Станислав Цыганов "SOA в iOS разработке"
PDF
Инструменты разные нужны, инструменты разные важны
PDF
Изоморфный JavaScript — будущее уже здесь
PDF
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
PPTX
Современная разработка сайтов на CMF Drupal.
PPTX
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
Евгений Ртищев "Мобильная платформа на ReactNative"
Филипп Кекс "Как научить роботов играть в игры?"
Станислав Цыганов "SOA в iOS разработке"
Инструменты разные нужны, инструменты разные важны
Изоморфный JavaScript — будущее уже здесь
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Современная разработка сайтов на CMF Drupal.
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)

What's hot (13)

PPTX
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
PDF
Как анимировать тысячи объектов на карте и не подвесить браузер
PPTX
course js day 1
PDF
PDF
Сделай дизайнеру приятно: Красивые веб-формы
PDF
"Flux — новый взгляд на старые проблемы" — Сергей Прохоров, MoscowJS 18
PDF
TК°Conf. Организация разработки Frontend. Виталий Слободин.
PPTX
Java осень 2012 лекция 5
PDF
Знакомство с Tizen
PDF
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
PDF
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
PDF
МРТ для данных, Frontend Conf 2016
PDF
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как анимировать тысячи объектов на карте и не подвесить браузер
course js day 1
Сделай дизайнеру приятно: Красивые веб-формы
"Flux — новый взгляд на старые проблемы" — Сергей Прохоров, MoscowJS 18
TК°Conf. Организация разработки Frontend. Виталий Слободин.
Java осень 2012 лекция 5
Знакомство с Tizen
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
МРТ для данных, Frontend Conf 2016
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ad

Similar to Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS" (20)

PDF
Backbone.js
PDF
UICollectionView — Александр Зимин
KEY
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
PDF
UWDC 2013, Как мы используем Yii
PDF
iOS-05_2-UIKit
PDF
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
PPTX
Построение собственного JS SDK — зачем и как?
PDF
iOS 7. Новые концепции и новые средства
PDF
Избавляемся от старья и переходим на SwiftUI / Руслан Кавецкий (Agora)
PDF
И снова разработка под iOS. Павел Тайкало
PDF
Регрессионное тестирование верстки
PDF
Работа со статикой в Django
PDF
Эффективность на рубеже UITableView — Александр Зимин
PDF
Фундаментальные основы разработки под iOS. Павел Тайкало
PDF
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
PDF
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
PDF
webpack: 7 бед - один ответ
PDF
Scala, SBT & Play! for Rapid Application Development
PDF
CocoaHeads Moscow. Александр Зимин. «Работа с динамичным изменением размеров ...
PDF
JavaScript Базовый. Занятие 11.
Backbone.js
UICollectionView — Александр Зимин
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
UWDC 2013, Как мы используем Yii
iOS-05_2-UIKit
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Построение собственного JS SDK — зачем и как?
iOS 7. Новые концепции и новые средства
Избавляемся от старья и переходим на SwiftUI / Руслан Кавецкий (Agora)
И снова разработка под iOS. Павел Тайкало
Регрессионное тестирование верстки
Работа со статикой в Django
Эффективность на рубеже UITableView — Александр Зимин
Фундаментальные основы разработки под iOS. Павел Тайкало
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
webpack: 7 бед - один ответ
Scala, SBT & Play! for Rapid Application Development
CocoaHeads Moscow. Александр Зимин. «Работа с динамичным изменением размеров ...
JavaScript Базовый. Занятие 11.
Ad

More from IT Event (20)

PDF
Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
PDF
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
PDF
Max Voloshin - "Organization of frontend development for products with micros...
PDF
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
PDF
Konstantin Krivlenia - "Continuous integration for frontend"
PPTX
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
PDF
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
PDF
Vladimir Grinenko - "Dependencies in component web done right"
PDF
Dmitry Bartalevich - "How to train your WebVR"
PDF
Aleksey Bogachuk - "Offline Second"
PDF
James Allardice - "Building a better login with the credential management API"
PDF
Fedor Skuratov "Dark Social: as messengers change the market of social media ...
PPTX
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
PPTX
Алексей Рагозин "Java и linux борьба за микросекунды"
PPTX
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
PDF
Наш ответ Uber’у
PDF
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
PDF
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
PDF
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
PDF
Mete Atamel "Resilient microservices with kubernetes"
Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
Max Voloshin - "Organization of frontend development for products with micros...
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
Konstantin Krivlenia - "Continuous integration for frontend"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
Vladimir Grinenko - "Dependencies in component web done right"
Dmitry Bartalevich - "How to train your WebVR"
Aleksey Bogachuk - "Offline Second"
James Allardice - "Building a better login with the credential management API"
Fedor Skuratov "Dark Social: as messengers change the market of social media ...
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
Алексей Рагозин "Java и linux борьба за микросекунды"
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
Наш ответ Uber’у
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Mete Atamel "Resilient microservices with kubernetes"

Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"