SlideShare a Scribd company logo
1 of 19
Download to read offline
iOS Internship 2014
UIKit (part II)
UIKit
framework
UIView subclassing
CALayer, transformations
UIScrollView
UITableView + UITableViewCell
UICollectionView +
UICollectionViewCell
лекция 5
(продолжение)
UIKit Framework
- (id)initWithFrame:(CGRect)frame — designated initializer
- (id)initWithCoder:(NSCoder *)aCoder — при создании объекта view из XIB/Storyboard
- (void)layoutSubviews — определяет расположение вложенных view
- (void)updateConstraints — определяет расположение вложенных view
- (void)drawRect:(CGRect)rect — выполняет отрисовку полностью кастомной view
- (CGSize)sizeThatFits:(CGSize)size — предпочтительный размер
UIView subclassing
UIKit Framework
Свойства, которые можно анимировать:
● frame
● bounds
● center
● transform
● alpha
● backgroundColor
● contentStretch
UIView animation
UIKit Framework
[UIView animateWithDuration:2 animations:^{
self.aView.transform =
CGAffineTransformRotate(self.view.transform, M_PI / 3.0);
self.textLabel.center = destinationPoint;
}];
UIView animation
UIKit Framework
Содержится в каждой UIView, отвечает за отрисовку.
● @property CGPoint anchorPoint
● @property CGColorRef borderColor
● @property CGFloat borderWidth
● @property CGFloat cornerRadius
● @property BOOL masksToBounds
● @property CGColorRef shadowColor
● @property CGSize shadowOffset
● @property float shadowOpacity
● @property CATransform3D transform
В реальности для фонов, рамок, скруглений и прочего используются картинки, т.к. это даёт
больше гибкости и работает ощутимо быстрее.
CALayer
UIKit Framework
CALayer
self.textLabel = [[UILabel alloc] initWithFrame:self.view.bounds];
self.textLabel.layer.shadowColor = [UIColor whiteColor].CGColor;
self.textLabel.layer.shadowRadius = 12;
self.textLabel.layer.shadowOpacity = 1;
self.textLabel.layer.masksToBounds = NO;
self.button = [[UIButton alloc] initWithFrame:(CGRect){20, 20, 100, 40}];
self.button.backgroundColor = [UIColor brownColor];
self.button.layer.masksToBounds = YES;
self.button.layer.cornerRadius = 8;
self.button.layer.borderWidth = 2;
self.button.layer.borderColor = [UIColor blackColor].CGColor;
UIKit Framework
● Скроллинг по контенту, который не влезает на экран полностью
● Зум контента с помощью стандартных жестов
● Анимированная навигация по отдельным экранам (паджинация)
UIScrollView
UIKit Framework
@interface ViewController ()
//...
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) IBOutlet UIScrollView *contentScroller;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.contentScroller = [[UIScrollView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.contentScroller];
self.imageView = [[UIImageView alloc] initWithImage:self.image];
[self.contentScroller addSubview:self.imageView];
self.contentScroller.contentSize = self.imageView.frame.size;
}
@end
UIScrollView
UIKit Framework
Показ большого (но конечного) количества элементов с навигацией свайпами.
UIScrollView
34 3635
cur nextprev content view
scroll view (visible area)
UIKit Framework
Показ большого (но конечного) количества элементов с навигацией свайпами.
UIScrollView
34 3635
cur nextprev content view
scroll view (visible area)
373635
cur next content viewprev
obj_1 obj_2 obj_3
obj_2 obj_3 obj_1
34
obj_1
UIKit Framework
- (void)viewDidLoad
{
[super viewDidLoad];
self.contentScroller = [[UIScrollView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.contentScroller];
self.contentScroller.delegate = self;
//...
}
// Вызывается постоянно во время скролла,
// наш код должен работать быстро!
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// Вычисляем номер элемента, центр которого ближе всего
// Если это не текущий элемент:
// - делаем видимый элемент центральным
// - подгружаем новый соседний элемент
// - исправляем координаты соседних элементов.
}
UIScrollView
UIKit Framework
● Список однородных элементов (ячейки могут быть разного типа, но основной смысл всё-таки в
повторении)
● Стандартная схема для переиспользования объектов
● Реакция на прокрутку, нажатие, свайпы
● Стандартная реализация добавления/удаления/перемещения (включая анимации)
UITableView
UIKit Framework
● Таблица запрашивает количество групп, количество ячеек, а так же сами ячейки у объекта, объявившего
себя DataSource-ом этой таблицы.
● Таблица сообщает о выделении (тап), удалении (свайп влево) и т.д. объекту, объявившему себя
Delegate-ом этой таблицы.
● Таблица запрашивает размеры ячеек, размеры и вьюхи заголовков и прочие параметры кастомизации у
делегата.
● Каждая ячейка таблицы принадлежит классу UITableViewCell (или наследнику).
● В памяти находятся только видимые ячейки (+ иногда несколько "запасных"). Когда ячейка уходит из
области видимости, она перемещается в буфер. Когда нужно показать новую ячейку, она не создаётся, а
берётся из буфера. Это позволяет экономит память (меньшее количество элементов) и повышает
скорость (поменять данные в имеющемся объекте обычно быстрее, чем создать новый).
UITableView
UIKit Framework
Необходимый минимум для работы с таблицей:
● создать объект-таблицу и поместить его на видимую view
● задать dataSource (объект должен отвечать протоколу UITableViewDataSource)
● в DataSource переопределить следующие методы:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)ip
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
UITableView
UIKit Framework
Необходимый минимум для работы с таблицей:
● создать объект-таблицу и поместить его на видимую view
● задать dataSource (объект должен отвечать протоколу UITableViewDataSource)
● в DataSource переопределить следующие методы:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)ip
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
Для обработки нажатия на элемент списка необходимо:
● задать delegate (объект должен отвечать протоколу UITableViewDelegate )
● в Delegate переопределить метод
- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip
UITableView
UIKit Framework
UITableView
#import "MyCell.h"
//...
- (void)viewDidLoad
{
[super viewDidLoad];
// При использовании отдельной XIB для вьюхи ячейки MyCell
[self.tableView registerNib:[MyCell cellNib] forCellReuseIdentifier:[MyCell cellIdentifier]];
}
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *myCell = [tv dequeueReusableCellWithIdentifier:[MyCell cellIdentifier]];
// Кастомизация myCell (меняем данные на актуальные для элемента по индексу indexPath)
//...
//...
return myCell;
}
UIKit Framework
UICollectionView
● двумерная коллекция (однородных) элементов
● работа с коллекцией очень похожа на UITableView
● мощные средства кастомизации лейаута элементов
UIKit Framework
Необходимый минимум для работы с коллекцией:
● создать объект-коллекцию и поместить его на видимую view
● задать dataSource (объект должен отвечать протоколу UICollectionViewDataSource)
● в DataSource переопределить следующие методы:
- (NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
Для обработки нажатия на элемент коллекции необходимо:
● задать delegate (объект должен отвечать протоколу UICollectionViewDelegate )
● в Delegate переопределить метод
- (void)collectionView:(UICollectionView *)collectionView
didSelectItemAtIndexPath:(NSIndexPath *)indexPath
UICollectionView

More Related Content

What's hot

Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CИнтуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CГлеб Тарасов
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Ontico
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29MoscowJS
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
Роман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSРоман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSAlexander Zimin
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)Ontico
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
Интерактивные 3D-карты своими руками / Александр Амосов (Avito)
Интерактивные 3D-карты своими руками / Александр Амосов (Avito)Интерактивные 3D-карты своими руками / Александр Амосов (Avito)
Интерактивные 3D-карты своими руками / Александр Амосов (Avito)Ontico
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переигралEugene Zharkov
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016Anastasia Goryacheva
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.jsMad Devs
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Ontico
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Ontico
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
«3D-плеер на WebGL», Василика Климова, MoscowJS 21
«3D-плеер на WebGL», Василика Климова, MoscowJS 21«3D-плеер на WebGL», Василика Климова, MoscowJS 21
«3D-плеер на WebGL», Василика Климова, MoscowJS 21MoscowJS
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 

