38 SwiftUI

SwiftUI

image-20230312113352480.png
  • SwiftUI 是一種基于Swift的強大能力遣铝,簡單創(chuàng)新的構建用戶界面的方法酿炸,并且可以運行在蘋果所有的平臺上
image-20230312113624800.png

SwiftUI - 聲明式語法

  • SwiftUI采用聲明式語法填硕,因為你可以簡單聲明你的用戶界面
image-20230312113734752.png
  • Xcode11提供了強大的設計工具,可以通過簡單的拖拽用SwiftUI生成用戶界面
image-20230312114050160.png
  • 只需要描述一次的布局-為你的視圖聲明任何狀態(tài)的內(nèi)容和布局翅帜,一旦狀態(tài)發(fā)生改變涝滴,SwiftUI會自動更新視圖的渲染
  • 構建可復用的組件-將小型歼疮、獨立視圖組合到更大,更復雜的界面中韩脏。在任何為Apple平臺所設計的應用之間,共享您的自定義視圖
  • 精簡動畫-創(chuàng)建平滑的動畫就像調(diào)用單個方法一樣簡單杭朱。SwiftUI會在必要時自動計算并過渡動畫

SwiftUI設計工具使用指南

創(chuàng)建項目

image-20230312212430872.png

Stacks

image-20230312212509459.png

如何使用SwiftUI構建可復用的組件

地標頁例子

image-20230312214019068.png

Image組件

image-20230312214151969.png
image-20230312214348729.png
image-20230312214400782.png
image-20230312214452467.png
struct ContentView: View {
    var body: some View {
        
        VStack {
            //設置安全距離
            MapView().edgesIgnoringSafeArea(.all)
                .frame(height: 300)
            
            CircleImage().offset(y: -130).padding(.bottom, -130)
            
            //左對齊
            VStack (alignment: .leading) {
                Text("圓明園").font(.title)
                HStack {
                    Text("皇家園林").font(.subheadline)
                    Spacer()
                    Text("北京").font(.subheadline)
                }
            }.padding()//邊界留白
            
            Spacer()//留白
        }
        
        
    }
}

圖片組件

struct CircleImage: View {
    var body: some View {
        //將圖片剪切出一個圓
        Image("ymy").clipShape(Circle())
        //加一個邊框線
        .overlay(Circle().stroke(Color.black, lineWidth: 4))
        .shadow(radius: 10)//陰影
    }
}

地圖組件

import SwiftUI 
import MapKit

struct MapView; UIViewRepresentable {
    
    //創(chuàng)建地圖組件
    func makeUIView(context: Context) -> MKMapView {
        return MKMapView(frame: .zero)
    }
    
    //對地圖組件進行設置
    func updateUIView(_ uiView: MKMapView, context: Context) {
        //圓明園的經(jīng)緯度
        let location = CLLocationCoordinate2D(latitude: 40.00491139888854, longitude: 116.2896180152893)
        //展示范圍
        let span = MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
        let region = MKCoordinateRegion(center: location, span: span)
        uiView.setRegion(region, animated: true)
    }
}

如何使用SwiftUI實現(xiàn)動畫

SwiftUI - 動畫

  • 在SwiftUI中,你可以將任意的改變過程封裝進一個withAnimation塊中袭景。默認唁桩,SwiftUI會對這種改變采用fade in/out 的方式進行動畫
struct AnimationView: View {
    
    //狀態(tài) 當屬性改變時, 會進行重寫渲染
    @State private var showDetail = false
    
    var body: some View {
        Button(action: {
            withAnimation {
                self.showDetail = !self.showDetail
            }
        }) {
            Image(systemName: "chevron.right.circle")//使用了一張系統(tǒng)圖片
                .imageScale(.large)//尺寸
                .rotationEffect(.degrees(showDetail ? 90 : 0))//旋轉(zhuǎn)90度或0度
                .scaleEffect(showDeatil ? 1.5 : 1)//放大倍數(shù)
            .padding()
        }
    }
}

在這里更改顯示入口

image-20230312224524873.png

深入理解SwiftUI:實現(xiàn)原理探秘

@propertyWrapper

  • 通過property Wrapper機制耸棒,對一些類似的屬性的實現(xiàn)代碼做同一封裝
  • 通過@propertyWrapper可以移除掉一些重復或者類似的代碼

@state

  • 通過@State SwiftUI 實現(xiàn)了值的綁定荒澡、動態(tài)查找和View的自動重現(xiàn)繪制
image-20230312225028447.png
image-20230312225141503.png
  • 課后題:查看源碼,了解@Binding与殃,@ObservedObject单山,@EnvironmentObject等裝飾器的作用
extension UserDefaults {
    public enum Keys {
        static let hadShownUserGuide = "hadShownUserGuide"
    }
    
    var hadShownUserGuide: Bool {
        set {
            set(newValue, forKey: Keys.hadShownUserGuide)
        }
        
        get {
            bool(forKey: Keys.hadShownUserGuide)
        }
    }
}

struct PropertyWrapperView: View {
    @State private var showText = UserDefaults.standard.hasShownUserGuide ? "已經(jīng)展示" : "沒有展示過"
    
    var body: some View {
        Button(action: {
            if (!UserDefaults.standard.hasShownUserGuide) {
                UserDefaults.standard.hasShownUserGuide = true
                self.showText = "已經(jīng)展示"
            }
        }) {
            Text(self.showText)
        }
    }
}
  • 使用propertyWrapper進行統(tǒng)一擴展
@propertyWrapper
struct UserDefaultsWrapper<T> {
    var key: String
    var defaultValue : T
    
    init(_ key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }
    
    var wrappedValue: T {
        get {
            return UserDefaults.standard.value(forKey: key) as? T ?? defaultValue
        }
        
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}

struct PropertyWrapperView: View {
    
    @UserDefaultsWrapper("hadShownUserGuide", defaultValue: false)
    static var hadShownUserGuide : Bool
    
    @State private var showText = PropertyWrapperView.hasShownUserGuide ? "已經(jīng)展示" : "沒有展示過"
    
    var body: some View {
        Button(action: {
            if (!PropertyWrapperView.hasShownUserGuide) {
                PropertyWrapperView.hasShownUserGuide = true
                self.showText = "已經(jīng)展示"
            }
        }) {
            Text(self.showText)
        }
    }
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幅疼,隨后出現(xiàn)的幾起案子米奸,更是在濱河造成了極大的恐慌,老刑警劉巖铡溪,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哈扮,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機惶洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門铐料,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事蔬咬』煳耄” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵泳猬,是天一觀的道長。 經(jīng)常有香客問我拷呆,道長,這世上最難降的妖魔是什么绣溜? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮野建,結果婚禮上,老公的妹妹穿的比我還像新娘须蜗。我一直安慰自己柿估,他們只是感情好足陨,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布搁凸。 她就那樣靜靜地躺著,像睡著了一般嫡良。 火紅的嫁衣襯著肌膚如雪寝受。 梳的紋絲不亂的頭發(fā)上甩苛,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天肄扎,我揣著相機與錄音搔耕,去河邊找鬼。 笑死,一個胖子當著我的面吹牛风瘦,可吹牛的內(nèi)容都是我干的昧谊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼草姻,長吁一口氣:“原來是場噩夢啊……” “哼局齿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蹋半,失蹤者是張志新(化名)和其女友劉穎份企,沒想到半個月后手蝎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡焚刚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扇调。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矿咕。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狼钮,靈堂內(nèi)的尸體忽然破棺而出碳柱,到底是詐尸還是另有隱情,我是刑警寧澤熬芜,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布莲镣,位于F島的核電站,受9級特大地震影響猛蔽,放射性物質(zhì)發(fā)生泄漏剥悟。R本人自食惡果不足惜灵寺,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望区岗。 院中可真熱鬧略板,春花似錦、人聲如沸慈缔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藐鹤。三九已至瓤檐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娱节,已是汗流浹背挠蛉。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肄满,地道東北人谴古。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像稠歉,于是被迫代替她去往敵國和親掰担。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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