SwiftUI在VStack / HStack中复制了边框

时间:2020-08-18 08:14:19

标签: swiftui

我在HStack和VStack中有很多tile视图。每个图块周围都应有边框。我面临的问题是,我不想在堆栈中有任何间距。但是,由于视图彼此并排放置,因此会导致边框重复。

这是我的例子:

struct TileMain: View {
    
    var body: some View {

        VStack
        {
            HStack(spacing: 0.0)
            {
                Tile()
                    .border(Color.red, width: 1.0)
                Tile()
                    .border(Color.red, width: 1.0)
                Tile()
                    .border(Color.red, width: 1.0)
            }
            HStack(spacing: 0.0)
            {
                Tile()
                .border(Color.red, width: 1.0)

                Tile()
                    .border(Color.red, width: 1.0)
                
                Tile()
                    .border(Color.red, width: 1.0)
            }
            .padding(.bottom, 15)
        }
    }
}
struct Tile : View
{
    var body: some View
    {
        VStack
        {
            Spacer()
            Text("Test")
            Spacer()
        }.frame(width: 150, height: 150)
    }
}

enter image description here

底部边框的宽度为1.0。但是,在有邻居的任何地方,边界将为2.0宽。有什么解决办法吗?我只需要在特殊的边缘设置边框,这样就不会出现任何重复。但这不可能是我在SwiftUI中的默认设置。

2 个答案:

答案 0 :(得分:1)

让我们颠倒思维...并使用类似以下的内容

通过Xcode 11.4 / macOS 10.15.6测试

demo

struct TileMain: View {

    var body: some View {

        VStack(spacing: 1)
        {
            HStack(spacing: 1)
            {
                Tile()
                Tile()
                Tile()
            }
            HStack(spacing: 1)
            {
                Tile()
                Tile()
                Tile()
            }
        }
        .padding(1)
        .background(Color.red)
    }
}
struct Tile : View
{
    var body: some View
    {
        VStack
        {
            Spacer()
            Text("Test")
            Spacer()
        }.frame(width: 150, height: 150)
        .background(Color(NSColor.windowBackgroundColor))
    }
}

答案 1 :(得分:1)

您可以使用间距:-1.0(或任何边框宽度):)

struct TileMain: View {
  var body: some View {
    VStack(spacing: -1.0)
    {
      HStack(spacing: -1.0)
      {
        Tile()
          .border(Color.red, width: 1.0)
        Tile()
          .border(Color.red, width: 1.0)
        Tile()
          .border(Color.red, width: 1.0)
      }
      HStack(spacing: -1.0)
      {
        Tile()
        .border(Color.red, width: 1.0)
        Tile()
          .border(Color.red, width: 1.0)
        Tile()
          .border(Color.red, width: 1.0)
      }
      .padding(.bottom, 15)
    }
  }

}