如何在 SwiftUI 中让 2x2 的正方形适合屏幕

Posted

技术标签:

【中文标题】如何在 SwiftUI 中让 2x2 的正方形适合屏幕【英文标题】:How to have 2x2 made of squares fit screen in SwiftUI 【发布时间】:2021-05-18 03:56:15 【问题描述】:

我正在尝试通过 VStacks/HStacks 或 LazyVGrid 创建一个 2x2 网格,以使每行上的正方形适合屏幕。例如,第一个和第二个正方形各占屏幕宽度的一半,并根据该长度确定使其成为正方形的高度。我将如何以我提到的两种方式来做到这一点,或者有更好的方法吗?这是我目前所拥有的。

VStack 
    HStack 
        Rectangle()
            .fill(Color.gray)
            .frame(width: 100, height: 100)

        Rectangle()
            .fill(Color.blue)
            .frame(width: 100, height: 100)
    
    HStack 
        Rectangle()
            .fill(Color.red)
            .frame(width: 100, height: 100)

        Rectangle()
            .fill(Color.green)
            .frame(width: 100, height: 100)
    


在这里硬编码框架属性的宽度和高度感觉不对,或者这是消除方块之间间隙的方法?这种硬编码值的方式会扩展到其他手机尺寸吗?

LazyVGrid(columns: layout) 
    Rectangle()
        .fill(Color.gray)
        .frame(width: 210, height: 210)
    Rectangle()
        .fill(Color.blue)
        .frame(width: 210, height: 210)
    Rectangle()
        .fill(Color.red)
        .frame(width: 210, height: 210)
    Rectangle()
        .fill(Color.green)
        .frame(width: 210, height: 210)

编辑:这是得到我想要的新代码的样子。

VStack(spacing: 0) 
    HStack(spacing: 0) 
        Rectangle()
            .fill(Color.gray)

        Rectangle()
            .fill(Color.blue)

    
    HStack(spacing: 0) 
        Rectangle()
            .fill(Color.red)

        Rectangle()
            .fill(Color.green)

    

.aspectRatio(1.0, contentMode: .fit)

现在让它与 LazyVGrid 一起工作。

【问题讨论】:

如果只支持竖屏模式,可以使用 UIScreen.main.bounds.width @SwiftiSwift 很高兴知道这一点。我不知道。 【参考方案1】:

您可以使用GeometryReader,如here所示。

示例用法:

struct MyView: View 
    var body: some View 
       GeometryReader  geo in
           //You now have access to geo.size.width and geo.size.height
       
    

【讨论】:

@SwiftiSwift 为什么?无需查询屏幕尺寸【参考方案2】:

在这里硬编码框架的宽度和高度感觉不对,或者这是消除方块之间间隙的方法?

要消除正方形之间的间隙,只需修改 HStack / VStack 以包含间距:

HStack(alignment: .center, spacing: 0, content: 
            Rectangle()
                .fill(Color.gray)
                .frame(width: 100, height: 100)

            Rectangle()
                .fill(Color.blue)
                .frame(width: 100, height: 100)
)

【讨论】:

【参考方案3】:

只需应用aspectRatio(值为1并适合屏幕)修饰符,无需指定任何框架。

VStack 
    HStack 
        Rectangle()
            .fill(Color.gray)
            
        Rectangle()
            .fill(Color.blue)
            
    
    HStack 
        Rectangle()
            .fill(Color.red)
        
        Rectangle()
            .fill(Color.green)
            
    

.aspectRatio(1.0, contentMode: .fit)

【讨论】:

不需要值。 ContentMode 就够了.aspectRatio(contentMode: .fit) @Leo 我知道,这个值让 OP 更清楚 @vadian 谢谢。这有帮助。剩下的就是将spacing: 0 添加到 VStack 和两个 HStack 中。

以上是关于如何在 SwiftUI 中让 2x2 的正方形适合屏幕的主要内容,如果未能解决你的问题,请参考以下文章

如图,在2X2的正方形网格中,有一个以格点为顶点的三角形ABC,则网格中所有与三角形A

创建一个偶数段的正方形R的2 x 2图

如何始终在 SwiftUI 中显示键盘

如何使视图最大。 SwiftUI 中带填充的宽度

如何在 SwiftUI 中用另一个形状剪辑一个形状?

在 Flutter 中让 Row 子节点尽可能宽(父节点的剩余宽度)?