gpt4 book ai didi

ios - SwiftUI 可点击的潜台词

转载 作者:行者123 更新时间:2023-12-01 15:25:05 25 4
gpt4 key购买 nike

当点击文本的某些部分时,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 :
HStack and Text UIViewRepresentable 的结果和 UITextView :
enter image description here
更新 2:
这是一个 NSMutableAttributedString小扩展:
extension NSMutableAttributedString {

var range: NSRange {
NSRange(location: 0, length: self.length)
}

}

关于ios - SwiftUI 可点击的潜台词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com