此SwiftUI动画只应淡出。为什么会向右移动?

此SwiftUI动画只应淡出。为什么会向右移动?,swift,swiftui,Swift,Swiftui,我很难理解为什么会这样。我把这个问题简化为它的最小表达式 我有一个文本视图,当删除它时,它应该会淡出。添加.transition(.opacity)仅为清晰起见。不需要它,因为它是默认值。但是,结果是,除了淡出之外,文本视图还会向右滑动 通过调整文本长度,我意识到在转换过程中,它的左边距要与更改按钮的左边距对齐。但为什么 相反,当添加回来时,它工作良好,没有移动。只是一个不错的淡入效果 这个问题不仅发生在iOS上,也发生在macOS上。使用Xcode 11 beta 2 导入快捷界面 结构Co

我很难理解为什么会这样。我把这个问题简化为它的最小表达式

我有一个
文本
视图,当删除它时,它应该会淡出。添加
.transition(.opacity)
仅为清晰起见。不需要它,因为它是默认值。但是,结果是,除了淡出之外,文本视图还会向右滑动

通过调整文本长度,我意识到在转换过程中,它的左边距要与更改按钮的左边距对齐。但为什么

相反,当添加回来时,它工作良好,没有移动。只是一个不错的淡入效果

这个问题不仅发生在iOS上,也发生在macOS上。使用Xcode 11 beta 2

导入快捷界面
结构ContentView:View{
@State private var showText=true
var body:一些观点{
VStack{
垫片()
如果显示文本{
文本(“我应该始终居中!”).font(.largeTitle).转换(.opacity)
}
垫片()
按钮(操作:{
withAnimation(.basic(持续时间:1.5)){self.showText.toggle()}
},标签:{
文本(“更改”)。字体(.title)
})
垫片()
}
}
}

SwiftUI自动设置布局更改的动画

我的理论是
间隔符
在隐藏
文本时会替换它,通过展开填充superview,它会将
文本
推向屏幕的后缘

您可以通过以下方法解决此问题:

Text(“我应该始终居中!”)
.font(.largeTitle)
.不透明度(showText?1:0)

文本将以这种方式淡入/淡出。

我将回答我自己的问题。。。结果是,父视图在转换期间收缩,使文本视图随之移动。为了举例说明,我在视图中添加了一些边框:

为了解决这个问题,我必须确保父视图不会收缩。只需添加以下内容:

HStack{Spacer()}

修改后的代码如下所示:

导入快捷界面
结构ContentView:View{
@State private var showText=true
var body:一些观点{
VStack{
垫片()
如果显示文本{
文本(“我应该始终居中!”).font(.largeTitle).过渡(.opacity).边框(颜色.蓝色)
}
垫片()
按钮(操作:{
withAnimation(.basic(持续时间:1.5)){self.showText.toggle()}
},标签:{
文本(“更改”).font(.title).border(颜色.蓝色)
})
垫片()
//这样可以确保父对象保持较宽,以避免移位
HStack{Spacer()}
}.边框(颜色.绿色)
}
}

我仍然认为这是一个bug,否则,淡入应该具有相同的行为,而事实并非如此。如果这不是一个bug,那就不是人们所期望的。我将提交一份错误报告。

我喜欢你对额外间隔的思考方式,尽管看起来不是这样,但它让我走上了正确的轨道(查看我发布的答案)。您的变通方法当然适用于此特定情况,但这只是一个动画。我想过渡到工作。这个例子很简单,但我在自己的代码中使用了比不透明更复杂的自定义转换。此外,您的解决方案会保留视图(隐藏并使用空间)。另一方面,通过一个正常工作的过渡,视图在动画结束时从层次结构中完全移除。我也注意到了这一点!您是否尝试过更改文本本身的对齐方式,如果这是最近的一个属性的话?我想我尝试了所有对齐方式选项,但那是我刚开始使用SwiftUI时,我可能不得不重新访问它。然而,由于一个新的测试版随时都会下降,我想我应该等一等,集中精力做其他事情。