在Swift中,如here所示,您可以使用“ NSMutableAttributedString”在文本中嵌入链接。
如何使用SwiftUI实现这一目标?
我实现了它,如下所示,但这看起来并不符合我的期望。 。
import SwiftUI
struct ContentView: View {
var body: some View {
HStack {
Text("By tapping Done, you agree to the ")
Button(action: {}) {
Text("privacy policy")
}
Text(" and ")
Button(action: {}) {
Text("terms of service")
}
Text(" .")
}
}
}
答案 0 :(得分:4)
使用内置功能+
,看起来很吸引人:
import SwiftUI
struct ContentView: View {
var body: some View {
HStack {
Button(action: {
}) {
Text("By tapping Done, you agree to the ")
+ Text("privacy policy")
.foregroundColor(Color.blue)
+ Text(" and ")
+ Text("terms of service")
.foregroundColor(Color.blue)
+ Text(".")
}
.foregroundColor(Color.black)
}
}
}
答案 1 :(得分:3)
Foundation 支持 Markdown。
Text("[Privacy Policy](https://example.com)")
要创建链接,请将链接文本括在方括号中(例如,[Duck Duck Go]),然后紧跟在括号中的网址(例如 (https://duckduckgo.com))。
My favorite search engine is [Duck Duck Go](https://duckduckgo.com).
答案 2 :(得分:2)
Motjaba Hosseni是正确的,没有什么类似于SwiftUI中的NSAttributedString。 这应该暂时解决您的问题:
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("By tapping Done, you agree to the ")
HStack(spacing: 0) {
Button("privacy policy") {}
Text(" and ")
Button("terms of service") {}
Text(".")
}
}
}
}
答案 3 :(得分:1)
将UIKit视图包装在UIViewRepresentable
中始终是一种选择。只需经过手动过程即可公开要更改的每个属性。
struct AttributedText: UIViewRepresentable {
var attributedText: NSAttributedString
init(_ attributedText: NSAttributedString) {
self.attributedText = attributedText
}
func makeUIView(context: Context) -> UITextView {
return UITextView()
}
func updateUIView(_ label: UITextView, context: Context) {
label.attributedText = attributedText
}
}
//usage: AttributedText(NSAttributedString())
答案 4 :(得分:0)
我知道有些晚了,但是我使用HTML解决了相同的问题。 首先,我创建了一个小助手和链接模型。
struct HTMLStringView: UIViewRepresentable {
let htmlContent: String
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.loadHTMLString(htmlContent, baseURL: nil)
}
}
struct TextLink {
let url: URL
let title: String
}
接下来,我创建了将String更改为HTML并替换@link到我的可点击链接的第一次出现的函数。
var content = "My string with @link."
var link = TextLink(url: URL(string: "https://www.facebook.com")!, title: "Facebook")
var body: some View {
let bodySize = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body).pointSize
var html = "<span style=\"font: -apple-system-body; font-size:calc(\(bodySize)px + 1.0vw)\">"
if let linkRange = content.range(of: "@link") {
let startText = content[content.startIndex ..< linkRange.lowerBound]
let endText = content[linkRange.upperBound ..< content.endIndex]
html += startText
html += "<a href=\"\(link.url.absoluteString)\">\(link.title)</a>"
html += endText
} else {
html += content
}
html += "</span>"
return HTMLStringView(htmlContent: html)
}