在 SwiftUI 中截斷文字:優雅呈現長文字的技巧


摘要

在 SwiftUI 中有效管理長文字顯示是一項重要技能,適當的截斷技巧能夠提高應用程式的可讀性和美觀度。 歸納要點:

  • 使用 `truncationMode` 和 `lineLimit` 修飾符是截斷長文字的基本方法,但結合 `fixedSize` 屬性可以提升性能,特別是在處理大量文本時。
  • 透過 SwiftUI 擴展功能,可以創建自訂的 `truncatableText`,讓用戶在截斷文本末尾添加「查看更多」按鈕,增強互動體驗。
  • 結合 Core Text API 能夠精確控制截斷位置,有效避免不必要的字元或字串分割問題。
這篇文章提供了多種技巧來優雅地呈現長文字,包括最佳實務、擴展功能及與 Core Text 的結合,幫助開發者更靈活地處理文本顯示。


如何輕鬆截斷長文字並呈現展開與折疊功能

文字是應用程式中最常見的內容型別。我們每天處理各種長度的文字,但當面對較長的文字時,我們通常需要將其截斷,只顯示部分內容。使用者通常會獲得選項來展開並檢視完整文字,或折疊以保留截斷後的樣式。在這篇文章中,我將展示兩種可以輕鬆實現截斷的方法,以及一種額外的方法,透過提取和呈現原始字串的一部分來模擬(假裝)截斷。作為附加章節,我還會向您展示如何展開和折疊被截斷的文字,因為截斷和文字展開往往作為功能一起出現在應用程式中。

讓我們從一個小範例開始:一個顯示一些長文字的 Text 檢視:
我們在研究許多文章後,彙整重點如下
網路文章觀點與我們總結
  • 保持良好的作息習慣,有助於提升生活品質。
  • 均衡飲食對身體健康至關重要,應多攝取蔬果和全穀類。
  • 定期運動不僅能改善身體狀況,也有助於心理健康。
  • 學會管理壓力,例如透過冥想或深呼吸來放鬆心情。
  • 維持社交聯繫,與朋友和家人互動可增強情感支持。
  • 適當的休閒活動,如閱讀或旅行,可以有效減輕生活壓力。

在快節奏的生活中,我們常常忽略了自己的健康和平衡,其實只要簡單地調整一些日常習慣,就能讓生活變得更美好。例如,保持規律作息、均衡飲食以及定期運動,不但能改善身體狀況,也能讓我們的心理更加平靜。此外,適時放鬆心情、與親友互動、享受休閒活動,都可以幫助我們抵抗壓力。因此,不妨從今天開始,為自己打造一個更健康、更快樂的生活方式吧!

觀點延伸比較:
生活習慣建議方法最新趨勢權威觀點
作息習慣保持規律的睡眠時間,盡量每天同一時間上床及起床。越來越多人重視睡眠科技產品,如智能手環監測睡眠品質。研究顯示,每晚7-9小時的睡眠能有效提升注意力與生產力。
均衡飲食增加蔬果攝取比例,選擇全穀類代替精緻碳水化合物。植物基飲食逐漸受到關注,有助於減少慢性病風險。營養學家強調,多樣化飲食可增強免疫系統功能。
定期運動每週至少150分鐘中等強度運動或75分鐘高強度運動。線上健身課程興起,使得居家運動變得方便且受歡迎。專家建議結合有氧與力量訓練,以達到最佳效果。
壓力管理嘗試冥想、瑜伽或深呼吸技巧以放鬆心情和減輕焦慮感。心理健康應用程序如Headspace和Calm正在流行,幫助人們隨時隨地進行冥想練習。臨床心理學家指出,正念(Mindfulness)能有效降低壓力水平並提升心理韌性。
社交聯繫定期與朋友、家人聚會或透過視頻通話保持聯絡,分享日常生活和心情感受。 虛擬社交活動如線上遊戲、網路聚會成為新趨勢,加強遠距離的人際關係維繫.社會學者提到,人際互動是促進心理健康的重要因素,可降低孤獨感及焦慕感。
休閒活動參加自己喜愛的興趣班或計劃周末短途旅行以放鬆心情.閱讀電子書籍及聽Podcast在忙碌生活中愈加流行,有助於知識增長和心理放鬆.專家建議將休閒活動納入日常計劃,以提高生活滿意度和幸福感.

