Bla*_*olf 11 swift watchos swiftui swiftui-list
我在 SwiftUI 中有一个简单的应用程序,它显示 a List,每个项目都是 a ,VStack包含两个Text元素:
var body: some View {
List(elements) { item in
NavigationLink(destination: DetailView(item: item)) {
VStack(alignment: .leading) {
Text(item.name)
Text(self.distanceString(for: item.distance))
}
}
}
.animation(.default)
}
Run Code Online (Sandbox Code Playgroud)
.animate()之所以在那里,是因为我想在elements数组更改时对列表的更改进行动画处理。不幸的是,SwiftUI 还会对内容的任何更改进行动画处理,从而导致奇怪的行为。例如,Text每个项目中的第二个更新非常频繁,现在更新将...在更新到新内容之前很快显示被截断的标签(在末尾)。
那么如何在更新列表内容时防止这种奇怪的行为,但在列表中的元素发生变化时保持动画呢?
如果相关,我正在创建一个 watchOS 应用程序。
Asp*_*eri 17
以下应该禁用行内部的动画
VStack(alignment: .leading) {
Text(item.name)
Text(self.distanceString(for: item.distance))
}
.animation(nil)
Run Code Online (Sandbox Code Playgroud)
Bre*_*ett 10
@Asperi 的回答也解决了我遇到的问题(一如既往地支持他的回答)。
我在使用以下内容为整个屏幕设置动画时遇到了一个问题: AnyTransition.asymmetric(insertion: .move(edge: .bottom), removal: .move(edge: .top))
并且所有的 Text() 和 Button() 子视图也以奇怪且不那么美妙的方式进行动画处理。看到 Asperi 的回答后,我使用 animation(nil) 来解决这个问题。然而,问题是我的按钮不再在选择时动画,以及我想要的其他动画。
所以我添加了一个新的 State 变量来打开和关闭 VStack 的动画。默认情况下它们是关闭的,在屏幕上显示动画后,我会在一小段延迟后启用它们:
struct QuestionView : View {
@State private var allowAnimations : Bool = false
var body : some View {
VStack(alignment: .leading, spacing: 6.0) {
Text("Some Text")
Button(action: {}, label:Text("A Button")
}
.animation(self.allowAnimations ? .default : nil)
.onAppear() {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
self.allowAnimations = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
只需为与我有类似问题并需要建立在 Asperi 出色答案基础上的任何人添加此内容。
| 归档时间: |
|
| 查看次数: |
7425 次 |
| 最近记录: |