What's hot (20)

Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CИнтуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
Роман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSРоман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOS
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Интерактивные 3D-карты своими руками / Александр Амосов (Avito)
Интерактивные 3D-карты своими руками / Александр Амосов (Avito)Интерактивные 3D-карты своими руками / Александр Амосов (Avito)
Интерактивные 3D-карты своими руками / Александр Амосов (Avito)
 
Vuejs composition API
Vuejs composition APIVuejs composition API
Vuejs composition API
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
Squeek School #7
Squeek School #7Squeek School #7
Squeek School #7
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
«3D-плеер на WebGL», Василика Климова, MoscowJS 21
«3D-плеер на WebGL», Василика Климова, MoscowJS 21«3D-плеер на WebGL», Василика Климова, MoscowJS 21
«3D-плеер на WebGL», Василика Климова, MoscowJS 21
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 

Viewers also liked

Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Noveo
 
шаринг
шарингшаринг
шарингNoveo
 
03 коллекции
03   коллекции03   коллекции
03 коллекцииNoveo
 
10 ns error
10   ns error10   ns error
10 ns errorNoveo
 
хранение данных
хранение данныххранение данных
хранение данныхNoveo
 
09 ns data
09   ns data09   ns data
09 ns dataNoveo
 
карты, навигация
карты, навигациякарты, навигация
карты, навигацияNoveo
 
