SlideShare a Scribd company logo
Эффективность на рубеже
UITableView
Зимин Александр
iOS разработчик
UX дизайнер
realmacsoftware.com/clear
План
• Методы при работе с таблицей
• UITableViewController
• Ячейки
• Кастомизация таблицы
Методы при работе с таблицей
Повторное использование
• init(style: UITableViewCellStyle, reuseIdentifier:
String?)
• registerNib(nib: UINib, forCellReuseIdentifier identifier:
String)
• registerClass(cellClass: AnyClass,
forCellReuseIdentifier identifier: String)
Повторное использование
• dequeueReusableCellWithIdentifier(identifier: String)
• dequeueReusableCellWithIdentifier(identifier: String,
forIndexPath indexPath: NSIndexPath)
Подсчет динамической высоты
• tableView(tableView: UITableView,
estimatedHeightForRowAtIndexPath indexPath:
NSIndexPath) -> CGFloat
• tableView.estimatedRowHeight = 85

tableView.rowHeight =
UITableViewAutomaticDimension
Подсчет динамической высоты
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 80
}
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) ->
CGFloat {
return 40
}
Подсчет динамической высоты
Подсчет динамической высоты
UITableViewController
Плюсы
• Скорость интеграции
• StaticCells
• Удобная интеграция UIRefreshControl
• Мелкие локальные улучшения
• Автоматическая отмена выделения
• Автоматическое отслеживание сдвига при
появлении клавиатуры
Минусы
• Нельзя задать размер таблицы
• Нельзя добавлять другие UIView на
UITableViewController
Плюсы
• Скорость интеграции
• StaticCells
• Удобная интеграция UIRefreshControl
• Мелкие локальные улучшения
• Автоматическая отмена выделения
• Автоматическое отслеживание сдвига при
появлении клавиатуры
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
// Any actions here
}
Автоматическая отмена выделения
• Подписаться на уведомления о появлении и
исчезновении клавиатуры
• Менять contentInset и scrollIndicatorInsets
• Не забыть отписаться ;)
Автоматическое отслеживание
сдвига при появлении клавиатуры
func registerForKeyboardNotifications() {
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: "keyboardWillBeShown:", name:
UIKeyboardWillShowNotification, object: nil)
notificationCenter.addObserver(self, selector: "keyboardWillBeHidden:", name:
UIKeyboardWillHideNotification, object: nil)
}
Автоматическое отслеживание
сдвига при появлении клавиатуры
func keyboardWillBeShown(notification: NSNotification) {
let keyboardFrame = notification.userInfo?[UIKeyboardFrameEndUserInfoKey]?.CGRectValue()
if let frame = keyboardFrame {
let contentInsets = UIEdgeInsetsMake(0, 0, frame.height, 0);
tableView.contentInset = contentInsets;
tableView.scrollIndicatorInsets = contentInsets;
}
}
Есть свои минусы, если contentInset кастомный
func keyboardWillBeHidden(sender: NSNotification) {
tableView.contentInset = UIEdgeInsetsZero
tableView.scrollIndicatorInsets = UIEdgeInsetsZero
}
Есть свои минусы, если contentInset кастомный
Ячейки
Свой разделитель
• Создать класс, который наследуется от
UITableViewCell
• Для ячеек, созданных с интерфейса расширяем:
• awakeFromNib() (все связи гарантированно
подгружены)
• init(coder aDecoder: NSCoder)
• Для ячеек, созданных из кода:
• init(style: UITableViewCellStyle, reuseIdentifier:
String?)
Работа с выделением
• setSelected(selected: Bool, animated: Bool)
• setHighlighted(highlighted: Bool, animated: Bool)
• Задать selectedBackgroundView
Кастомизация таблицы
Пустая таблица
• Отслеживание:
• numberOfSectionsInTableView:
• tableView(tableView: UITableView,
numberOfRowsInSection section: Int)
• Добавление:
• В коде: tableView.backgroundView
• На IB: отдельным UIView. По очереди с таблицей
делать hidden
https://itunes.apple.com/app/id498958864
Подложка
override func viewDidLoad() {
super.viewDidLoad()
holderView = UIView(frame: view.frame)
holderView.backgroundColor = UIColor.redColor()
tableView.addSubview(holderView)
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
holderView.frame = tableView.bounds
holderView.frame.origin.y = -tableView.frame.height
}
dribbble.com/shots/1948551
Кастомный Pull-To-Refresh
• Создать кастомные UIView:
• Он должен отслеживать движение scrollView
• Можно сделать через KVO
• Можно сделать через target к жесту
• В методе scrollViewDidScroll: отслеживать
contentOffset и взаимодействовать с этим View
• Добавить этот view к верху таблицы
• Если идет загрузка можно
• Двигать contentInset
• Добавлять этот view в header таблицы
realmacsoftware.com/clear
Release to Create Item
• Добавить UIPinchGestureRecognizer на таблицу
• Если жест начался, то расчитывать середину жеста
и добавлять новую ячейку
• При движении пальцев высчитывать размер для
этой ячейки и делать tableView.reloadData()
Release to Create Item
func pinchGestureAction(sender: UIPinchGestureRecognizer) {
if sender.state == .Began {
startValue = sender.scale
let point = sender.locationInView(tableView)
insertedIndexPath = tableView.indexPathForRowAtPoint(point)
} else if sender.state == .Changed {
deltaValue = abs(startValue - sender.scale)
} else {
insertedIndexPath = nil
}
reloadCells()
}
Самый элементарный вариант
Release to Create Item
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) ->
CGFloat {
if indexPath == insertedIndexPath {
return 80 * (1.0 + deltaValue)
}
return 80
}
Самый элементарный вариант
Спасибо за внимание
Зимин Александр
azimin@me.com
@ziminalex
motivatemeapp.me

