Swift 如何使 HStack 使用 .frame(maxWidth: .infinity) 均匀填充

Swift 如何使 HStack 使用 .frame(maxWidth: .infinity) 均匀填充

问题描述

我正在尝试制作一个自定义的选项卡栏。我希望 HStack 内部的图像均匀填充。当前的进展如下。有什么想法吗?我对 SwiftUI 还不是很熟悉。

struct MainView: View {
    var body: some View {
        VStack {
            Text("Main View")
            Spacer()
            MainTabBar()
                .background(Color.primaryBackground)
        }
    }
}

struct MainTabBar: View {
    var body: some View {
        HStack(alignment: .center) {
            Image.chatTabBarItem
                .renderingMode(.template)
                .resizable()
                .scaledToFit()
                .frame(width: 26, height: 26)
                .foregroundColor(.white)
                .padding(4)
                .clipShape(Circle())
                .onTapGesture {

                }
            Image.groupTabBarItem
                .renderingMode(.template)
                .resizable()
                .scaledToFit()
                .frame(width: 26, height: 26)
                .foregroundColor(.white)
                .padding(4)
                .clipShape(Circle())
                .onTapGesture {

                }
            Image.circleTabBarItem
                .renderingMode(.template)
                .resizable()
                .scaledToFit()
                .frame(width: 26, height: 26)
                .foregroundColor(.white)
                .padding(4)
                .clipShape(Circle())
                .onTapGesture {

                }
        }
        .frame(height: 60)
        .frame(maxWidth: .infinity)
        .background(Color.green)
    }
}

Swift 如何使 HStack 使用 .frame(maxWidth: .infinity) 均匀填充

解决方案

接受的答案使用 Spacer . 这将在 Spacer 之间平均分配多余的空间。如果您希望项目之间有相等的间距,并且项目本身宽度相等,则可以使用此方法。

但是,如果项目的宽度不完全相同,那么这可能不是您想要的。例如,如果您的组中的第三个项目比其他项目的宽度小,则中间的项目将不会居中。

另一种方法是对项目应用 .frame(maxWidth: .infinity) . 这将为每个项目提供相同的空间量。为了限制组的整体宽度,只需要在包含它们的容器上设置一个固定宽度即可。

示例:

HStack {
  Image(...)
     .frame(maxWidth: .infinity)
  Image(...)
     .frame(maxWidth: .infinity)
  Image(...)
     .frame(maxWidth: .infinity)
}
.frame(width: 300)

通过这种方法,无论物品的大小是否不同,中间的物品都将始终居中。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程