【发布时间】:2021-07-14 09:09:42
【问题描述】:
在我构建的 UIKit 应用程序中,我曾经使用过这种效果,滚动视图将通过使用 UIPropertyAnimator 并操纵它的 fractionComplete 属性来控制启用/禁用视图中特定约束的动画。这允许动画跟随滚动视图的进展。
在 SwiftUI 中,我不再控制约束,而是根据 @State 变量更改整个视图层次结构(例如,我想要在两种状态之间转换的视图有一个名为 isExpanded 的属性)。
使用 SwiftUI 的withAnimation 只需切换我需要的布尔值即可轻松完成这个简单的转换。使用matchedGeometryEffect(id:in:properties:anchor:isSource:),我可以轻松地将元素从/移到正确的位置。
我想弄清楚的是我怎样才能基本上暂停然后控制动画的进程,以便通过平移手势控制我的开始和结束状态之间的转换,或者,比如我曾经在 UIKit 中通过 ScrollView 进行操作。
这是我的 SwiftUI 代码的基本示例:
struct MyTwoStatesView: View {
@Namespace var namespace
@State var isExpanded: Bool = true
var body: some View {
ZStack {
RoundedRectangle(cornerRadius: 4)
.fill(Color.gray)
if isExpanded {
ExpandedStateView(namespace: namespace)
}
else {
CollapsedStateView(namespace: namespace)
}
}
.fixedSize(horizontal: false, vertical: true)
.onTapGesture {
withAnimation {
isExpanded.toggle()
}
}
}
}
后期编辑: 这是“完整”示例的要点:https://gist.github.com/zeusent/39f58827519d9bfda63271a9cb24d6b6
【问题讨论】:
-
您能否显示
ExpandedStateView和CollapsedStateView的代码(这样我们就不需要重新创建布局)? -
我添加了一个指向包含完整布局示例的要点的链接,即使布局本身并不重要。基本上我希望能够通过平移手势或滚动视图位置来控制交换动画。
-
我认为您可以通过自己计算每个动画并通过交互值(平移手势、滚动视图位置...等)更改视图位置和大小来做到这一点
标签: animation swiftui interactive