Button 如何在SwiftUI中使按钮组宽度相同

Button 如何在SwiftUI中使按钮组宽度相同,button,swiftui,Button,Swiftui,我有一组三个按钮用于媒体控制(向后跳、播放/暂停、向前跳)。当我按下播放按钮时,“播放”图标被“暂停”图标取代,占用的空间稍小。由于我没有定义任何大小限制,pause按钮会变小一点,并导致其他两个按钮移动一点 如何使所有三个按钮具有相同的宽度而不定义任何硬约束,因为当前按钮在所有不同的设备上都具有完美的大小 简化代码: HStack { Button(action: { }) { Image(systemName: "backward.end") }.paddin

我有一组三个按钮用于媒体控制(向后跳、播放/暂停、向前跳)。当我按下播放按钮时,“播放”图标被“暂停”图标取代,占用的空间稍小。由于我没有定义任何大小限制,pause按钮会变小一点,并导致其他两个按钮移动一点

如何使所有三个按钮具有相同的宽度而不定义任何硬约束,因为当前按钮在所有不同的设备上都具有完美的大小

简化代码:

HStack {
    Button(action: { }) {
        Image(systemName: "backward.end")
    }.padding().
    viewModel.isPlaying ? Button(action: { }) {
        Image(systemName: "pause")
    }.padding() : Button(action: { }) {
        Image(systemName: "play")
    }.padding()
    Button(action: { }) {
        Image(systemName: "forward.end")
    }.padding()
}

我也在用音频播放器做类似的事情。我的方法是将最大视图的不可见(
.opacity(0.0)
)副本放置在
ZStack
中,这样大小就不会跳跃

ZStack{
图像(系统名称:“较大的按钮图像”)
.不透明度(0.0)
图像(系统名称:“较小的按钮图像”)
}

如果您知道大小的差异,则可以按不同的数量填充图像 i、 e.
图像(系统名称:“较大”)。填充(.horizontal,1)
图像(系统名称:“较小”)。填充(.horizontal,5)

也可以将条件表达式包装在VStack中,然后将帧应用于VStack,使其成为固定宽度。您可能希望将图像置于VStack的中心

play.circle和pause.circle看起来更像是相同的大小,或者您可以使用playpause图像


最后,您可以使用SF symbols应用程序导出符号并修复它们。

我在UILabels中也经常使用它。例如,如果您有一个时钟/滴答器,请使用带有
.text=“00:00:00”
的不可见UILabel进行布局,并将实际内容放在其上方(视情况而定为前导/尾随)。现在,布局不会随着每一个滴答声而改变。不过使用SwiftUI要容易得多!