Сделаем на SwiftUI анимированные карточки с поддержкой жестов: Хотел добавить подробное превью, но размер гифки становится не православный. Большое превью можно глянуть по ссылке или в видео-туториале.  SwiftUI сейчас в beta, и устанавливается вместе с новым Xcode, который тоже в beta. Хорошая новость — новый Xcode можно поставить рядом со старым, и практически не почувствовать боли.  Скачать его можно по ссылке в разделе Applications. Вы могли встречать риалтайм-превью во время работы со SwiftUI. Чтобы активировать его, а так же некоторые контекстные меню, нужно установить бету macOS Catalina. Тут без боли не обойдется. Я бету не ставил, поэтому буду по старинке запускать симулятор.  Создайте Single View Application с дополнительной галочкой — SwiftUI: Перейдите в файл ContentView.swift. Наследник PreviewProvider отвечает за превью. Так как его использовать не будем, оставим минимально необходимый код: Надеюсь общее понимание о SwiftUI уже есть, на тривиальных моментах останавливаться не будем. Карточки расположены друг за другом, поэтому будем использовать ZStack. Напомню, есть ещё два варианта группирования элементов: HStack — горизонтально и VStack — вертикально. Для наглядности:  Добавим первую карточку: Здесь добавили прямоугольник, покрасили в черный цвет, высоту 230pt, закруглили края на 10pt и установили отступы со всех сторон 16pt. Текст в карточку добавляется в блок ZStack после прямоугольника: Запустите проект, чтобы увидеть промежуточный результат:  Для удобства вынесем код MainCard: Проперти title появится в инициализаторе. Этот текст будет в карточке. Добавим карточку в ContentView, заодно увидим новый параметр в инициализаторе: Уже умеем выносить код, поэтому сразу определим класс для фоновых карточек: Установили другой цвет и стиль для текста. В остальном код повторяет главную черную MainCard. Добавим две фоновые карточки в ContentView. Карточки расположены друг за другом, поэтому поместим их в ZStack. Код ContentView: Фоновые карточки расположены под черной и пока их не видно. Добавим смещение вверх и отступы от краев: Теперь результат напоминает анонс в начале туториала: Перейдем к жестам, а вместе с этим к анимациям. То, как реализованы жесты, вынудит минусануть мне карму и оставить токсичный отзыв.   Перед тем, как увидите код, обращаю внимание — он приведен на developer.apple.com в качестве примера. Первое впечатление обманчиво, на практике мне понравилось.  Объявим enum в ContentView:  DragState сделает работу с жестом комфортней. Добавим проперти dragState в ContentView:  Здесь будет магия. Везде, где будет использоваться dragState, новые значения будут применятся автоматически. Объявим жест: Добавим жест главной карточке и установим offset: Смещение будет равно значению параметра в момент обращения к нему? Нет, будет равно всегда. Это и есть магия.  Карточка будет следовать за пальцем мышкой, но без анимаций: Фоновые карточки тоже должны менять свою позицию (по крайней мере мы так захотели). Добавим для них код, привязанный к состоянию жеста. rotation3DEffect повернет карточку, пока жест не станет активным: Как еще можно использовать 3D можно глянуть тут. Также я добавил blendMode. Режимы аналогичны инструментам в Photoshop и Sketch.  Пока изменения применяются не анимировано, давайте исправим.  Вы удивитесь насколько это просто. Достаточно добавить строчку: Добавьте для каждой карточки. Теперь любые изменения будут применятся анимировано, в нашем случае это отступы-размеры, 3D поворот и offset. Если нужна анимацию с кривыми, используйте режим basic. Добавим тень и поворот главной вью, привязанный к смещению: Если запустите проект, то увидите референс из начала туториала. Поворот на превью не видно, потяните карточку в сторону чтобы увидеть эффект. → Код проекта можно найти в репозитории Достаточно скопировать файл в проект, никаких дополнительный настроек не требуется. Не пугайтесь что кода так мало — это одна из плюшек SwiftUI. Если вам удобнее смотреть видео, гляньте туториал. Кстати, в видео я использую реалтайм превью. Загляните в мой телеграм-канал по iOS разработке. iOS разработчик