More Related Content

Similar to Эффективность на рубеже UITableView — Александр Зимин

iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
Noveo
 
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
HappyDev
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
Kirill Averyanov
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
CocoaHeads
 
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
IT Event
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
e-Legion
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSГлеб Тарасов
 
Дуров Р. - Cocos2d
Дуров Р. - Cocos2dДуров Р. - Cocos2d
Дуров Р. - Cocos2d
Innim
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
Improve Group
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
Ivan Trifonov
 
Магия AsyncDisplayKit
Магия AsyncDisplayKitМагия AsyncDisplayKit
Магия AsyncDisplayKit
AnjLab
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
Anton Bukov
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsГлеб Тарасов
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
DevGAMM Conference
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 

Similar to Эффективность на рубеже UITableView — Александр Зимин (20)

iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
 
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
 
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
Александр Зимин "Нестандартная верстка для стандартных компонентов в iOS"
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
Дмитрий Захаров «Компоновка элементов пользовательского интерфейса»
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
 
Дуров Р. - Cocos2d
Дуров Р. - Cocos2dДуров Р. - Cocos2d
Дуров Р. - Cocos2d
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Магия AsyncDisplayKit
Магия AsyncDisplayKitМагия AsyncDisplayKit
Магия AsyncDisplayKit
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 

More from CocoaHeads

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
CocoaHeads
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
CocoaHeads
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOS
CocoaHeads
 
Push Notifications
Push NotificationsPush Notifications
Push Notifications
CocoaHeads
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
CocoaHeads
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
CocoaHeads
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
CocoaHeads
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
CocoaHeads
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
CocoaHeads
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
CocoaHeads
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
CocoaHeads
 

More from CocoaHeads (13)

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOS
 
Push Notifications
Push NotificationsPush Notifications
Push Notifications
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
 

