SwiftUI ButtonStyle 动画导致 UI 在系统外观更改时不在 App Switcher 快照中更新
SwiftUI ButtonStyle animation causes UI not to update in App Switcher snapshot when system appearance changes
在我的应用程序中,我有一个按钮,当它被触摸时,我想制作动画以缩小。为此,我创建了一个带有显式 animation
的自定义 ButtonStyle
。这按预期工作,但在 dark/light 模式系统外观之间切换时引入了问题。如果您在应用程序打开时更改它,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
}
}
我这里是运行浅色模式的应用,然后我关闭它,启用深色模式,然后打开App Switcher,发现黑色背景上的框是黑色的。该框应该是白色的,就像我点击应用程序 return 它到前台时一样。
在 iOS 14.1 上工作正常,所以我认为这是另一个 14.2 缺陷。
尝试link动画赋值(未测试,只是想法):
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)
}
}
在我的应用程序中,我有一个按钮,当它被触摸时,我想制作动画以缩小。为此,我创建了一个带有显式 animation
的自定义 ButtonStyle
。这按预期工作,但在 dark/light 模式系统外观之间切换时引入了问题。如果您在应用程序打开时更改它,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
}
}
我这里是运行浅色模式的应用,然后我关闭它,启用深色模式,然后打开App Switcher,发现黑色背景上的框是黑色的。该框应该是白色的,就像我点击应用程序 return 它到前台时一样。
在 iOS 14.1 上工作正常,所以我认为这是另一个 14.2 缺陷。
尝试link动画赋值(未测试,只是想法):
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)
}
}