Пользовательская полноэкранная анимация

Можно ли добавить собственную анимацию в fullScreenCover? Анимация по умолчанию отключена, но я пытаюсь найти способ добавить собственную анимацию.

Я предполагаю, что transaction.disablesAnimations = true отключает любую добавленную анимацию, но я не нашел другого способа отключить анимацию по умолчанию.

Я знаю, что существуют альтернативные способы реализации чего-то подобного (откат к UIKit или использование наложения), но было бы интересно, если бы это можно было сделать с помощью fullScreenCover.

struct ContentView: View {
    @State private var isPresentingFullScreenCover = false

    var body: some View {
        Button("Show FullScreenCover") {
            isPresentingFullScreenCover = true
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(.black)
        .fullScreenCover(isPresented: $isPresentingFullScreenCover) {
            FullScreenCoverView()
        }
        .transaction { transaction in
            transaction.disablesAnimations = true
        }
    }
}

struct FullScreenCoverView: View {
    @Environment(\.dismiss) var dismiss

    var body: some View {
        Button("Dismiss") {
            dismiss()
        }
    }
}

Вы можете поместить два вида в ZStack и применить собственный переход к виду сверху. Кроме этого, я не думаю, что это можно сделать в чистом SwiftUI.

Sweeper 22.04.2024 12:02

Да, наверняка есть альтернативы этому решению, но было бы интересно узнать, можно ли это решить с помощью FullScreenCover.

José 22.04.2024 12:06

Я почти уверен, что ты не сможешь.

Sweeper 22.04.2024 12:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
270
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы успешно отключили обычный переход. Итак, все, что вам нужно сделать сейчас, это:

  • скрыть фон презентации
  • показывать и скрывать контент, используя собственный анимированный переход.

Добавляемую вами анимацию можно запустить, переключив флаг в .onAppear и .onDisappear:

struct FullScreenCoverView: View {
    @Environment(\.dismiss) var dismiss
    @State private var isShowing = false

    var body: some View {
        ZStack {
            Color.clear
            if isShowing {
                Button("Dismiss") {
                    withAnimation {
                        isShowing = false
                    } completion: {
                        dismiss()
                    }
                }
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(.background)
                .transition(.scale.animation(.easeInOut))
            }
        }
        .ignoresSafeArea()
        .presentationBackground(.clear)
        .onAppear { isShowing = true }
        .onDisappear { isShowing = false }
    }
}

Animation

Другие вопросы по теме