Анимация SwiftUI ButtonStyle приводит к тому, что пользовательский интерфейс не обновляется в моментальном снимке переключателя приложений при изменении внешнего вида системы

В моем приложении у меня есть кнопка, которую я хочу анимировать, чтобы уменьшить масштаб при касании. Для этого я создал кастом ButtonStyle с явным animation. Это работает, как и предполагалось, но создавало проблему при переключении между темным/светлым внешним видом системы. Если вы измените его, когда приложение открыто, Color обновится, как и ожидалось, но если приложение не открыто, снимок в переключателе приложений показывает неправильный цвет для нового внешнего вида системы. Следующий код должен быть черным прямоугольником поверх белого фона в светлом режиме и белым на черном в темном режиме. Фон всегда корректно обновляется, но поле остается прежнего цвета на снимке, и поэтому вы не можете его видеть — черным на черном или белым на белом — по крайней мере, с iOS 14.2. Проблема в том, что animation - если я удалю снимок, он появится, как и ожидалось. Почему это так и как я могу это исправить?

struct ContentView: View {
    var body: some View {
        Button(action: {}) {
            Color.primary
                .frame(height: 100)
        }
        .buttonStyle(MyButtonStyle())
        .padding()
    }
}

struct MyButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .scaleEffect(configuration.isPressed ? 0.8 : 1)
            .animation(.easeOut(duration: 0.5)) //FIXME: Removing this fixes it
    }
}

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

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 038
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Отлично работает с iOS 14.1, поэтому я предполагаю, что это еще один дефект 14.2.

Попробуйте связать анимацию со значением (не проверено, просто идея):

struct MyButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .scaleEffect(configuration.isPressed ? 0.8 : 1)
            .animation(.easeOut(duration: 0.5), value: configuration.isPressed)
    }
}

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