美文网首页SwiftUI
SwiftUI-布局案例

SwiftUI-布局案例

作者: YungFan | 来源:发表于2024-04-08 14:21 被阅读0次

介绍

import SwiftUI

struct ContentView : View {    
    var body: some View {
        Text("Hello World!")
    }
}

它的结构如下:RootView —> ContentView —> Text,那么 Text 是如何显示在屏幕上的?官方的介绍是如下 3 个步骤。

  1. 父视图为子视图提供预估尺寸。
  2. 子视图计算自己的实际尺寸。
  3. 父视图根据子视图的尺寸将子视图放在自身的坐标系中。

最重要的是第 2 步,通常有 3 种设置尺寸的方式。

  1. 无需计算,根据内容推断,如 Image 根据图片大小,Text 根据文字范围。
  2. 使用 frame 强制指定宽高。
  3. 设置缩放比例,如 Image 设置 aspectRatio。

frame

准备一个 100*100 的图片。

struct ContentView: View {
    var body: some View {
        Image("img")
            .border(Color.black)
            .frame(width: 200, height: 200)
            .border(Color.blue)
    }
}
frame1.png

只有当 frame 大于内容的尺寸时,alignment 才有意义。

struct ContentView: View {
    var body: some View {
        Image("img")
            .border(Color.black)
            .frame(width: 200, height: 200, alignment: .topTrailing)
            .border(Color.blue)
    }
}
frame2.png

Stack

案例一

struct ContentView: View {
    var body: some View {
        HStack(spacing: 10) {
            Image("img")
            
            Image("img")
        }
        .frame(width: 250, height: 200)
        .border(Color.blue)
    }
}

总宽度超过 2 个 Image 和 spacing 之和,所以内容在 HStack 中正常显示。

Stack1.png
struct ContentView: View {
    var body: some View {
        HStack(spacing: 10) {
            Image("img")
            
            Image("img")
        }
        .frame(width: 140, height: 200)
        .border(Color.blue)
    }
}

总宽度小于 2 个 Image 和 spacing 之和,所以内容会超出 HStack。

Stack2.png

复杂案例

第 1 步:堆栈计算出内部间距边距,并将其从其父视图建议的大小中减去。
第 2 步:对于每个剩余视图,堆栈将剩余空间分成相等的部分。然后选择其中一个作为最不灵活的孩子,从未分配的空间中扣除其大小,然后重复该过程。
第 3 步:所有的孩子都有尺寸以后,堆栈使用间距将它们对齐,并根据指定的对齐方式将它们对齐。最后,堆栈选择自己的大小以便完全包含子级。

struct ContentView: View {
    var body: some View {
        HStack(spacing: 10) {
            Image("img")

            Text("所有的孩子都有尺寸以后,堆栈使用间距将它们对齐,并根据指定的对齐方式将它们对齐。最后,堆栈选择自己的大小以便完全包含子级。")

            Text("所有的孩子都有尺寸以后,堆栈使用间距将它们对齐,并根据指定的对齐方式将它们对齐。最后,堆栈选择自己的大小以便完全包含子级。")
        }
        .padding(.horizontal, 10)
        .frame(width: 280, height: 200)
        .border(Color.blue)
    }
}
  1. 总宽度间距为 300,其中间距为 2 * 10,边距为 2 * 10,所以布局空间为:280-40 = 240。
  2. 堆栈将空间分成 3 个相等的部分,每个部分的宽度为 80。
  3. 将 80 这个尺寸推荐给最不灵活的孩子。案例中为 Image,其尺寸为 80x80。
  4. 堆栈从剩余空间中减去 Image 的宽度,因此剩余空间为 240-80 = 160。
  5. 堆栈再次将空间分成 2 个相等的部分,每个部分的宽度为 80。
  6. 它建议第 1 个 Text 的大小为 80x200。Text 回应内容不适合,但它至少可以显示一部分内容。第 2 个文本视图也是如此。因此,尽管文本视图的文本量不同,但它们的宽度都相同,都为 80。
Stack3.png

相关文章

  • 读后有获——怎么拆文

    1,拆解布局 作文的整个布局是怎样的, 是案例+评论 2,拆解案例 是明星案例? 是身边案例? 几个案例? 3,拆...

  • 弹性布局总结

    1.flex弹性布局学习总结 2.弹性盒模型布局使用 布局案例: ...

  • Css

    CSS:页面美化和布局控制 案例:

  • RecyclerView — 布局案例

    RecyclerView 列表里面的布局技巧很多,有不少技巧能很简单的就实现很复杂的效果,值得我们去记录啊,平时多...

  • Bootstrap

    Bootstrap: 响应式布局 CSS样式和JS插件 案例

  • 2019-11-03有关flex(伸缩布局的使用)

    伸缩布局主要是解决普通布局中的浮动问题。 使得块级元素的排列更加便捷。 以下案例为微信小程序案例,若是网页开发换成...

  • View和Layoutinflater的inflate的方法对比

    案例:RecycleView适配中在创建子布局的时候,父容器的参数失效,子布局会形成包裹内容。 原因:在创建布局的...

  • html5和css3进阶(浮动)----02

    小米布局案例1:产品模块布局分析 类似于这样的产品模块,使用css+html布局来完成。 圆角边框 border-...

  • SwiftUI-手势

    SwiftUI为视图提供了许多手势,比如:单击onTapGesture()多击onTapGesture(count...

  • 3.如何用CSS进行网页布局

    最常见的是混合布局。 制作布局案例: 1.一列布局 效果如下: 2.两列布局 效果如下: 该效果是两列自适应,会随...

网友评论

    本文标题:SwiftUI-布局案例

    本文链接:https://www.haomeiwen.com/subject/ushxxjtx.html