SwiftUI 布局(Layout)基礎(chǔ)

1、VStack(垂直布局)(對應(yīng)還有LazyVStack懶加載垂直布局晴裹,iOS 14.0才可使用)

VStack 會一次性渲染所有視圖怕轿,無論它們是在屏幕上還是屏幕外肄满。 當(dāng)您有少量子視圖或不希望“懶加載”延遲渲染時,請使用常規(guī) VStack智政。

import SwiftUI
struct ContentView: View {
    var body: some View {
        VStack(
            alignment: .leading,
            spacing: 10
        ) {
            ForEach(
                0...10,
                id: \.self
            ) {
                Text("Item \($0)")
                    .background(Color.blue)
            }
        }
    }}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

alignment:對接方式认罩,左/中/右

extension HorizontalAlignment {

    /// A guide marking the leading edge of the view. 
    public static let leading: HorizontalAlignment

    /// A guide marking the horizontal center of the view.
    public static let center: HorizontalAlignment

    /// A guide marking the trailing edge of the view.
    public static let trailing: HorizontalAlignment
}

spacing:間距

截屏2021-12-26 23.32.42.png

2、HStack(水平布局)(對應(yīng)還有LazyHStack懶加載水平布局续捂,iOS 14.0才可使用)

HStack 會一次性渲染所有視圖垦垂,無論它們是在屏幕上還是屏幕外。 當(dāng)您有少量子視圖或不希望“懶加載”延遲渲染時牙瓢,請使用常規(guī) HStack劫拗。

var body: some View {
    HStack(
        alignment: .top,
        spacing: 10
    ) {
        ForEach(
            1...5,
            id: \.self
        ) {
            Text("Item \($0)")
        }
    }
}
截屏2021-12-26 23.16.05.png
3、ZStack(層疊布局)

ZStack 為每個連續(xù)的子視圖分配比前一個更高的 z 軸值矾克,這意味著后面的子視圖出現(xiàn)在前面的子視圖的“頂部”页慷。
下面的示例創(chuàng)建一個 100 x 100 點的 ZStack 矩形視圖,填充六種顏色之一胁附,將每個連續(xù)的子視圖偏移 10 點酒繁,使它們不會完全重疊:

let colors: [Color] =
    [.red, .orange, .yellow, .green, .blue, .purple]

var body: some View {
    ZStack {
        ForEach(0..<colors.count) {
            Rectangle()
                .fill(colors[$0])
                .frame(width: 100, height: 100)
                .offset(x: CGFloat($0) * 10.0,
                        y: CGFloat($0) * 10.0)
        }
    }
}
截屏2021-12-26 23.19.59.png
import SwiftUI

struct ContentView: View {
   
    var body: some View {
        ZStack {
            Rectangle()
                .fill(Color.red)
                .frame(width:300, height:300)
                .zIndex(0)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width:200, height:200)
            
            Rectangle()
                .fill(Color.yellow)
                .frame(width:100, height:100)
        }
    }
    
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
截屏2021-12-26 23.27.56.png

zIndex:層疊優(yōu)先級,從大到小1-0

4控妻、Spacer (填充布局)

一個靈活的填充空間布局州袒,垂直/水平填充,默認(rèn)填充滿剩余所有空間饼暑,也可以指定填充的寬度或高度

  • 4-1 未填充前的水平布局


    截屏2021-12-27 23.26.59.png
  • 4-2 填充后的水平布局(垂直布局一樣的效果)
import SwiftUI

struct ContentView: View {
    var body: some View {
        HStack(
            alignment: .top,
            spacing: 10
        ) {
            Text("Item 1")
                .background(Color.purple)
            Spacer()
            Text("Item 2")
                .background(Color.purple)
            Spacer()
            Text("Item 3")
                .background(Color.purple)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
截屏2021-12-27 23.28.33.png
  • 4-3 填充后的水平布局(垂直布局一樣的效果)
import SwiftUI

struct ContentView: View {
    var body: some View {
        HStack(
            alignment: .top,
            spacing: 10
        ) {
            Spacer()
            Text("Item 1")
                .background(Color.purple)
            Spacer()
            Text("Item 2")
                .background(Color.purple)
            Spacer()
            Text("Item 3")
                .background(Color.purple)
            Spacer()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

截屏2021-12-27 23.28.45.png

minLength:設(shè)置填充最小寬度/高度

5稳析、ScrollView

滾動視圖在可滾動內(nèi)容區(qū)域內(nèi)顯示其內(nèi)容。 當(dāng)用戶執(zhí)行適合平臺的滾動手勢時弓叛,滾動視圖會調(diào)整底層內(nèi)容的可見部分彰居。 ScrollView 可以水平、垂直或同時滾動撰筷,但不提供縮放功能陈惰。(一般配合HStack、VStack等布局使用)
在以下示例中毕籽,ScrollView 允許用戶滾動包含 100 個文本視圖的 VStack抬闯。 列表后的圖像顯示了右側(cè)滾動視圖的臨時可見滾動條; 您可以使用 ScrollView 初始值設(shè)定項的 showsIndicators 參數(shù)禁用它关筒。

var body: some View {
    ScrollView {
        VStack(alignment: .leading) {
            ForEach(0..<100) {
                Text("Row \($0)")
            }
        }
    }
}
截屏2021-12-27 23.39.15.png

Axis.set: 設(shè)置滾動方向/水平/垂直
showsIndicators:是否顯示滾動指示器

6溶握、GeometryReader(相對布局)

一個容器視圖,將其內(nèi)容定義為它自己的大小和坐標(biāo)空間的函數(shù)蒸播∷埽可以獲取到視圖的大小和坐標(biāo)

import SwiftUI

struct ContentView : View {
    var body: some View {
        
        VStack {
            
            Text("Hello There!").background(Color.orange)
            MyRectangle()
            
        }.frame(width: 150, height: 100).border(Color.yellow)

    }
}

struct MyRectangle: View {
    var body: some View {
        GeometryReader { geometry in
            Rectangle()
                .path(in: CGRect(x: geometry.size.width + 5,
                                 y: 0,
                                 width: geometry.size.width/2,
                                 height: geometry.size.height))
                .fill(Color.pink)
            
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
截屏2021-12-27 23.54.37.png
7萍肆、ViewBuilder

通常使用 ViewBuilder 作為子視圖生成閉包參數(shù)的參數(shù)屬性,允許這些閉包提供多個子視圖胀屿。 例如塘揣,以下CustomView接受一個通過視圖構(gòu)建器生成一個或多個視圖的閉包。(通常用來自定義View宿崭、dialog亲铡、toast等)

import SwiftUI

struct ContentView : View {
    var body: some View {
        CustomView{
            Text("Itme 1")
            Text("Itme 2")
            Text("Itme 3")
        }
    }
}

struct CustomView<Content>:View where Content:View {
    private let content:Content
    init(@ViewBuilder content:() -> Content) {
        self.content = content()
    }
    
    var body: some View{
        VStack{
            content
                .padding()
        }
        .foregroundColor(.orange)
        .background(Color.pink)
        .font(.title)
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
截屏2021-12-28 00.08.06.png
8、LazyVGrid (懶加載垂直網(wǎng)格布局)(iOS 14.0才可使用)

控件顯示到屏幕里才會加載(性能會有提升)

import SwiftUI
struct ContentView : View {
    var body: some View {
        let columns: [GridItem] =
            Array(repeating: .init(.flexible(), spacing: 0), count: 4)
         ScrollView {
             LazyVGrid(columns: columns) {
                ForEach((0...79), id: \.self) {
                    let codepoint = $0 + 0x1f600
                    let emoji = String(Character(UnicodeScalar(codepoint)!))
                    Text("\(emoji)")
                        .font(.largeTitle)
                        .background(Color.blue)
                }
             }.font(.largeTitle)
         }
         .padding()
    }
}
截屏2021-12-28 21.46.41.png
9葡兑、LazyHGrid (懶加載水平網(wǎng)格布局)(iOS 14.0才可使用)

控件顯示到屏幕里才會加載

import SwiftUI

struct ContentView : View {
    var body: some View {
        let rows: [GridItem] =
                Array(repeating: .init(.fixed(50)), count: 2)
        ScrollView(.horizontal) {
            LazyHGrid(rows: rows, alignment: .top) {
                ForEach((0...79), id: \.self) {
                    let codepoint = $0 + 0x1f600
                    let emoji = String(Character(UnicodeScalar(codepoint)!))
                    Text("\(emoji)")
                        .font(.largeTitle)
                        .background(Color.blue)
                }
            }
        }
        .padding()
    }
}
截屏2021-12-28 21.45.07.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奖蔓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铁孵,更是在濱河造成了極大的恐慌锭硼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕劝,死亡現(xiàn)場離奇詭異檀头,居然都是意外死亡,警方通過查閱死者的電腦和手機岖沛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門暑始,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婴削,你說我怎么就攤上這事廊镜。” “怎么了唉俗?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵嗤朴,是天一觀的道長。 經(jīng)常有香客問我虫溜,道長雹姊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任衡楞,我火速辦了婚禮吱雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘾境。我一直安慰自己歧杏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布迷守。 她就那樣靜靜地躺著犬绒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兑凿。 梳的紋絲不亂的頭發(fā)上懂更,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天眨业,我揣著相機與錄音急膀,去河邊找鬼沮协。 笑死,一個胖子當(dāng)著我的面吹牛卓嫂,可吹牛的內(nèi)容都是我干的慷暂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼晨雳,長吁一口氣:“原來是場噩夢啊……” “哼行瑞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐禁,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤血久,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帮非,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氧吐,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年末盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了筑舅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡陨舱,死狀恐怖翠拣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情游盲,我是刑警寧澤误墓,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站益缎,受9級特大地震影響谜慌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜链峭,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一畦娄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弊仪,春花似錦熙卡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至役听,卻和暖如春颓鲜,著一層夾襖步出監(jiān)牢的瞬間表窘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工甜滨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乐严,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓衣摩,卻偏偏與公主長得像昂验,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艾扮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容