【发布时间】:2021-03-07 22:59:52
【问题描述】:
当用户选择不同的选项卡时,我想实现下划线从一个选项卡移动到另一个选项卡的幻灯片动画
我使用matchedGeometryEffect如下:
HStack(spacing: 15) {
ForEach(categories, id: \.self) { category in
let isSelected = selectedVal == category
Button {
withAnimation {
selectedVal = category
}
} label: {
VStack(spacing: 4) {
Text(category)
.frame(width: 100)
if isSelected {
RoundedRectangle(cornerRadius: 5)
.frame(width: 50, height: 2)
.matchedGeometryEffect(id: "Category", in: animation, isSource: isSelected)
}
}
}
}
}
这种方法适用于Multiple inserted views in matched geometry group Pair<String, ID>(first: "Category", second: SwiftUI.Namespace.ID(id: 10)) have isSource: true, results are undefined.的警告
当我从Button中提取RoundedRectangle时,警告消失了:
HStack(spacing: 15) {
ForEach(categories, id: \.self) { category in
let isSelected = selectedVal == category
VStack(spacing: 4) {
Button(category) {
withAnimation {
selectedVal = category
}
}
if isSelected {
RoundedRectangle(cornerRadius: 5)
.frame(width: 50, height: 2)
.matchedGeometryEffect(id: "Category", in: animation, isSource: isSelected)
}
}
}
}
我怀疑这与Button 未在第一个解决方案中的视图层次结构中删除有关,因此仍然持有对RoundedRectangle 的引用,这会使matchedGeometry 混淆,因为您不能拥有源视图“可见”,但我会认为 isSource 设置为选定状态会解决这个问题。有没有解释为什么我在第一种情况下收到警告?
【问题讨论】:
-
对我来说它看起来像一个 SwiftUI 错误。
-
我发现将动画持续时间设置为更快的时间有助于避免在补间期间用户可能在不合适的时间按下按钮的冲突。为什么它需要让程序崩溃而不是放弃,这超出了我的理解。
标签: ios swift animation swiftui