SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Кастомная кнопка:
взгляд изнутри
Кирилл Аверьянов
iOS Developer
• Идея и предназначение💡
• Пример👌
• Компоненты 🔑
• Демо 🖥
2
Коротко
Идея
-William Edmund Hick
“The time it takes to make a decision increases
as the number of alternatives increases.”
4
Зачем?
• Требования дизайна
• Изменение layout
• Неоднозначное поведение
5
Пример
7
Компоненты
Компоненты для
реализации
• Состояния
• Отслеживание их
• Изменение цвета 🖍
• Layout
9
Состояния
Состояния (UIControl)
• var isEnabled: Bool { get set }
• var isSelected: Bool { get set }
• var isHighlighted: Bool { get set }
11
isFocused { get } (UIView)
12
iOS 9+
isFocused { get } (UIView)
iOS 9+
TF?!
14
Состояния (UIControl)
• func beginTracking(UITouch, with: UIEvent?) -> Bool
• func continueTracking(UITouch, with: UIEvent?) -> Bool
• func endTracking(UITouch?, with: UIEvent?)
• func cancelTracking(with: UIEvent?)
• var isTracking: Bool { get }
15
State
(UIControlState)
• var state: UIControlState { get }
• Состояния:
• normal
• highlighted, disabled, selected
• focused, application, reserved
16
iOS 9+
Немного про биты 😳
• Конъюнкция( & ) - есть ноль, то ноль
• Дизъюнкция( | ) - есть единица, то единица
A B A & B A | B
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 1
Немного про биты 😳
• a = 1 ( 0001 )
• b = 2 ( 0010 )
• c = 4 ( 0100 )
• d = 8 ( 1000 )
18
• a | d = 9 ( 1001 ) = X
• X & d = d ( 1000 )
• X & b = 0 ( 0000 )
19
• state = a | b | c
• Состояния:
• normal = 0
• highlighted = 1, disabled = 2, selected = 4
• print(state & a > 0) // 0 или 1, другого не дано
• print(state.rawValue &
UIControlState.disabled.rawValue > 0)
State
(UIControlState)
Изменение цвета
Изменение цвета
21
• Определение яркости🎨
• Сдвиг цветов🏃
Определение яркости
22
((red * 299) + (green * 587) + (blue * 114)) / 1000
W3C Algorithm
W3C = World Wide Web Consortium
Определение яркости
23
http://www.nbdtech.com/Blog/archive/2008/04/27/
Calculating-the-Perceived-Brightness-of-a-Color.aspx
sqrt(.241 * red² + .691 * green² + .068 * blue²)
X ∈ 0 … 255
24
.net 3.0
Сдвиг цветов
25
X < 130 ? Brighter : Darker
X
Демо
Начало
1. Создаем xib
class MyButton: UIButton {
@IBOutlet var label: UILabel!
@IBOutlet var viewHeight: NSLayoutConstraint!
}
2. Создаем класс
3. Конектим
Загрузка
28
override func awakeAfter(using aDecoder: NSCoder) -> Any? {
return loadFromNibIfEmbeddedInDifferentNib()
}
29
func loadFromNibIfEmbeddedInDifferentNib() -> Self {
let isJustAPlaceholder = subviews.count == 0
if isJustAPlaceholder {
let theRealThing = type(of: self).viewFromNib()
theRealThing.frame = frame
translatesAutoresizingMaskIntoConstraints = false
theRealThing.translatesAutoresizingMaskIntoConstraints = false
return theRealThing
}
return self
}
Загрузка
30
Загрузка
class func viewFromNib(withOwner owner: Any? = nil) -> Self {
let name = String(describing: type(of
self)).components(separatedBy: ".")[0]
let view = UINib(nibName: name, bundle:
nil).instantiate(withOwner: owner, options: nil)[0]
return cast(view)!
}
private func cast<T, U>(_ value: T) -> U? {
return value as? U
}
Результат
31
override var isHighlighted: Bool {
didSet {
if oldValue != isHighlighted {
notChange = true
updateAppearance()
}
}
}
override var isSelected: Bool {
didSet {
if oldValue != isSelected {
notChange = true
updateAppearance()
}
}
}
override var isEnabled: Bool {
didSet {
if oldValue != isEnabled {
notChange = true
updateAppearance()
}
}
}
33
Демо DIY
private func updateAppearance() {
isSetup = true
if (isSelected || isHighlighted) && isEnabled {
buttonTouchedIn()
} else {
buttonTouchedOut()
}
alpha = isEnabled ? 1 : 0.8
isSetup = false
}
34
Демо DIY
private func buttonTouchedIn() {
delegate?.buttonIn()
backgroundColor = nessesaryBackgroundColor?.tapButtonChangeColor
textForLabel = ".."
startTimer()
UIView.animate(withDuration: 0.3, animations: {
self.viewHeightConstraint.constant += 40.0
self.layoutIfNeeded()
})
animateClouds()
}
35
Демо DIY
private func buttonTouchedOut() {
delegate?.buttonOut()
backgroundColor = nessesaryBackgroundColor
invalidateTimer()
label.text = text
UIView.commitAnimations()
UIView.animate(withDuration: 0.3, animations: {
self.viewHeightConstraint.constant -= 40.0
self.layoutIfNeeded()
})
}
36
Демо DIY
override var backgroundColor: UIColor? {
didSet {
if oldValue == backgroundColor || notChange {
notChange = false
return
}
if !isSetup {
nessesaryBackgroundColor = backgroundColor
notChange = true
backgroundColor = oldValue
}
updateAppearance()
}
}
~ 100 строк
37
Результат
😱😱😱
Результат
Репозиторий
39
https://github.com/Kirillzzy/CustomButton
😱😱😱
Спасибо
за внимание😉
@kirillzzy - everywhere
kirillaveryanov.me
Кирилл Аверьянов

