成人免费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

觀察性系統監視

2022-11-15 14:52:09

虛擬孿生數字孿生

2024-04-22 15:31:02

物聯網

2009-08-27 11:04:08

C# extern修飾

2009-08-27 13:06:13

C# new修飾符

2009-09-02 17:14:28

C#修飾符

2022-01-06 22:05:35

Linux物聯網容器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日摸夜夜添夜夜添特色大片 | 欧美精品一二三 | 亚洲一区成人 | 国产欧美一区二区三区另类精品 | 国产精品一区二区三 | 亚洲中午字幕 | 亚洲电影一区二区三区 | 最近中文字幕免费 | 日本激情视频网 | 成人二区| 欧美8一10sex性hd| 激情黄色在线观看 | 精品国产青草久久久久福利 | 国产成人精品免费视频 | 欧美三级视频在线观看 | 国产精品欧美一区喷水 | 99re在线视频观看 | 欧美福利 | 日韩视频高清 | 亚洲午夜视频 | 搞av.com| 亚洲精品一区二区在线观看 | 久久久久久久国产精品 | 亚洲视频免费 | 成人一区二区三区在线观看 | 成人小视频在线观看 | 红桃视频一区二区三区免费 | 毛片区| 亚洲欧美在线免费观看 | 久久久这里都是精品 | 精品中文在线 | 九九爱这里只有精品 | 天天艹天天干天天 | 自拍视频在线观看 | 国产精品自产拍在线观看蜜 | 羞羞视频网站免费看 | 国产免费国产 | 97超碰中文网 | 欧美性video 精品亚洲一区二区 | 日本一区二区三区免费观看 | 日韩免费在线 |