Добро пожаловать в разбор кейсов, как Apple использует элементы UIKit
в своих приложениях. Сегодня разберу Калькулятор. До этого уже разобрал Календарь. Я - Иван Воробей, веду телеграмм канал для iOS Разработчиков «Код Воробья».
Приложение маленькое, но сделано на сценах. Сцена одна, класс окна назвали CalculatorWindow
.
Контроллер
Root-контроллер назвали CalculatorController
. Все элементы вписываются в SafeAreaLayoutGuide.
На весь экран добавлен жест _UISystemGestureGateGestureRecognizer
, что делает - непонятно. Возможно, управляет ховер-анимацией если водить пальцем не отрывая от экрана по кнопкам.
Клавиатура
Кнопки находятся в контейнере CalculatorKeypadView
. Сетку кнопок расставили фреймами, а сам контейнер лейаутится с помощью констрейнтов.
Все кнопки это объекты класса CalculatorKeypadButton
, он наследуется от UIButton
. Внутри кнопок находится системный UILabel
, даже кнопка C
- Clear сделана текстом.
Для клавиатуры в звонилке Apple все буквы переводила в картинки.
Окно ввода
Окно с введёнными цифрами назвали DisplayView
. Ширину лейбла внутри контейнера пересчитывают при каждом вводе новой цифры или операции. На вью добавили 3 жеста - свайп, лонг-пресс и тап.
Высотой лейбла с результатом управляют констрейнтами. Для альбомной ориентации получается странное значение 71.5.
Альбомная ориентация
В портретном режиме скрытых UIView
нет. Значит, при повороте устройства, новые кнопки добавляются и расставляются на лету. Кнопки из портретного режима сохраняются между поворотами.
Accessibility
Приложение поддерживает Voice Over
и Voice Control
для всех интерактивных элементов.
Окно с результатом диктуется как «Result, 89, Summary Element».
Комментарии (14)
alien1900
19.12.2022 13:40-1Эх, а я ожидал увидеть разбор кода, комментарии по использованным паттернам и подходам.
На весь экран добавлен жест
_UISystemGestureGateGestureRecognizer
, что делает - непонятноА если в код заглянуть, то же не понятно?
IvanVorobei Автор
19.12.2022 13:48Это системное эпловское скомпилированное приложение. Вы знаете где найти исходники калькулятора?
Flatout73
19.12.2022 18:20+1А как иерархию разбирали? Jailbreak'нутый айфон с frida и какой-нибудь reveal? Можно попробовать дамп аппки сделать и декомпилировать hopper'ом.
IvanVorobei Автор
19.12.2022 21:20Да, именно. + свой твик для новой версии ривела. Про дамп звучит непонятно - если есть желание, свяжитесь со мной. Было бы интересно вытянуть больше деталей.
Flatout73
20.12.2022 03:24+1Ну что-то типа такого:
https://habr.com/ru/company/dsec/blog/676094/#:~:text=в спойлере ниже%3A-,Способы,-сдампить .ipa-файл
Не знаю, можно ли так стандартные аппки дампить, но с другими у меня получалось)IvanVorobei Автор
20.12.2022 17:20Выглядит сложно и интересно. Бегло пробежался - можно вытянуть имена функций и порядок вызовов. Попробую
Flatout73
20.12.2022 17:31+1Если апп на objc, то там вообще довольно понятно, так как из-за селекторов сохраняются имена функций. На свифте уже сложнее, но методы жизненного цикла все равно objc'шные. И можно даже ассемблерный код не сильно копать, а именно псевдокод для каждой функции смотреть.
alien1900
20.12.2022 03:39Нет, но я и не автор статьи. Но судя из названия "Как устроено приложение Калькулятор на iPhone" и тэгов (Objective C) у автора они должны быть, иначе откуда такая уверенность?
Фактически содержимое статьи больше соответствует заголовку "Как приблизительно устроена верстка UI слоя приложения Калькулятор на iPhone".
alexseyekimow
19.12.2022 21:20+1Что-то подобное попытался написать на SwiftUI, но без горизонтальной ориентации и подключения дополнительных кнопок, максимально просто, и приближенно к оригиналу)
IvanVorobei Автор
19.12.2022 21:21Сделать самому кнопки в сетке не сложно. Интересно как делают в самой эпл)
maeris
19.12.2022 23:00Как устроено приложение Калькулятор на iPhone
1 + 2 + 3 = 24. Как бы оно не было устроено, ориентироваться на него не нужно.
IvanVorobei Автор
19.12.2022 23:04Концептуально, почему нет. Например, комбинации лейаута. Или сетка кнопок фреймами. Конечно, нужно не копировать 1 в 1, а взять идеи на вооружение.
Видео забавное)
Myclass
https://habr.com/ru/post/671138/
у вы "настойчивый". За семь месяцев дополнили вашу прежнюю статью тремя новыми картинками.
IvanVorobei Автор
Постарался исправиться.