0

我需要一些帮助来理解为什么我的 Swift LazyVGrid 在景观中存在重叠。这是本文中提到的一个问题:https ://swiftui-lab.com/impossible-grids/但我在我的代码中没有找到很好的解决方法。

这是模拟 iPhone 11 Pro 纵向模式下的结果。一切看起来都很好。

人像模式

但是,这是 iPhone 11 Pro 横向模式下的结果

横向模式

重叠是问题,但我不确定如何添加适当的间距。卡片似乎并没有流过柱子。

下面是对应的代码:

设置游戏视图

struct SetGameView: View {
    @ObservedObject var viewModel : SetGameViewModel
    
    var columnLayout = [GridItem(.adaptive(minimum: 50), spacing: 10),
                        GridItem(.adaptive(minimum: 50), spacing: 10),
                        GridItem(.adaptive(minimum: 50), spacing: 10),
                        GridItem(.adaptive(minimum: 50), spacing: 10)]
    
    var body: some View {
        VStack {
            GeometryReader { geometryReader in
                ScrollView {
                    LazyVGrid(columns: columnLayout, spacing: 10) {
                        ForEach(viewModel.inPlay) { card in
                            CardView(card: card)
                                .animation(.easeInOut(duration: 0.6))
                                .onTapGesture {
                                    withAnimation(.easeInOut(duration: 1)) {
                                        self.viewModel.chooseCard(card: card)
                                    }
                                }
                                .scaleEffect(card.isSelected ? CGFloat(1.05) : 1)
                                .transition(.offset(CGSize(width: 0, height: geometryReader.size.height)))
                        }
                    }
                }
                .onAppear {
                    withAnimation {
                        self.viewModel.dealInitialCards()
                    }
                }
            }
        }
    }
}

卡片视图

struct CardView: View {
    var card : SetCard
    var played = true
    
    var body: some View {
        ZStack {
            if card.isFaceUp {
                Rectangle()
                    .fill(Color.gray)
                    .overlay(
                        Rectangle()
                            .stroke(lineWidth: lineWidth)
                            .foregroundColor(.blue)
                            .opacity(card.isSelected ? 0.8 : 0)
                    )
                    .aspectRatio(aspectRatio, contentMode: .fill)
                    .opacity(0.3)
                
                CardFigureView(card: card)
                    .padding(padding)
                    .opacity(card.isFaceUp ? 1 : 0.1)
            } else {
                Image("BackCard").resizable().aspectRatio(aspectRatio, contentMode: .fill)
            }
        }
        .padding(padding)
    }
    
    private let lineWidth: CGFloat = 1
    private let padding: CGFloat = 10
    private let aspectRatio: CGFloat = 2/3
}

先感谢您!任何帮助表示赞赏。

4

0 回答 0