如何在SwiftUI中使用超链接实现文本

时间:2019-09-01 08:28:07

标签: swiftui

在Swift中,如here所示,您可以使用“ NSMutableAttributedString”在文本中嵌入链接。

如何使用SwiftUI实现这一目标?

我实现了它,如下所示,但这看起来并不符合我的期望。 this

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(" .")
        }
    }
}

5 个答案:

答案 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)

斯威夫特 5.5

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).

https://www.markdownguide.org/basic-syntax/#links

答案 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)
}