成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么 SwiftUI 的修飾符順序很重要

移動開發 iOS
每當我們將修飾符應用于 SwiftUI 視圖時,我們實際上都會創建一個,應用了更改的新視圖 —— 我們不僅僅是修改現有的視圖。

[[414805]]

本文轉載自微信公眾號「Swift社區」,作者韋弦Zhy。轉載本文請聯系Swift社區公眾號。

每當我們將修飾符應用于 SwiftUI 視圖時,我們實際上都會創建一個,應用了更改的新視圖 —— 我們不僅僅是修改現有的視圖。 如果你仔細想想,這種行為是有道理的 —— 我們的視圖僅保留我們賦予它們的確切屬性,因此,如果我們設置背景顏色或字體大小,則無處存儲該數據。

我們將在下一章中查看為什么會發生這種情況,但是首先,我想看看這種行為的實際含義。看一下這段代碼:

  1. Button("Hello World") { 
  2.     // do nothing 
  3. }     
  4. .background(Color.red) 
  5. .frame(width: 200, height: 200) 

您認為它運行時會是什么樣?

您很可能猜錯了:您不會在中間看到帶有 “Hello World” 的 200x200 紅色按鈕。相反,您會看到一個 200x200 的空正方形,中間是 “Hello World”,在 “Hello World” 周圍有一個紅色矩形。

如果思考一下修飾符的工作原理,您就可以了解為什么會如此:每個修飾符都會創建一個,應用了該修飾符的新結構體,而不是在視圖上設置屬性。

您可以通過查詢視圖主體的類型來窺視 SwiftUI 的底層。將按鈕修改為如下:

  1. Button("Hello World") { 
  2.     print(type(of: self.body)) 
  3. }     
  4. .background(Color.red) 
  5. .frame(width: 200, height: 200) 

Swift 的 type(of:) 方法會打印特定值的確切類型,在這種情況下,它將打印以下內容:ModifiedContent

您可以在這里看到兩件事:

  • 每次我們修改視圖時,SwiftUI 都會使用以下泛型來應用該修飾符:ModifiedContent
  • 當我們應用多個修飾符時,它們會疊加在一起:ModifiedContent

要了解該類型是什么,請從最里面的類型開始,然后逐步解決:

  • 最里面的類型是 ModifiedContent
  • 在外部,我們有了 ModifiedContent<…, _FrameLayout> ,它使用了我們的第一個視圖(按鈕+背景色),并為其提供了 Frame。

如您所見,我們使用 ModifiedContent 類型堆疊——每個視圖都需要一個視圖進行轉換以及要進行的實際更改,而不是直接修改視圖。

這意味著修飾符的順序很重要。 如果我們重寫代碼以便在設置 Frame 后使用背景色,那么您就會得到預期的結果:

  1. Button("Hello World") { 
  2.     print(type(of: self.body)) 
  3. .frame(width: 200, height: 200) 
  4. .background(Color.red) 

現在最好的思考方法是,想象一下 SwiftUI 在每個修飾符之后都會呈現您的視圖。因此,只要您說 .background(Color.red),它就會將背景顏色變為紅色,而不管您給它什么 Frame。如果您之后再擴展 Frame,它將不會重新加載因為背景已經被使用了。

當然,這不是 SwiftUI 實際上的工作方式,因為如果這樣做,那將是性能上的噩夢,但這是學習的時候可以使用的一種簡潔的思維捷徑。

使用修飾符的一個重要副作用是,我們可以多次應用相同的效果:每個修飾符都會簡單地添加到以前的內容中。

例如,SwiftUI 為我們提供了 padding() 修飾符,該修飾符在視圖周圍添加了一些空間,從而不會將其推到其他視圖或屏幕邊緣。如果我們應用填充,然后應用背景色,然后應用更多填充和不同的背景色,則可以為視圖提供多個邊框,如下所示:

  1. Text("Hello World"
  2.     .padding() 
  3.     .background(Color.red) 
  4.     .padding() 
  5.     .background(Color.blue) 
  6.     .padding() 
  7.     .background(Color.green) 
  8.     .padding() 
  9.     .background(Color.yellow) 

譯自 Why modifier order matters[1]

參考資料

[1]Why modifier order matters: https://www.hackingwithswift.com/books/ios-swiftui/why-modifier-order-matters

 

責任編輯:武曉燕 來源: Swift社區
相關推薦

2023-12-29 09:01:27

SwiftUI視圖修飾符

2009-08-24 16:49:39

C#修飾符

2023-02-13 11:06:58

決策智能數據分析

2024-01-08 13:28:00

5G低延遲

2022-01-10 23:39:18

Java測試開發

2022-11-07 11:22:33

2023-05-23 16:08:19

2022-08-24 15:03:21

數據智能數據分析

2022-05-11 15:08:16

加密貨幣私鑰安全

2013-01-08 14:58:48

Firefox OS

2015-10-19 17:57:33

容器OpenStack微服務

2018-10-25 15:20:17

區塊鏈去中心化互聯網

2010-10-26 13:44:15

2022-12-29 10:16:12

觀察性系統監視

2024-04-22 15:31:02

物聯網

2022-11-15 14:52:09

虛擬孿生數字孿生

2022-01-06 22:05:35

Linux物聯網容器

2020-08-11 11:51:47

標準物聯網IOT

2022-09-26 13:58:44

數據治理數據素養通信

2018-07-13 08:59:32

備份歸檔差異
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成年女人免费v片 | 毛片a区| 久久精品国产久精国产 | 欧美xxxx黑人又粗又长 | 成人影院在线 | 欧美精品一区二区三区在线 | 国产1区2区在线观看 | 狠狠av| 日本精品久久久久久久 | 欧美日韩亚洲国产 | 欧美专区在线 | 亚洲午夜精品一区二区三区 | 欧美一区二区在线看 | 91成人在线视频 | 久久国产精品72免费观看 | 精品国产欧美一区二区三区成人 | 日韩乱码在线 | 久久综合九九 | 精品一区二区在线看 | www狠狠干 | 高清不卡毛片 | 99精品免费在线观看 | 色男人的天堂 | www.日韩 | 日韩久草 | 天天操天天摸天天干 | www亚洲免费国内精品 | 伊人伊人伊人 | 精品伦精品一区二区三区视频 | 欧美一区二 | 精品久久一区 | 国产免费一区二区三区网站免费 | 色天天综合 | 国产精品日女人 | 亚洲一区日韩 | 天天干,夜夜操 | 国产在线中文字幕 | av电影手机在线看 | 成人在线中文字幕 | 四虎影院在线免费观看 | 97精品超碰一区二区三区 |