05 ns dictionary
05   ns dictionary05   ns dictionary
05 ns dictionaryNoveo
 
мультимедиа
мультимедиамультимедиа
мультимедиаNoveo
 
iOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C BlocksiOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C BlocksNoveo
 
Rest
RestRest
RestNoveo
 
04 ns array
04   ns array04   ns array
04 ns arrayNoveo
 
07 ns value
07   ns value07   ns value
07 ns valueNoveo
 
обработка событий
обработка событийобработка событий
обработка событийNoveo
 
iOS-01-Основы Objective-C
iOS-01-Основы Objective-CiOS-01-Основы Objective-C
iOS-01-Основы Objective-CNoveo
 
iOS-02-Паттерны ООП
iOS-02-Паттерны ООПiOS-02-Паттерны ООП
iOS-02-Паттерны ООПNoveo
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Noveo
 
06 ns set
06   ns set06   ns set
06 ns setNoveo
 
02 ns string
02   ns string02   ns string
02 ns stringNoveo
 
11 ns copying, subscripting, fast enumeration
11   ns copying, subscripting, fast enumeration11   ns copying, subscripting, fast enumeration
11 ns copying, subscripting, fast enumerationNoveo
 

Viewers also liked (20)

Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
шаринг
шарингшаринг
шаринг
 
03 коллекции
03   коллекции03   коллекции
03 коллекции
 
10 ns error
10   ns error10   ns error
10 ns error
 
хранение данных
хранение данныххранение данных
хранение данных
 
09 ns data
09   ns data09   ns data
09 ns data
 
карты, навигация
карты, навигациякарты, навигация
карты, навигация
 
05 ns dictionary
05   ns dictionary05   ns dictionary
05 ns dictionary
 
мультимедиа
мультимедиамультимедиа
мультимедиа
 
iOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C BlocksiOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C Blocks
 
Rest
RestRest
Rest
 
04 ns array
04   ns array04   ns array
04 ns array
 
07 ns value
07   ns value07   ns value
07 ns value
 
обработка событий
обработка событийобработка событий
обработка событий
 
iOS-01-Основы Objective-C
iOS-01-Основы Objective-CiOS-01-Основы Objective-C
iOS-01-Основы Objective-C
 
iOS-02-Паттерны ООП
iOS-02-Паттерны ООПiOS-02-Паттерны ООП
iOS-02-Паттерны ООП
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
06 ns set
06   ns set06   ns set
06 ns set
 
02 ns string
02   ns string02   ns string
02 ns string
 
11 ns copying, subscripting, fast enumeration
11   ns copying, subscripting, fast enumeration11   ns copying, subscripting, fast enumeration
11 ns copying, subscripting, fast enumeration
 

Similar to iOS-05_2-UIKit

Школа-студия разработки приложений для 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Глеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные ViewsИнтуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные ViewsГлеб Тарасов
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRAMBLER&Co
 
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...HappyDev
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектахe-Legion
 
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOSCodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOSCodeFest
 
iOS-05_1-UIKit
iOS-05_1-UIKitiOS-05_1-UIKit
iOS-05_1-UIKitNoveo
 
Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"Yandex
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеГлеб Тарасов
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Всеволод Шмыров, Яндекс
Всеволод Шмыров, ЯндексВсеволод Шмыров, Яндекс
Всеволод Шмыров, ЯндексElena Voynova
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийGoSharp
 
