SwiftUI:将动画添加到拾取程序,而不将其添加到值中

SwiftUI:将动画添加到拾取程序,而不将其添加到值中,swiftui,picker,Swiftui,Picker,我正在尝试根据切换设置选择器隐藏/显示的动画。如果为true或false,我希望选择器能够easeInOut 我已经尝试将.animation(animation.easeInOut(duration:0.5))添加到拾取程序本身或拾取程序所在的HStack中,但两者都将动画添加到拾取程序内的值,并且在滚动应用程序的值时崩溃 HStack{ 如果选秀{ 选择器(选择:$selected.value,标签:Text(selected.type)){ ForEach(数字,id:\.self){d

我正在尝试根据切换设置选择器隐藏/显示的动画。如果为true或false,我希望选择器能够
easeInOut

我已经尝试将
.animation(animation.easeInOut(duration:0.5))
添加到拾取程序本身或拾取程序所在的HStack中,但两者都将动画添加到拾取程序内的值,并且在滚动应用程序的值时崩溃

HStack{
如果选秀{
选择器(选择:$selected.value,标签:Text(selected.type)){
ForEach(数字,id:\.self){d in
文本(“\(d)”)
}
}
.框架(宽度:40)
}
}
.animation(animation.easeInOut(持续时间:2))
if showPicker{
选择器(选择:$selected.value,标签:Text(selected.type)){
ForEach(数字,id:\.self){d in
文本(“\(d)”)
}
}
.框架(宽度:40)
.animation(animation.easeInOut(持续时间:0.5))
}
这两个选项都会设置隐藏/显示选择器的动画,但也会设置在选择器中滚动值的动画,这会导致选择器崩溃

任何帮助都将不胜感激


感谢您的第一个方法,将动画放到HStack上。永远不要那样做。根据声明文件中的注释:

在叶视图而不是容器视图上使用此修改器。这个 动画应用于此视图中的所有子视图;使命感 容器视图上的
动画(:)
会导致范围无限

我尝试了你的第二种方法(填补你文章中缺失的部分),它不会崩溃。也许你可以用一个完全重复的例子来更新你的问题

将动画更改为显式,因此其他参数不受影响:

struct PickerStackOverflow:视图{
@状态私有变量showPicker=true
@国家私有变量值:Int=1
让数字:[Int]=[1,2,3,4,5,6,7,8,9,10,11,12,13,14]
var body:一些观点{
VStack{
文本(“选定\(值)”)
HStack{
如果选秀{
选择器(选择:$value,标签:文本(“标签”)){
ForEach(数字,id:\.self){d in
文本(“\(d)”)
}
}
.框架(宽度:40)
}
}
按钮(“点击我”){
带动画(Animation.easeInOut(持续时间:2)){
self.showPicker.toggle()
}
}
}
}
}

我尝试了您的代码,但仍然看到选择器中的值存在问题,在本例中为1-14,也得到了动画。如果您注释掉
.animation(animation.easeInOut(duration:2))
并再次运行它,您可以看到它的滚动更加平滑。如果你滚动得很快,你仍然可以看到所有的数字。使用“动画”修改器,如果您快速滚动,值似乎会消失,体验会有点笨拙。另外,感谢您提供有关在容器上使用动画的信息。我看不到您的评论。你在beta 5中吗?模拟器?装置?实时预览?我更新了代码,使其使用显式(而不是隐式)动画。因为我不能重现这个问题,我不知道这是否会解决它,但应该解决。是的,显式解决了它。非常感谢。仅供其他可能想知道的人参考,这是使用手表模拟器的beta 5版本。