Эффективность на рубеже UITableView — Александр Зимин

  • 1. Эффективность на рубеже UITableView Зимин Александр iOS разработчик UX дизайнер
  • 3. План • Методы при работе с таблицей • UITableViewController • Ячейки • Кастомизация таблицы
  • 4. Методы при работе с таблицей
  • 5. Повторное использование • init(style: UITableViewCellStyle, reuseIdentifier: String?) • registerNib(nib: UINib, forCellReuseIdentifier identifier: String) • registerClass(cellClass: AnyClass, forCellReuseIdentifier identifier: String)
  • 6. Повторное использование • dequeueReusableCellWithIdentifier(identifier: String) • dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath)
  • 7. Подсчет динамической высоты • tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat • tableView.estimatedRowHeight = 85
 tableView.rowHeight = UITableViewAutomaticDimension
  • 8. Подсчет динамической высоты func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 80 } func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 40 }
  • 12. Плюсы • Скорость интеграции • StaticCells • Удобная интеграция UIRefreshControl • Мелкие локальные улучшения • Автоматическая отмена выделения • Автоматическое отслеживание сдвига при появлении клавиатуры
  • 13. Минусы • Нельзя задать размер таблицы • Нельзя добавлять другие UIView на UITableViewController
  • 14. Плюсы • Скорость интеграции • StaticCells • Удобная интеграция UIRefreshControl • Мелкие локальные улучшения • Автоматическая отмена выделения • Автоматическое отслеживание сдвига при появлении клавиатуры
  • 15. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) // Any actions here } Автоматическая отмена выделения
  • 16. • Подписаться на уведомления о появлении и исчезновении клавиатуры • Менять contentInset и scrollIndicatorInsets • Не забыть отписаться ;) Автоматическое отслеживание сдвига при появлении клавиатуры
  • 17. func registerForKeyboardNotifications() { let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: "keyboardWillBeShown:", name: UIKeyboardWillShowNotification, object: nil) notificationCenter.addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil) } Автоматическое отслеживание сдвига при появлении клавиатуры
  • 18. func keyboardWillBeShown(notification: NSNotification) { let keyboardFrame = notification.userInfo?[UIKeyboardFrameEndUserInfoKey]?.CGRectValue() if let frame = keyboardFrame { let contentInsets = UIEdgeInsetsMake(0, 0, frame.height, 0); tableView.contentInset = contentInsets; tableView.scrollIndicatorInsets = contentInsets; } } Есть свои минусы, если contentInset кастомный
  • 19. func keyboardWillBeHidden(sender: NSNotification) { tableView.contentInset = UIEdgeInsetsZero tableView.scrollIndicatorInsets = UIEdgeInsetsZero } Есть свои минусы, если contentInset кастомный
  • 21. Свой разделитель • Создать класс, который наследуется от UITableViewCell • Для ячеек, созданных с интерфейса расширяем: • awakeFromNib() (все связи гарантированно подгружены) • init(coder aDecoder: NSCoder) • Для ячеек, созданных из кода: • init(style: UITableViewCellStyle, reuseIdentifier: String?)
  • 22. Работа с выделением • setSelected(selected: Bool, animated: Bool) • setHighlighted(highlighted: Bool, animated: Bool) • Задать selectedBackgroundView
  • 24.
  • 25. Пустая таблица • Отслеживание: • numberOfSectionsInTableView: • tableView(tableView: UITableView, numberOfRowsInSection section: Int) • Добавление: • В коде: tableView.backgroundView • На IB: отдельным UIView. По очереди с таблицей делать hidden
  • 27. Подложка override func viewDidLoad() { super.viewDidLoad() holderView = UIView(frame: view.frame) holderView.backgroundColor = UIColor.redColor() tableView.addSubview(holderView) // Do any additional setup after loading the view, typically from a nib. } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() holderView.frame = tableView.bounds holderView.frame.origin.y = -tableView.frame.height }
  • 29. Кастомный Pull-To-Refresh • Создать кастомные UIView: • Он должен отслеживать движение scrollView • Можно сделать через KVO • Можно сделать через target к жесту • В методе scrollViewDidScroll: отслеживать contentOffset и взаимодействовать с этим View • Добавить этот view к верху таблицы • Если идет загрузка можно • Двигать contentInset • Добавлять этот view в header таблицы
  • 31. Release to Create Item • Добавить UIPinchGestureRecognizer на таблицу • Если жест начался, то расчитывать середину жеста и добавлять новую ячейку • При движении пальцев высчитывать размер для этой ячейки и делать tableView.reloadData()
  • 32. Release to Create Item func pinchGestureAction(sender: UIPinchGestureRecognizer) { if sender.state == .Began { startValue = sender.scale let point = sender.locationInView(tableView) insertedIndexPath = tableView.indexPathForRowAtPoint(point) } else if sender.state == .Changed { deltaValue = abs(startValue - sender.scale) } else { insertedIndexPath = nil } reloadCells() } Самый элементарный вариант
  • 33. Release to Create Item func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { if indexPath == insertedIndexPath { return 80 * (1.0 + deltaValue) } return 80 } Самый элементарный вариант
  • 34. Спасибо за внимание Зимин Александр azimin@me.com @ziminalex