美文网首页
SwiftUI一起学之三 -- 布局

SwiftUI一起学之三 -- 布局

作者: sunny_ke_ke | 来源:发表于2021-05-09 22:22 被阅读0次

    一 布局法则

    1. 父view为子view提供一个建议的size,并询问子视图的大小
    2. 子view根据自身的特性,返回一个size
    3. 父view根据子view返回的size为其进行布局

    二 布局中立

    布局中立 (layout neutral):本身没有任何大小,而是可以根据需要进行调整以适应任何大小。

    三 View计算自己的Size

    在SwfitUI中,view在计算自己size的时候会有不同的行为方式,我们分为4类:

    • 类似于Vstack,它们会尽可能让自己内部的内容展示完整,但也不会多要其他的额外空间
    • 类似于Text这种只返回自身需要的size,如果size不够,它非常聪明的做一些额外的操作,比如换行等等
    • 类似于Shape这种给多大尺寸就使用多大尺寸
    • 还有一些可能超出父控件的view

    还存在其他一些比较特殊的例外,比如Spacer,他的特性跟他属于哪个容器或者哪个轴有关系。当他在VStack中时,他会尽可能的占据剩余垂直的全部空间,而占据的水平空间为0,在HStack中,他的行为却又恰恰相反。

    3.1 例子

    struct LayoutView: View {
        var body: some View {
            Text("Hello, World!")
                .frame(width: 200, height: 100)
                .background(Color.green)
                .frame(width: 400, height: 200)
                .background(Color.orange.opacity(0.5))
        }
    }
    
    1. 对于LayoutView,其父View给他的建议尺寸为整个屏幕大小

    我们先考虑LayoutView,他的父view给他的建议尺寸为整个屏幕的大小,我们称为size0,他去询问他的child,他的child为最下边的那个background,这个background自己也不知道自己的size,因此他继续拿着size0去询问他自己的child,他的child是个frame,返回了width400, height200, 因此background告诉ContentView他需要的size为width400, height200,因此最终ContentView的size为width400, height200。
    很显然,我们也计算出了最下边background的size,注意,里边的Color也是一个view,Color本身是一个Shape,background返回一个透明的view
    我们再考虑最上边的background,他父view给的建议的size为width: 400, height: 200,他询问其child,得到了需要的size为width: 200, height: 100,因此该background的size为width: 200, height: 100。
    我们在看Text,父View给的建议的size为width: 200, height: 100,但其只需要正好容纳文本的size,因此他的size并不会是width: 200, height: 100


    image.pngimage.png

    3.2

    var body: some View {
            VStack{
                Text("Hello, world 1")
                    .border(Color.green)
                Text("Hello, world 2")
                    .border(Color.green)
                    .frame(width: 200, height: 50)
                    .border(Color.red)
                Text("Hello, world 3")
                    .frame(width: 200, height: 50)
                    .border(Color.green)
            }
        }
    
    image.pngimage.png

    布局说明:
    VStack为垂直布局容器,为子View提供一个建议的size,为全屏幕的尺寸
    在SwiftUI中修饰符的顺序很重要,不同的顺序产生不同的结果

    参考:

    1. SWiftUI之Layout基础篇
    2. SwiftUI 中布局的工作原理
    3. SwiftUI之frame详解

    相关文章

      网友评论

          本文标题:SwiftUI一起学之三 -- 布局

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