当点击文本的某些部分时,SwiftUI 中有什么方法可以打开浏览器。
我尝试了上述解决方案,但它不起作用,因为 onTapGesture
返回 View
您无法添加到 Text
Text("Some text ").foregroundColor(Color(UIColor.systemGray)) +
Text("clickable subtext")
.foregroundColor(Color(UIColor.systemBlue))
.onTapGesture {
}
我想在正文中有可点击的潜台词,这就是为什么使用
HStack
不管用
最佳答案
iOS 15 及更高版本更新:
有一个新的Markdown
Text
的格式支持, 如:
Text("Some text [clickable subtext](some url) *italic ending* ")
您可以查看WWDC session with a timecode详情iOS 13 和 14 的旧答案:
不幸的是,SwiftUI 中没有任何类似于 NSAttributedString 的东西。你只有几个选择。 In this answer你可以看看如何使用
UIViewRepresentable
用于创建老派UILabel
with click event , 例如。但是now the only SwiftUI way是使用HStack
:struct TappablePieceOfText: View {
var body: some View {
HStack(spacing: 0) {
Text("Go to ")
.foregroundColor(.gray)
Text("stack overflow")
.foregroundColor(.blue)
.underline()
.onTapGesture {
let url = URL.init(string: "https://stackoverflow.com/")
guard let stackOverflowURL = url, UIApplication.shared.canOpenURL(stackOverflowURL) else { return }
UIApplication.shared.open(stackOverflowURL)
}
Text(" and enjoy")
.foregroundColor(.gray)
}
}
}
更新 添加了
UITextView
的解决方案和 UIViewRepresentable
.我结合了添加链接的所有内容,结果非常好,我认为:import SwiftUI
import UIKit
struct TappablePieceOfText: View {
var body: some View {
TextLabelWithHyperlink()
.frame(width: 300, height: 110)
}
}
struct TextLabelWithHyperlink: UIViewRepresentable {
func makeUIView(context: Context) -> UITextView {
let standartTextAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20),
NSAttributedString.Key.foregroundColor: UIColor.gray
]
let attributedText = NSMutableAttributedString(string: "You can go to ")
attributedText.addAttributes(standartTextAttributes, range: attributedText.range) // check extention
let hyperlinkTextAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20),
NSAttributedString.Key.foregroundColor: UIColor.blue,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue,
NSAttributedString.Key.link: "https://stackoverflow.com"
]
let textWithHyperlink = NSMutableAttributedString(string: "stack overflow site")
textWithHyperlink.addAttributes(hyperlinkTextAttributes, range: textWithHyperlink.range)
attributedText.append(textWithHyperlink)
let endOfAttrString = NSMutableAttributedString(string: " end enjoy it using old-school UITextView and UIViewRepresentable")
endOfAttrString.addAttributes(standartTextAttributes, range: endOfAttrString.range)
attributedText.append(endOfAttrString)
let textView = UITextView()
textView.attributedText = attributedText
textView.isEditable = false
textView.textAlignment = .center
textView.isSelectable = true
return textView
}
func updateUIView(_ uiView: UITextView, context: Context) {}
}
HStack
的结果和 Text
:UIViewRepresentable
的结果和 UITextView
:更新 2:
这是一个
NSMutableAttributedString
小扩展:extension NSMutableAttributedString {
var range: NSRange {
NSRange(location: 0, length: self.length)
}
}
关于ios - SwiftUI 可点击的潜台词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624838/