SwiftUI中的動態(tài)類型Dynamic Type

今天我想和您談?wù)凷wiftUI中對動態(tài)類型的支持旭从。我認(rèn)為,如果您的應(yīng)用中沒有動態(tài)類型支持场仲,就無法創(chuàng)造出色的用戶體驗和悦。 SwiftUI為任何文本表示形式提供了開箱即用的動態(tài)類型,并簡化了我們的工作渠缕。但是我們?nèi)匀恍枰鲆恍┕ぷ鞲胨兀宰屛覀冋務(wù)勊?/p>

動態(tài)類型基礎(chǔ)(Dynamic type)

動態(tài)類型功能允許用戶選擇屏幕上顯示的文本內(nèi)容的大小。它可以幫助需要較大文本以提高可讀性的用戶亦鳞。它還適合那些閱讀較小文本的人員付鹿,使更多信息顯示在屏幕上。支持動態(tài)類型的應(yīng)用程序還提供了更一致的閱讀體驗蚜迅。

您無需執(zhí)行任何操作即可在SwiftUI視圖中支持動態(tài)類型,因為默認(rèn)情況下俊抵,表示文本的所有組件都是多行的谁不。 Apple的《人機(jī)界面指南》有一個關(guān)于版式的特殊部分,其中提供了常見的文字樣式徽诲。這些文本樣式描述了不同類型的文本內(nèi)容(例如標(biāo)題刹帕,標(biāo)題吵血,正文盐肃,副標(biāo)題语卤,標(biāo)題娄柳,腳注)的字體配置消略。樣式在所有應(yīng)用程序之間共享瘪菌。嘗試盡可能使用這些預(yù)定義的文本樣式弛秋。這是一個如何在SwiftUI中使用HIG定義的文本樣式的小示例凝危。

struct PostView: View {
    let post: Post

    var body: some View {
        VStack(alignment: .leading) {
            Image(post.image)

            Text(post.title)
                .font(.headline)

            Text(post.time)
                .font(.subheadline)

            Text(post.body)
                .font(.body)
        }
    }
}

內(nèi)容大小類別(Content Size category)

在上一段中军俊,我說過SwiftUI開箱即用地支持動態(tài)類型尉共,這是事實褒傅。但是要支持動態(tài)類型,我們需要記住袄友,即使只有兩個單詞殿托,每個文本也可以是多行。這完全取決于用戶定義的字體大小剧蚣,該字體大小可能會很大。 SwiftUI提供了一個特殊的環(huán)境值來描述用戶定義的大小類別鸠按。讓我們來看看如何使用它

import SwiftUI

struct ContentView: View {
    @Environment(\.sizeCategory) var sizeCategory

    var buttons: some View {
        Group {
            Button("Action 1") {}
            Button("Action 2") {}
        }
    }

    var body: some View {
        Group {
            if sizeCategory == .accessibilityLarge {
                VStack { buttons }
            } else {
                HStack { buttons }
            }
        }
    }
}

通過使用環(huán)境的sizeCategory值礼搁,我們可以讀取定義的字體大小并決定如何呈現(xiàn)我們的內(nèi)容。通過使用環(huán)境待诅,我們的應(yīng)用程序?qū)⒂嗛喯到y(tǒng)設(shè)置,并且一旦用戶更改了字體大小募书,我們的視圖就會重新加載

讓我們繼續(xù),為Group組件創(chuàng)建一個擴(kuò)展,根據(jù)用戶定義的大小類別將其嵌入到水平或垂直堆棧中琉挖。

import SwiftUI

fileprivate struct EmbedInStack: ViewModifier {
    private let verticalSizes: [ContentSizeCategory] = [
        .accessibilityMedium,
        .accessibilityLarge,
        .accessibilityExtraLarge,
        .accessibilityExtraExtraLarge,
        .accessibilityExtraExtraExtraLarge
    ]

    @Environment(\.sizeCategory) var sizeCategory

    func body(content: Content) -> some View {
        Group {
            if verticalSizes.contains(sizeCategory) {
                VStack { content }
            } else {
                HStack { content }
            }
        }
    }
}

extension Group where Content: View {
    func embedInStack() -> some View {
        modifier(EmbedInStack())
    }
}

在上面的示例中寥茫,我們使用ViewModifier纱耻,它將視圖組包裝到堆棧中玖喘。 ViewModifiers的優(yōu)點之一是擁有狀態(tài)或訂閱環(huán)境值的能力。

ScrollView

短文本為多行的可能性帶來了另一個要求费尽。我們需要將根視圖嵌入滾動視圖旱幼,以允許用戶在不適合屏幕的情況下滾動內(nèi)容。它很快就變成樣板,這就是為什么我創(chuàng)建了一個特殊擴(kuò)展以重用此功能的原因

import SwiftUI

extension View {
    func embedInScrollView(alignment: Alignment = .center) -> some View {
        GeometryReader { proxy in
            ScrollView {
                self.frame(
                    minHeight: proxy.size.height,
                    maxHeight: .infinity,
                    alignment: alignment
                )
            }
        }
    }
}

結(jié)論

動態(tài)類型是一項非常重要的功能,每個應(yīng)用程序都應(yīng)支持它弛车。 SwiftUI開箱即用地支持動態(tài)類型喻括,但是需要一些樣板唤崭。今天,我們學(xué)習(xí)了如何通過創(chuàng)建特殊的視圖擴(kuò)展來減少它兜挨。

推薦

基礎(chǔ)文章推薦

經(jīng)典教程推薦

技術(shù)源碼推薦

推薦文章

CoreData篇

TextField篇

JSON文件篇


一篇文章系列

技術(shù)交流

QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末净响,一起剝皮案震驚了整個濱河市畏陕,隨后出現(xiàn)的幾起案子羽莺,更是在濱河造成了極大的恐慌丈挟,老刑警劉巖孝情,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陆馁,“玉大人彪蓬,你說我怎么就攤上這事酷誓。” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵灰殴,是天一觀的道長辣之。 經(jīng)常有香客問我狮鸭,道長惯退,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮黄鳍,結(jié)果婚禮上拧晕,老公的妹妹穿的比我還像新娘。我一直安慰自己裙犹,他們只是感情好码党,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著服球,像睡著了一般。 火紅的嫁衣襯著肌膚如雪分冈。 梳的紋絲不亂的頭發(fā)上靴跛,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天梢睛,我揣著相機(jī)與錄音,去河邊找鬼识椰。 笑死绝葡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腹鹉。 我是一名探鬼主播藏畅,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼功咒!你這毒婦竟也來了愉阎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤力奋,失蹤者是張志新(化名)和其女友劉穎榜旦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體景殷,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡溅呢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年澡屡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藕届。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡挪蹭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出休偶,到底是詐尸還是另有隱情梁厉,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布踏兜,位于F島的核電站词顾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碱妆。R本人自食惡果不足惜肉盹,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疹尾。 院中可真熱鬧上忍,春花似錦、人聲如沸纳本。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽繁成。三九已至吓笙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巾腕,已是汗流浹背面睛。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留尊搬,地道東北人叁鉴。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像佛寿,于是被迫代替她去往敵國和親亲茅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354