译自 Controlling the animation stack
更多内容,欢迎关注公众号 「Swift花园」
喜欢文章?不如来个 ➕三连?关注专栏,关注我
控制动画栈
在这一节,我想要把两个你已经理解的东西放在一起,单独理解都没问题,但放在一起可能有点伤脑筋。
之前我们已经理解 modifiers 的顺序会如何影响视图。因此,我们写过这样的代码:
Button("Tap Me") {
// do nothing
}
.background(Color.blue)
.frame(width: 200, height: 200)
.foregroundColor(.white)
它跟下面这种代码的效果是不一样的:
Button("Tap Me") {
// do nothing
}
.frame(width: 200, height: 200)
.background(Color.blue)
.foregroundColor(.white)
这是因为如果我们在调整 frame 之前给背景上色的话,只有原始的区域被上色,而不是之后 frame 扩展之后的区域。回忆一下,这种表象下面是 SwiftUI 用 modifier 包裹视图的机制,它使得我们可以多次应用相同的 modifier —— 我们可以通过重复多次 background() 和 padding() 来创建一个有一层层条纹的边框效果。
这里是第一个概念:modifier 的顺序很重要,因为 SwiftUI 以 modifiers 应用的顺序来包裹视图。
第二个概念是我们可以应用一个 animation() modifier 到一个视图,以便这个视图能获得一个隐式的动画。
为了演示上面两个概念,我们可以修改按钮的代码,让它根据不同的状态展示不同的颜色。首先,我们需要定义状态:
@State private var enabled = false
在按钮的 action 中切换启动状态:
self.enabled.toggle()
然后在 background() modifier 里用一个条件化的值,让按钮即可以是蓝色的,也可以是红色的: