iOS SwiftUI 入門

目前swiftUI最低支持iOS13崭篡,蘋果還在不斷升級完善,目前還不成熟,因為現在widget必須用swiftUI布局响蓉,所以有幸把swiftUI應用到項目。當我寫swiftUI的demo時感覺這東西好簡單EZ哨毁,但是真到了項目中是各種坑

編輯代碼的兩種方式

1.代碼
2.preview畫布枫甲,拖拽控件,檢查器,inspector

因為preview有時有問題想幻,也不方便調試粱栖,需要維護一套假數據,所以一般用代碼脏毯。

布局

swiftUI控件大多為結構體

基本布局需要三個Stack:

HStack:水平布局闹究,X軸
VStack:垂直布局,Y軸
ZStack:層疊布局抄沮,Z軸

可以看做是一個三維坐標系

如果原來寫過flutter會對這個布局很熟悉跋核,HStack相當于Row,VStack相當于Colum,但是swiftUI叛买,HStack的alignment只有垂直對齊方式砂代,VStack的alignment只有水平對齊方式,對齊方式是指Stack內部元素的對齊方式率挣,而不是Stack本身刻伊,Stack的實際大小是根據里面子視圖的大小來撐開的,如果Stack內部只有一個元素椒功,不管你設置任何對齊方式都是不起作用的
比如有一個需求捶箱,設置一個圖片緊貼左上角
EZ啊

VStack(alignment: .leading){
    Image("cloudy")
}

發(fā)現是居中,然后修改

ZStack(alignment:.topLeading){
    Image("cloudy")
}

還是居中沒變动漾,是因為Stack內部就一張圖片丁屎,所以Stack就是圖片大小,需要撐開Stack才能設置內部坐上對齊旱眯,修改如下

ZStack(alignment:.topLeading){
    Color(.clear)
    Image("cloudy")
}

用Color來撐開Stack晨川,當然也可以用別的方式,比如

VStack(alignment: .leading){
    HStack(alignment: .top){
        Image("cloudy")
        Spacer()
    }
    Spacer()
}

Spacer()撐開Stack

通過這三種Stack互相嵌套可以實現各種復雜的布局

需要注意的是删豺;這三種Stack中的控件之間默認是有間距的共虑,所以需要指定間距,比如VStack(spacing:0)

布局通用屬性

細節(jié)的位置變化需要用到frame呀页,offSet妈拌,positionpadding蓬蝶,layoutPriority

frame只能指定寬高
.frame(minWidth: ,maxWidth: , minHeight: ,maxHeight:)用來給調用者一個大小限制尘分,不能超出這個限制
idealWidth: ,idealHeight: 理想大小。必須配合.fixedSize(horizontal: true, vertical: false)才能生效丸氛,例如:
.frame(idealWidth: 300)
.fixedSize(horizontal: true, vertical: false)//設置在哪個方向強制生效音诫,水平方向還是垂直方向

min寬高,類似于UIKit自動布局的>=
max寬高雪位,類似于UIKit自動布局的<=

offSet:在視圖應有的位置加上偏移量

position:在上層容器強制定位,相當于UIKit里的frame(x,y),但是這里的x雹洗,y指的是視圖中心點的位置

padding:內邊距
.padding(20)內邊距都為20
.padding(.leading,20)左側內邊距為20
.padding([.top, .leading],20)左側上側內邊距為20

layoutPriority(0):視圖優(yōu)先級香罐,默認為0

Space()撐開子控件到父控件的最大長度,經常用时肿,比如在屏幕最左邊和最右側顯示兩個文字對齊

HStack{
    Text("n")
    Spacer()
    Text("w")
}

獲取上層視圖空間大小庇茫,這個很常用

GeometryReader{proxy in
   Text(String(describing: proxy.size))         
}

常用控件

視圖分為:
緊湊視圖:大多數控件屬于這一類型,控件中的內容決定控件的實際大小
貪婪視圖:Circel,Spacer,Color等螃成,控件在父視圖范圍內會盡可能多的去鋪滿剩余空間

一般有內容的視圖是緊湊類型旦签,容器類視圖為貪婪類視圖

Text
    .truncationMode(.middle)//設置超出文本的省略方式
    .lineLimit(1)//默認不限制行數
    .font(.system(size: 85))//字體過大,超過顯示區(qū)域會整體消失寸宏,不顯示

Image:
如果圖片大小和顯示大小不一樣宁炫,需要手動設置圖片的大小,需要先設置.resizable()氮凝,否則frame寬高不生效

    Image("forecast_icon_clound")
        .resizable()
        .frame(width: 22, height: 22)
       .fixedSize(horizontal: true, vertical: true)//這句可以不加
       .aspectRatio(contentMode: .fill)

Button羔巢,Picker,Slider罩阵,WebView竿秆,TextField,ScrollView這些用法和UIKit相似稿壁,只是把UI前綴去了

List類似于TableView

GridView:有LazyHGrid幽钢,LazyVGrid,相當于collectionView

let gridItem = [GridItem(.flexible(),spacing: 0)]

LazyHGrid(rows: gridItem, spacing:0) {
    ForEach(0...10,id:\.self) { index in
        setUpCell()
    }
    
}

Group把控件裝到這個組里面傅是,可以進行一些統(tǒng)一配置

Path劃線咐吼,折線虛線都可以,舉一個虛線的例子:

Path{ path in
    path.move(to: CGPoint(x: 0, y: 100))
    path.addLine(to: CGPoint(x: 200, y: 100))
}
.stroke(Color(white: 1, opacity: 0.2),style: StrokeStyle(lineWidth: 1, lineCap: .round, lineJoin:.round,  dash: [1,2], dashPhase: 0))

屬性裝飾器

理解 SwiftUI 里的屬性裝飾器
@State 屬性變化伤极,刷新UI鲫咽。用于一個對象內屬性修飾
@StateObject 用于生成和管理狀態(tài)屬性的生命周期
@ObservedObject 修飾共享狀態(tài)從外部傳遞進來的屬性,修飾的屬性要實現ObservableObject協(xié)議
ObservableObject協(xié)議溃斋,對應屬性內要實現

var age = 100 {
        willSet {
            objectWillChange.send()
        }
   }

簡寫是用@Published修飾@Published var age = 100
需要注意的是多層監(jiān)聽屬性傳遞都要用@ObservedObject修飾界拦,所以有了@EnvironmentObject

@EnvironmentObject 修飾全局,避免多個對象傳遞用@ObservedObject修飾

ParentView()
      .environmentObject(user)

 struct ParentView : View{
        var body: some View {
            ChindView()
        }
  }

 struct ChindView : View {
        @EnvironmentObject var user : UserModel
}

@Binding 修飾的屬性變?yōu)橐脗鬟f

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末梗劫,一起剝皮案震驚了整個濱河市享甸,隨后出現的幾起案子,更是在濱河造成了極大的恐慌梳侨,老刑警劉巖蛉威,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異走哺,居然都是意外死亡蚯嫌,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來择示,“玉大人束凑,你說我怎么就攤上這事≌っぃ” “怎么了汪诉?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谈秫。 經常有香客問我扒寄,道長,這世上最難降的妖魔是什么拟烫? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任该编,我火速辦了婚禮,結果婚禮上构灸,老公的妹妹穿的比我還像新娘上渴。我一直安慰自己,他們只是感情好喜颁,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布稠氮。 她就那樣靜靜地躺著,像睡著了一般半开。 火紅的嫁衣襯著肌膚如雪隔披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天寂拆,我揣著相機與錄音奢米,去河邊找鬼。 笑死纠永,一個胖子當著我的面吹牛鬓长,可吹牛的內容都是我干的。 我是一名探鬼主播尝江,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼涉波,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炭序?” 一聲冷哼從身側響起啤覆,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惭聂,沒想到半個月后窗声,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡辜纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年笨觅,在試婚紗的時候發(fā)現自己被綠了拦耐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡屋摇,死狀恐怖揩魂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情炮温,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布牵舵,位于F島的核電站柒啤,受9級特大地震影響,放射性物質發(fā)生泄漏畸颅。R本人自食惡果不足惜担巩,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望没炒。 院中可真熱鬧涛癌,春花似錦、人聲如沸送火。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽种吸。三九已至弃衍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坚俗,已是汗流浹背镜盯。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猖败,地道東北人速缆。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像恩闻,于是被迫代替她去往敵國和親艺糜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 前言 SwiftUI出來也有段時間了判呕,關于SwiftUI更多的信息請看這里倦踢,那么蘋果為什么要推出SwiftUI呢?...
    Codepgq閱讀 9,987評論 3 17
  • SwiftUI要求 iOS13.0+ 快捷鍵 control + option + 點擊:出現屬性編輯器 comm...
    余青松閱讀 6,214評論 1 11
  • 這是 WWDC2019 發(fā)布的 SwiftUI 布局框架的一些官方示例侠草。 首先為了保證項目的正常運行辱挥,需要升級 M...
    揚仔360閱讀 7,504評論 2 8
  • 最前面想說的話 轉眼已經是2020年10月了,2020已經過去大半了边涕,上半年的計劃已經完成晤碘,所以下半年的學習應該提...
    微笑_d797閱讀 2,640評論 2 2
  • 文章內容源處:https://juejin.im/post/5cf5f4596fb9a07ede0b2fa1#he...
    LINGSHOW閱讀 5,101評論 1 4