Добро пожаловать в разбор кейсов, как Apple использует элементы UIKit
в своих приложениях. Сегодня разберу Калькулятор. До этого уже разобрал Календарь. Я - Иван Воробей, веду телеграмм канал для iOS Разработчиков «Код Воробья».
Приложение маленькое, но сделано на сценах. Сцена одна, класс окна назвали CalculatorWindow
.
Контроллер
Root-контроллер назвали CalculatorController
. Все элементы вписываются в SafeAreaLayoutGuide.
На весь экран добавлен жест _UISystemGestureGateGestureRecognizer
, что делает - непонятно. Возможно, управляет ховер-анимацией если водить пальцем не отрывая от экрана по кнопкам.
Клавиатура
Кнопки находятся в контейнере CalculatorKeypadView
. Сетку кнопок расставили фреймами, а сам контейнер лейаутится с помощью констрейнтов.
![](https://habrastorage.org/getpro/habr/upload_files/352/a2a/a2c/352a2aa2c9bd15aa468e1392df8b6c9f.png)
Все кнопки это объекты класса CalculatorKeypadButton
, он наследуется от UIButton
. Внутри кнопок находится системный UILabel
, даже кнопка C
- Clear сделана текстом.
![](https://habrastorage.org/getpro/habr/upload_files/961/108/7b5/9611087b5c29354a7a39a749badc6cd2.png)
Для клавиатуры в звонилке Apple все буквы переводила в картинки.
Окно ввода
Окно с введёнными цифрами назвали DisplayView
. Ширину лейбла внутри контейнера пересчитывают при каждом вводе новой цифры или операции. На вью добавили 3 жеста - свайп, лонг-пресс и тап.
![](https://habrastorage.org/getpro/habr/upload_files/e9e/c06/9f7/e9ec069f79af33892447cd32d6b32b2d.png)
Высотой лейбла с результатом управляют констрейнтами. Для альбомной ориентации получается странное значение 71.5.
Альбомная ориентация
В портретном режиме скрытых UIView
нет. Значит, при повороте устройства, новые кнопки добавляются и расставляются на лету. Кнопки из портретного режима сохраняются между поворотами.
![](https://habrastorage.org/getpro/habr/upload_files/b45/e94/e9d/b45e94e9dc779e42f8015b8767705ac4.png)
Accessibility
Приложение поддерживает Voice Over
и Voice Control
для всех интерактивных элементов.
![](https://habrastorage.org/getpro/habr/upload_files/abc/28a/543/abc28a543d2ef54f60903f00be02dc7d.png)
Окно с результатом диктуется как «Result, 89, Summary Element».