Mais conteúdo relacionado

Mais procurados

Иструментарий для быстрой разработки игр с 2 d физикой
Иструментарий для быстрой разработки игр с 2 d физикойИструментарий для быстрой разработки игр с 2 d физикой
Иструментарий для быстрой разработки игр с 2 d физикой
akimovpro
 

Mais procurados (7)

Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
 
Новое в Mongodb 2.4
Новое в Mongodb 2.4Новое в Mongodb 2.4
Новое в Mongodb 2.4
 
Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Марина Степанова "Много объектов на карте"
Марина Степанова "Много объектов на карте"Марина Степанова "Много объектов на карте"
Марина Степанова "Много объектов на карте"
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Иструментарий для быстрой разработки игр с 2 d физикой
Иструментарий для быстрой разработки игр с 2 d физикойИструментарий для быстрой разработки игр с 2 d физикой
Иструментарий для быстрой разработки игр с 2 d физикой
 

Semelhante a Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри

Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
Andrew Mayorov
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
Ciklum Ukraine
 

Semelhante a Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри (20)

iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
10 вещей, которые «невозможно» сделать в iOS
10 вещей, которые «невозможно» сделать в iOS10 вещей, которые «невозможно» сделать в iOS
10 вещей, которые «невозможно» сделать в iOS
 
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Разбираемся с CoordinatorLayout
Разбираемся с CoordinatorLayoutРазбираемся с CoordinatorLayout
Разбираемся с CoordinatorLayout
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Автоматическое тестирование мобильных приложений на основе скриншотов
Автоматическое тестирование мобильных приложений на основе скриншотовАвтоматическое тестирование мобильных приложений на основе скриншотов
Автоматическое тестирование мобильных приложений на основе скриншотов
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 

Mais de CocoaHeads

Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
CocoaHeads
 
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
CocoaHeads
 
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
CocoaHeads
 

Mais de CocoaHeads (17)

Дмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPERДмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPER
 
Александр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияАлександр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыражения
 
Николай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейНиколай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслей
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
 
Самвел Меджлумян — S3: API на Swift за пять минут
Самвел Меджлумян —  S3: API на Swift за пять минутСамвел Меджлумян —  S3: API на Swift за пять минут
Самвел Меджлумян — S3: API на Swift за пять минут
 
Александр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftАлександр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия Swift
 
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовКатерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
 
Андрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомАндрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботом
 
Александр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоАлександр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущего
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотек
 
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
 
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложениях
 
Михаил Рахманов — Promises, или почему обещания надо выполнять
Михаил Рахманов — Promises, или почему обещания надо выполнятьМихаил Рахманов — Promises, или почему обещания надо выполнять
Михаил Рахманов — Promises, или почему обещания надо выполнять
 
Александр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиАлександр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработки
 
Алина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеАлина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проекте
 

Último

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 

Último (9)

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 

Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри