新聞中心
概覽
你的 App 需要在容器視圖中顯示的數(shù)據(jù)經(jīng)常會(huì)超過(guò)設(shè)備屏幕上容許的空間。對(duì)于重復(fù)視圖或視圖組,水平 Stack 和垂直 Stack 是很好的解決方案,但它們沒有內(nèi)建的滾動(dòng)機(jī)制。你可以通過(guò)將 Stack 包裝在 ScrollView (英文) 中來(lái)添加滾動(dòng),并在出現(xiàn)性能問題時(shí)切換到惰性 Stack。

臨海網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
在可滾動(dòng)的容器中顯示視圖組
實(shí)施重復(fù)視圖或視圖組很簡(jiǎn)單,只需將它們包裝在 ScrollView (英文) 內(nèi)的 HStack (英文) 或 VStack (英文) 中即可。
ScrollView(.horizontal) { HStack { ProfileView() ProfileView() ProfileView() ProfileView() ProfileView() } } .frame(maxWidth: 500)
如果上述示例代碼中的 ProfileView 具有 200 x 200 點(diǎn)的固有內(nèi)容大小,則 frame(minWidth:idealWidth:maxWidth:minHeight:idealHeight:maxHeight:alignment:) (英文) 視圖修飾符將 500 點(diǎn)的最大寬度應(yīng)用于 ScrollView (英文) 會(huì)導(dǎo)致 Stack 在其內(nèi)部滾動(dòng)。
有關(guān)如何使用 Stack 將視圖組合在一起的介紹,請(qǐng)參閱“使用 Stack 視圖構(gòu)建布局”。
為你的數(shù)據(jù)創(chuàng)建重復(fù)視圖
使用 ForEach (英文) 來(lái)為你 App 中的數(shù)據(jù)創(chuàng)建重復(fù)視圖。從 profiles 數(shù)組中的一個(gè)個(gè)人資料數(shù)據(jù)列表中,在 HStack (英文) 內(nèi)使用 ForEach (英文) 為數(shù)組中的每個(gè)元素創(chuàng)建一個(gè) ProfileView。
ScrollView(.horizontal) { HStack { ForEach(profiles) { profile in ProfileView(profile: profile) } } } .frame(maxWidth: 500)
注釋
當(dāng)你使用 ForEach (英文) 時(shí),你迭代的每個(gè)元素必須經(jīng)過(guò)唯一標(biāo)識(shí)??梢允乖刈駨?Identifiable (英文) 協(xié)議,或者將一個(gè)鍵路徑傳遞到唯一的標(biāo)識(shí)符作為 init(_:id:content:) (英文) 的 id 參數(shù)。
考慮對(duì)大量視圖使用惰性堆疊
HStack (英文)、VStack (英文) 和 ZStack (英文) 三個(gè)標(biāo)準(zhǔn) Stack 視圖在顯示時(shí)都會(huì)載入它們的所含視圖層次結(jié)構(gòu),而一次性載入大量視圖會(huì)導(dǎo)致運(yùn)行時(shí)性能變慢。
在以上示例中,ProfileView 是一個(gè)包含嵌套 Stack 視圖、文本標(biāo)簽和圖像視圖的復(fù)合視圖。一次性載入大量個(gè)人資料會(huì)導(dǎo)致明顯的速度變慢。
隨著 Stack 中的視圖數(shù)量增加,請(qǐng)考慮使用 LazyHStack (英文) 和 LazyVStack (英文) 代替 HStack (英文) 和 VStack (英文)。惰性 Stack 按需載入和渲染子視圖,從而在載入大量子視圖時(shí)可提供顯著的性能提升。
Stack 視圖和惰性 Stack 具有相似的功能,可能給人感覺它們能夠互換,但是,它們?cè)诓煌闆r下有各自的優(yōu)勢(shì)。Stack 視圖會(huì)一次性載入所有子視圖,布局性能快且可靠,因?yàn)橄到y(tǒng)在載入每個(gè)子視圖時(shí)就知道它們的大小和形狀。惰性 Stack 會(huì)為了性能而損失一定程度的布局正確性,原因是系統(tǒng)僅在子視圖可見時(shí)才會(huì)計(jì)算它們的幾何結(jié)構(gòu)。
在選擇要使用的 Stack 視圖類型時(shí),始終先選擇標(biāo)準(zhǔn) Stack 視圖,并且僅在對(duì)代碼進(jìn)行性能分析后證明值得提升性能時(shí)才切換到惰性 Stack。
進(jìn)行性能分析以發(fā)現(xiàn)性能問題
考慮要使用哪種 Stack 時(shí),請(qǐng)使用 Instruments 工具對(duì)你的 App進(jìn)行性能分析,以確定用戶界面代碼中將有大量視圖載入 Stack 的區(qū)域。
若要對(duì) SwiftUI 視圖載入進(jìn)行性能分析,請(qǐng)打開 Instruments 工具,方法是在 Xcode“Product”(產(chǎn)品) 菜單中選擇“Profile”(性能分析),然后選取 SwiftUI 性能分析模板。該模板將載入四個(gè) instrument:View Body、View Properties、Core Animation Commits 和 Time Profiler。這些 instrument 的組合為你尋找加快 App 性能的機(jī)會(huì)提供了一個(gè)不錯(cuò)的起點(diǎn)。
注釋
切勿使用 iOS 模擬器對(duì)你的代碼進(jìn)行性能分析。請(qǐng)始終使用真實(shí)設(shè)備進(jìn)行性能測(cè)試。
對(duì)上述代碼進(jìn)行性能分析時(shí),View Body instrument 顯示 1,000 個(gè) ProfileView 實(shí)例同時(shí)作為 HStack (英文) 載入內(nèi)存。隨著系統(tǒng)載入每個(gè)個(gè)人資料,你還會(huì)看到相同數(shù)量的 Image (英文) 視圖載入。
在此情況下,解決方案是將 HStack (英文) 替換為 LazyHStack (英文),如以下代碼所示:
ScrollView(.horizontal) { LazyHStack { ForEach(profiles) { profile in ProfileView(profile: profile) } } } .frame(maxWidth: 500)
運(yùn)行另一次跟蹤會(huì)顯示最初載入的視圖數(shù)量急劇下降,因?yàn)橹挥兴膫€(gè)啟動(dòng)的 ProfileView 實(shí)例可見。你還可以在“Total Duration”(總時(shí)間長(zhǎng)度) 列中看到相應(yīng)的下降。
有關(guān)使用 Instruments 工具的更多信息,請(qǐng)參閱提升 App 的性能。
新聞名稱:創(chuàng)新互聯(lián)IOS教程:創(chuàng)建高性能的可滾動(dòng)Stack
網(wǎng)站URL:http://m.fisionsoft.com.cn/article/cohjpjg.html


咨詢
建站咨詢
