Добро пожаловать в разбор кейсов, как 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)


  1. Myclass
    19.12.2022 11:48

    https://habr.com/ru/post/671138/

    у вы "настойчивый". За семь месяцев дополнили вашу прежнюю статью тремя новыми картинками.


    1. IvanVorobei Автор
      19.12.2022 11:49

      Постарался исправиться.


  1. alien1900
    19.12.2022 13:40
    -1

    Эх, а я ожидал увидеть разбор кода, комментарии по использованным паттернам и подходам.

    На весь экран добавлен жест _UISystemGestureGateGestureRecognizer, что делает - непонятно

    А если в код заглянуть, то же не понятно?


    1. IvanVorobei Автор
      19.12.2022 13:48

      Это системное эпловское скомпилированное приложение. Вы знаете где найти исходники калькулятора?


      1. Flatout73
        19.12.2022 18:20
        +1

        А как иерархию разбирали? Jailbreak'нутый айфон с frida и какой-нибудь reveal? Можно попробовать дамп аппки сделать и декомпилировать hopper'ом.


        1. IvanVorobei Автор
          19.12.2022 21:20

          Да, именно. + свой твик для новой версии ривела. Про дамп звучит непонятно - если есть желание, свяжитесь со мной. Было бы интересно вытянуть больше деталей.


          1. Flatout73
            20.12.2022 03:24
            +1

            Ну что-то типа такого:
            https://habr.com/ru/company/dsec/blog/676094/#:~:text=в спойлере ниже%3A-,Способы,-сдампить .ipa-файл

            Не знаю, можно ли так стандартные аппки дампить, но с другими у меня получалось)


            1. IvanVorobei Автор
              20.12.2022 17:20

              Выглядит сложно и интересно. Бегло пробежался - можно вытянуть имена функций и порядок вызовов. Попробую


              1. Flatout73
                20.12.2022 17:31
                +1

                Если апп на objc, то там вообще довольно понятно, так как из-за селекторов сохраняются имена функций. На свифте уже сложнее, но методы жизненного цикла все равно objc'шные. И можно даже ассемблерный код не сильно копать, а именно псевдокод для каждой функции смотреть.


      1. alien1900
        20.12.2022 03:39

        Нет, но я и не автор статьи. Но судя из названия "Как устроено приложение Калькулятор на iPhone" и тэгов (Objective C) у автора они должны быть, иначе откуда такая уверенность?

        Фактически содержимое статьи больше соответствует заголовку "Как приблизительно устроена верстка UI слоя приложения Калькулятор на iPhone".


  1. alexseyekimow
    19.12.2022 21:20
    +1

    Что-то подобное попытался написать на SwiftUI, но без горизонтальной ориентации и подключения дополнительных кнопок, максимально просто, и приближенно к оригиналу)


    1. IvanVorobei Автор
      19.12.2022 21:21

      Сделать самому кнопки в сетке не сложно. Интересно как делают в самой эпл)


  1. maeris
    19.12.2022 23:00

    Как устроено приложение Калькулятор на iPhone

    1 + 2 + 3 = 24. Как бы оно не было устроено, ориентироваться на него не нужно.


    1. IvanVorobei Автор
      19.12.2022 23:04

      Концептуально, почему нет. Например, комбинации лейаута. Или сетка кнопок фреймами. Конечно, нужно не копировать 1 в 1, а взять идеи на вооружение.

      Видео забавное)