Как устроен Калькулятор

Используют Auto Layout и Фреймы. Кнопки обычные UIButton.

Читается за 1 минуту Обновлено 1 год назад

Приложение сделали на сценах, но используется только одна root-сцена. Класс окна называется CalculatorWindow.

Контроллер

Root-контроллер назвали CalculatorController. Все элементы вписываются в Safe Area Layout Guide.

На весь экран добавлен жест UISystemGestureGateGestureRecognizer, что делает - непонятно. Возможно, жест анимирует кнопки если водить пальцем по экрану.

Клавиатура

Кнопки находятся в контейнере CalculatorKeypadView. Кнопки расставили фреймами, а сам контейнер кнопок лейаутится с помощью констрейнтов.

 Класс клавиатуры CalculatorKeypadView
Класс клавиатуры CalculatorKeypadView

Все кнопки объекты класса CalculatorKeypadButton, он наследуется от UIButton. Внутри кнопок находится системный UILabel, даже кнопка `C` - Clear сделана текстом.

 Класс кнопки CalculatorKeypadButton
Класс кнопки CalculatorKeypadButton

В звонилке под цифрами есть буквы, там Apple перевела весь текст в картинки.

Окно ввода

Окно с вводимыми цифрами называется DisplayView. Ширину лейбла внутри контейнера пересчитывают при каждом вводе новой цифры или операции. На вью добавили 3 жеста - свайп, лонг-пресс и тап.

 Класс окна ввода DisplayView
Класс окна ввода DisplayView

Высотой лейбла с результатом управляют констрейнтами. Для альбомной ориентации получается странное значение 71.5.

Альбомная ориентация

 Иерархия вью альбомной ориентации Калькулятора
Иерархия вью альбомной ориентации Калькулятора

В портретном режиме скрытых UIView нет. Значит, при повороте устройства, новые кнопки добавляются и расставляются на лету. Кнопки из портретного режима сохраняются между поворотами. Так выглядит переход между портрентной и альбомной ориентацией:

Переключение между портретной и альбомной ориентации.

Accessibility

Приложение поддерживает Voice Over и Voice Controlдля всех интерактивных элементов.

 Поддержка Accessibility
Поддержка Accessibility

Окно с результатом диктуется как «Result, 89, Summary Element».