SwiftUI的“CSS”

CSS 相信很多前端開發(fā)者都很熟悉,全稱為Cascading Style Sheets, 層疊樣式表匆笤。

在2019年研侣,Apple 推出SwiftUI后,iOS開發(fā)者炮捧,也可以在Swift中使用“CSS”了庶诡。 這就是SwiftUI中的ViewModifier。

通過ViewModifier咆课, 開發(fā)者可以向View添加accessibility的功能末誓,可以調整View和內部元素的樣式,布局书蚪,可以響應事件基显,還可以有條件的顯示模態(tài)視圖等。

任何符合View協(xié)議的視圖善炫,都可以通過ViewModifier來操作撩幽。

Text("Hello, World!")
    .foregroundColor(.red)
02-23-0-1.png

上述代碼中.foregroundColor(.red)就是一個標準的對ViewModifier的調用,也是對樣式的基本操作箩艺,具體有哪些操作窜醉,可以查看SwiftUI-Cheat-Sheet

同時呢艺谆,ViewModifier也支持鏈式操作榨惰。

Text("Title")
    .frame(width: 100)
    .border(Color.gray)
02-23-0-2.png
Text("Title")
    .border(Color.gray)
    .frame(width: 100)
02-23-0-4.png

這里要注意,和CSS不同的是静汤,ViewModifier的調用順序琅催,會影響到最終樣式的呈現。

為什么會有這樣的現象呢虫给?

要回答這個問題藤抡,首先就要來看看,怎么自定義實現一個ViewModifier抹估。

struct BlueTitle : ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(.title)
            .foregroundColor(.blue)
    }
}

extension View {
    func blueTitle() -> some View {
        self.modifier(BlueTitle())
    }
}

struct ContentView: View {
    var body: some View {
        Text("Hello World")
            .blueTitle()
    }
}
02-23-0-5.png

上述代碼缠黍,描述了如何自定義一個名為BlueTitle的struct, 作用是改變content中所有的元素樣式药蜻,改為title的大小瓷式,并且將顏色改為藍色替饿。這里我們注意到,BlueTitle 遵循了ViewModifier的協(xié)議贸典。并返回了some View视卢。 所以ViewModifier實際返回的是一個已經應用了具體配置的View,而不是一個可以在某一范圍內全局應用的配置表廊驼。理解了這一點腾夯,也就能理解,為什么改變了順序蔬充,就改變了視圖呈現的結果。

和CSS一樣班利,父元素ViewModifier的作用饥漫,是可以被子元素覆蓋的。

VStack {
    Text("Title")
        .font(.title) // Override the font of this view.
    Text("First body line.")
    Text("Second body line.")
}
.font(.body) 
02-23-0-0.png

在上面的例子里罗标,Title的樣式是.title庸队,而不是.body

當然闯割,ViewModifier也不是都能覆蓋的彻消。

在這里要注意的是,如果某個View被通用修飾符(ViewModifier)修飾后宙拉,就不能再使用特定的修飾符了宾尚。

Text("Hello, world!")
    .padding()
    .bold() 

上面就是一個反例,bold()是Text的特定修飾符谢澈,僅能作用于Text煌贴;當Text被padding() 修飾后,類型就變成了View锥忿,便不能在使用.bold()進行修飾了牛郑。 如果一定要用,那就需要將兩個調用順序做個調整敬鬓。
當然淹朋,ViewModifier也可以傳參數使用。如下所示:

struct Watermark: ViewModifier {
    var text: String
    
    func body(content: Content) -> some View {
        ZStack(alignment: .bottomTrailing) {
            content
            Text(text)
                .font(.caption)
                .foregroundColor(.white)
                .padding(5)
                .background(Color.black)
        }
    }
}

struct ContentView: View {
    var body: some View {
      Color.blue
            .frame(width: 300, height: 200)
          .watermarked(with: "Hacking with Swift")
    }
}

參考:

Configuring Views

SwiftUI-Cheat-Sheet

bold()

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钉答,一起剝皮案震驚了整個濱河市础芍,隨后出現的幾起案子,更是在濱河造成了極大的恐慌数尿,老刑警劉巖者甲,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異砌创,居然都是意外死亡虏缸,警方通過查閱死者的電腦和手機鲫懒,發(fā)現死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刽辙,“玉大人窥岩,你說我怎么就攤上這事≡诅停” “怎么了颂翼?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慨灭。 經常有香客問我朦乏,道長,這世上最難降的妖魔是什么氧骤? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任呻疹,我火速辦了婚禮,結果婚禮上筹陵,老公的妹妹穿的比我還像新娘刽锤。我一直安慰自己,他們只是感情好朦佩,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布并思。 她就那樣靜靜地躺著,像睡著了一般语稠。 火紅的嫁衣襯著肌膚如雪宋彼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天仙畦,我揣著相機與錄音宙暇,去河邊找鬼。 笑死议泵,一個胖子當著我的面吹牛占贫,可吹牛的內容都是我干的。 我是一名探鬼主播先口,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼型奥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碉京?” 一聲冷哼從身側響起厢汹,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谐宙,沒想到半個月后烫葬,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年搭综,在試婚紗的時候發(fā)現自己被綠了垢箕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡兑巾,死狀恐怖条获,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蒋歌,我是刑警寧澤帅掘,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站堂油,受9級特大地震影響修档,放射性物質發(fā)生泄漏。R本人自食惡果不足惜府框,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一吱窝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寓免,春花似錦、人聲如沸计维。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲫惶。三九已至蜈首,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欠母,已是汗流浹背欢策。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赏淌,地道東北人踩寇。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像六水,于是被迫代替她去往敵國和親俺孙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容