Fun with core graphics
Fun with core graphicsFun with core graphics
Fun with core graphicsSoftTechnics
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesVictor Login
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриKirill Averyanov
 

Similar to iOS-05_2-UIKit (20)

Школа-студия разработки приложений для 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
 
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные ViewsИнтуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
2014.12.06 01 Александр Чернышев — Нафига Козе Баян или нужен ли вам swift, и...
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах
 
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOSCodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
CodeFest 2011. Бусыгин Р. — Создание кастомных интерфейсов для iOS
 
iOS-05_1-UIKit
iOS-05_1-UIKitiOS-05_1-UIKit
iOS-05_1-UIKit
 
Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Всеволод Шмыров, Яндекс
Всеволод Шмыров, ЯндексВсеволод Шмыров, Яндекс
Всеволод Шмыров, Яндекс
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
Fun with core graphics
Fun with core graphicsFun with core graphics
Fun with core graphics
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с Kubernetes
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
 

More from Noveo

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииNoveo
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Noveo
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Noveo
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Noveo
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Noveo
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Noveo
 
Yii2
Yii2Yii2
Yii2Noveo
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизацияNoveo
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQLNoveo
 
MySQL
MySQLMySQL
MySQLNoveo
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Noveo
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Noveo
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Noveo
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Noveo
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Noveo
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Noveo
 

More from Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 

