В моем приложении у меня есть кнопка, которую я хочу анимировать, чтобы уменьшить масштаб при касании. Для этого я создал кастом 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
}
}
Здесь я запускаю приложение в светлом режиме, затем закрываю его, включаю темный режим, затем открываю переключатель приложений и вижу, что поле черное на черном фоне. Коробка должна быть белой, как это происходит, когда я нажимаю на приложение, чтобы вернуть его на передний план.
Отлично работает с 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)
}
}