swiftui - ScrollView 中的初始 SwiftUI 动画
问题描述
在我的应用程序中ScrollView
,我有一个VStack
. 有VStack
一个animation
修饰符。它还有一个带有transition
修饰符的条件视图。过渡有效。但是,当视图首次出现时,内容会以 0 的起始宽度放大。您可以在下面视频的绿色边框上看到这一点。这只发生在 theVStack
内部ScrollView
或VStack
具有animation
修饰符的情况下。
我尝试了其他不同的方法,例如设置 afixedSize
或设置animation(nil)
,但我无法让它工作。
我不在乎开头是否有动画,或者视图是否转换到屏幕上。但我绝对不想要一开始的糟糕动画。当我单击按钮时,Text
和Button
都应该动画。
我还使用以下简化代码测试了这种行为。
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
ScrollView {
VStack(spacing: 32) {
if self.viewModel.shouldShowText {
Text("Hello, World! This is a some text.")
.transition(
AnyTransition
.move(edge: .top)
.combined(
with:
.offset(
.init(width: 0, height: -100)
)
)
)
}
Button(
action: {
self.viewModel.didSelectButton()
},
label: {
Text("Button")
.font(.largeTitle)
}
)
}
.border(Color.green)
.animation(.easeInOut(duration: 5))
.border(Color.red)
HStack { Spacer() }
}
.border(Color.blue)
}
}
class ViewModel: ObservableObject {
@Published private var number: Int = 0
var shouldShowText: Bool {
return self.number % 2 == 0
}
func didSelectButton() {
self.number += 1
}
}
解决方案
它适用于 Xcode 12 / iOS 14(以及独立和 in NavigationView
),所以我认为它是以前版本中的 SwiftUI 错误。
无论如何,尝试通过值激活动画,如下所示(经过测试和工作)
// ... other code
}
.border(Color.green)
.animation(.easeInOut(duration: 5), value: viewModel.number) // << here !!
.border(Color.red)
对于这项工作,它需要提供已发布的属性以供观察
class BlockViewModel: ObservableObject {
@Published var number: Int = 0 // << here !!
// ... other code
推荐阅读
- asp.net - 如何使 Web 浏览器的 url 保持在 MVC 错误 404 中
- vba - 使用添加的变量值重命名文件夹中的所有文件而不打开
- spring - 来自 yaml 的 Spring 配置 - 结合 @ConfigurationEnabled 加载参数化文件名
- android - 虚幻引擎如何处理手机不同的屏幕分辨率?特别是用户界面
- javascript - 向有页脚的表格添加滚动条
- php - Typo3 8.7.x / Typoscript:无法在表格页面中添加字段
- go - 以正确的方式选择协会
- angular - Jasmine + Angular中的模拟“窗口”对象
- opencv - Solvepnp CPP 函数给出不同的结果
- angular - 如何循环嵌套的json响应打字稿Angular 2