struct ContentView: View {     let longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."          var body: some View {         VStack {             Text(longText)         }         .padding()     } }

這個簡單的觀點呈現了以下結果:


將這段文字截斷並僅顯示一部分的最快方法是使用 lineLimit(_:) 檢視修飾符。其名稱已經說明瞭一切;它將允許顯示給定數量的行,並截斷所有不符合該行數的其他文字。例如,我們可以將文字限制為兩行:

Text(longText)     .lineLimit(2)


我之前提到過,這種縮短文字的方式是最靈活的。原因在於,顯示的文字量取決於提供給文字檢視的可用區域。因此,上述簡單新增 `lineLimit(_:)` 的方式,在橫向方向上會顯示比豎向方向更多的文字。


在上面的截圖中請注意,文字結尾的省略符號是三個點(ellipsis 符號)。這個符號是預設新增的,但我們可以使用 truncationMode(_:) 檢視修飾器選擇省略符號出現的確切位置。有三種可供選擇的模式:開頭、中間和結尾。以下程式碼將省略模式設定為中間:

Text(longText)     .lineLimit(2)     .truncationMode(.middle)


另一種有時方便、有時則不那麼實用的方法來截斷文字,是透過控制和限制文字檢視或其容器檢視的範圍。我們可以指定特定的寬度、高度或兩者。在下面的程式碼中,我們將文字檢視的高度設定為 100 點,因此只顯示部分文字:

Text(longText)     .frame(height: 100)


利用修飾符控制截斷文字的顯示

我們可以再次透過 `truncationMode(_:)` 檢視修飾符來控制截斷文字的外觀以及省略號符號的位置。您之前所閱讀的內容結果為截斷文字,但這是根據可用行數或框架來決定的。還可以透過限制可顯示字元數量來模擬文字截斷,換句話說,就是僅顯示原始長字串的一部分。我們如何管理這一點取決於我們希望顯示字串的哪個部分,其中最簡單的就是字串的開頭或結尾。

例如,假設我們希望僅顯示字串的前 80 個字元。我們可以使用 `prefix(_:)` 檢視修飾符,如下所示:

Text(longText.prefix(80))

相反地,為了獲取最後 80 個字元,可以應用字尾 (_:) 檢視修飾符來達成。

Text(longText.suffix(80))

在 Swift 中擷取特定範圍的子字串

注意:上述最後兩個檢視修飾符存在變化,您可以試著進行實驗,以找出最適合您的版本。當我們要提取一個子字串,而該子字串既不從原始字串的開頭開始,也不在結尾時,情況會變得更加複雜。在這種情況下,我們必須指定所需子字串的範圍。在 Swift 中,我們使用 `startIndex`、`endIndex` 以及各種索引方法來建立子字串的範圍。

舉例來說,若我們需要從原始字串中提取 80 個字元,並且是從第 20 個位置開始。為了可讀性和清晰度,我們首先在以下程式碼片段中指定範圍的限制,然後再用它們來獲取所需的子字串:

let from = longText.index(longText.startIndex, offsetBy: 20) let to = longText.index(from, offsetBy: 80) Text(longText[from...to])

從字串中獲取子字串並不等同於截斷。因此,省略號符號不會自動出現在結果字串的末尾(或其他地方)。無論如何,我們可以手動將其新增到文字中,從而模仿截斷文字的行為。

Text(longText[from...to] + "...")


呈現截斷的文字通常是沒有意義的(除非在某些情況下),因此大多數時候我們需要一個機制來擴充套件和折疊這些文字。管理這一過程的策略取決於我們如何選擇截斷,或使用原始字串的一部分。在接下來的示例中,我將演示如何擴充套件因限制文字檢視行數而被截斷的文字。以類似方式,你也可以應用於其他情況。我們首先需要的是一個狀態屬性,這將控制文字的展開或收起狀態:

@State private var expandText = false

我們需要一個按鈕來切換上述屬性:

Button(!expandText ? "Expand Text" : "Collapse Text") {     expandText.toggle() } .buttonStyle(.borderedProminent) .padding(.top)

我們將根據 expandText 屬性的值更新 lineLimit(_:) 檢視修飾符中的引數。

Text(longText)     .lineLimit(!expandText ? 2 : nil)

如果文字未擴充套件,則文字檢視將僅顯示兩行。nilvalue 代表不應對顯示的行數施加任何限制。以下是此處所述步驟的完整示例檢視:

struct ContentView: View {     let longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."          @State private var expandText = false          var body: some View {         VStack {             Text(longText)                 .lineLimit(!expandText ? 2 : nil)                          Button(!expandText ? "Expand Text" : "Collapse Text") {                 expandText.toggle()             }             .buttonStyle(.borderedProminent)             .padding(.top)         }         .padding()     } }


在 SwiftUI 中進行文字截斷是一項簡單的工作,而現在你已經知道如何在需要時進行這項操作。透過這篇文章,你還了解到如何透過顯示原始字串的子字串來模擬截斷,在某些情境下這可能會非常有用。作為額外的收穫,你也學到了如何展開和折疊被截斷的文字,因為大多數情況下,這個動作是跟隨著文字截斷而發生的。我希望你能發現這些技巧都很有用,並能成功應用於你的專案中。謝謝你的閱讀!

參考來源


JD

專家

相關討論

❖ 相關專欄