iOS-05_2-UIKit

  • 2. UIKit framework UIView subclassing CALayer, transformations UIScrollView UITableView + UITableViewCell UICollectionView + UICollectionViewCell лекция 5 (продолжение)
  • 3. UIKit Framework - (id)initWithFrame:(CGRect)frame — designated initializer - (id)initWithCoder:(NSCoder *)aCoder — при создании объекта view из XIB/Storyboard - (void)layoutSubviews — определяет расположение вложенных view - (void)updateConstraints — определяет расположение вложенных view - (void)drawRect:(CGRect)rect — выполняет отрисовку полностью кастомной view - (CGSize)sizeThatFits:(CGSize)size — предпочтительный размер UIView subclassing
  • 4. UIKit Framework Свойства, которые можно анимировать: ● frame ● bounds ● center ● transform ● alpha ● backgroundColor ● contentStretch UIView animation
  • 5. UIKit Framework [UIView animateWithDuration:2 animations:^{ self.aView.transform = CGAffineTransformRotate(self.view.transform, M_PI / 3.0); self.textLabel.center = destinationPoint; }]; UIView animation
  • 6. UIKit Framework Содержится в каждой UIView, отвечает за отрисовку. ● @property CGPoint anchorPoint ● @property CGColorRef borderColor ● @property CGFloat borderWidth ● @property CGFloat cornerRadius ● @property BOOL masksToBounds ● @property CGColorRef shadowColor ● @property CGSize shadowOffset ● @property float shadowOpacity ● @property CATransform3D transform В реальности для фонов, рамок, скруглений и прочего используются картинки, т.к. это даёт больше гибкости и работает ощутимо быстрее. CALayer
  • 7. UIKit Framework CALayer self.textLabel = [[UILabel alloc] initWithFrame:self.view.bounds]; self.textLabel.layer.shadowColor = [UIColor whiteColor].CGColor; self.textLabel.layer.shadowRadius = 12; self.textLabel.layer.shadowOpacity = 1; self.textLabel.layer.masksToBounds = NO; self.button = [[UIButton alloc] initWithFrame:(CGRect){20, 20, 100, 40}]; self.button.backgroundColor = [UIColor brownColor]; self.button.layer.masksToBounds = YES; self.button.layer.cornerRadius = 8; self.button.layer.borderWidth = 2; self.button.layer.borderColor = [UIColor blackColor].CGColor;
  • 8. UIKit Framework ● Скроллинг по контенту, который не влезает на экран полностью ● Зум контента с помощью стандартных жестов ● Анимированная навигация по отдельным экранам (паджинация) UIScrollView
  • 9. UIKit Framework @interface ViewController () //... @property (strong, nonatomic) IBOutlet UIImageView *imageView; @property (strong, nonatomic) IBOutlet UIScrollView *contentScroller; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.contentScroller = [[UIScrollView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:self.contentScroller]; self.imageView = [[UIImageView alloc] initWithImage:self.image]; [self.contentScroller addSubview:self.imageView]; self.contentScroller.contentSize = self.imageView.frame.size; } @end UIScrollView
  • 10. UIKit Framework Показ большого (но конечного) количества элементов с навигацией свайпами. UIScrollView 34 3635 cur nextprev content view scroll view (visible area)
  • 11. UIKit Framework Показ большого (но конечного) количества элементов с навигацией свайпами. UIScrollView 34 3635 cur nextprev content view scroll view (visible area) 373635 cur next content viewprev obj_1 obj_2 obj_3 obj_2 obj_3 obj_1 34 obj_1
  • 12. UIKit Framework - (void)viewDidLoad { [super viewDidLoad]; self.contentScroller = [[UIScrollView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:self.contentScroller]; self.contentScroller.delegate = self; //... } // Вызывается постоянно во время скролла, // наш код должен работать быстро! - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // Вычисляем номер элемента, центр которого ближе всего // Если это не текущий элемент: // - делаем видимый элемент центральным // - подгружаем новый соседний элемент // - исправляем координаты соседних элементов. } UIScrollView
  • 13. UIKit Framework ● Список однородных элементов (ячейки могут быть разного типа, но основной смысл всё-таки в повторении) ● Стандартная схема для переиспользования объектов ● Реакция на прокрутку, нажатие, свайпы ● Стандартная реализация добавления/удаления/перемещения (включая анимации) UITableView
  • 14. UIKit Framework ● Таблица запрашивает количество групп, количество ячеек, а так же сами ячейки у объекта, объявившего себя DataSource-ом этой таблицы. ● Таблица сообщает о выделении (тап), удалении (свайп влево) и т.д. объекту, объявившему себя Delegate-ом этой таблицы. ● Таблица запрашивает размеры ячеек, размеры и вьюхи заголовков и прочие параметры кастомизации у делегата. ● Каждая ячейка таблицы принадлежит классу UITableViewCell (или наследнику). ● В памяти находятся только видимые ячейки (+ иногда несколько "запасных"). Когда ячейка уходит из области видимости, она перемещается в буфер. Когда нужно показать новую ячейку, она не создаётся, а берётся из буфера. Это позволяет экономит память (меньшее количество элементов) и повышает скорость (поменять данные в имеющемся объекте обычно быстрее, чем создать новый). UITableView
  • 15. UIKit Framework Необходимый минимум для работы с таблицей: ● создать объект-таблицу и поместить его на видимую view ● задать dataSource (объект должен отвечать протоколу UITableViewDataSource) ● в DataSource переопределить следующие методы: - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)ip - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section UITableView
  • 16. UIKit Framework Необходимый минимум для работы с таблицей: ● создать объект-таблицу и поместить его на видимую view ● задать dataSource (объект должен отвечать протоколу UITableViewDataSource) ● в DataSource переопределить следующие методы: - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)ip - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section Для обработки нажатия на элемент списка необходимо: ● задать delegate (объект должен отвечать протоколу UITableViewDelegate ) ● в Delegate переопределить метод - (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip UITableView
  • 17. UIKit Framework UITableView #import "MyCell.h" //... - (void)viewDidLoad { [super viewDidLoad]; // При использовании отдельной XIB для вьюхи ячейки MyCell [self.tableView registerNib:[MyCell cellNib] forCellReuseIdentifier:[MyCell cellIdentifier]]; } - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyCell *myCell = [tv dequeueReusableCellWithIdentifier:[MyCell cellIdentifier]]; // Кастомизация myCell (меняем данные на актуальные для элемента по индексу indexPath) //... //... return myCell; }
  • 18. UIKit Framework UICollectionView ● двумерная коллекция (однородных) элементов ● работа с коллекцией очень похожа на UITableView ● мощные средства кастомизации лейаута элементов
  • 19. UIKit Framework Необходимый минимум для работы с коллекцией: ● создать объект-коллекцию и поместить его на видимую view ● задать dataSource (объект должен отвечать протоколу UICollectionViewDataSource) ● в DataSource переопределить следующие методы: - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath Для обработки нажатия на элемент коллекции необходимо: ● задать delegate (объект должен отвечать протоколу UICollectionViewDelegate ) ● в Delegate переопределить метод - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath UICollectionView