xcode 带SwiftUI?的watchOS中的NSAttributedString

jm2pwxwz  于 2023-03-09  发布在  Swift
关注(0)|答案(2)|浏览(215)

目标:使用SwiftUI在watchOS中绘制文本

对于脚本项目

WKInterfaceLabel通过setAttributedText提供对NSAttributedString的支持,setAttributedText提供对笔划文本的简单和容易的支持。

但是,对于使用SwiftUI的新项目,

WKInterfaceLabel在不存在的故事板之外不可用:
不要自己子类化或创建这个类的示例。相反,在接口控制器类中定义插座,并将它们连接到情节提要文件中相应的对象。

open class WKInterfaceLabel : WKInterfaceObject {

    
    open func setText(_ text: String?)

    open func setTextColor(_ color: UIColor?)

    
    open func setAttributedText(_ attributedText: NSAttributedString?)
}

"init()"不可用
那么,我们如何在带有SwiftUI的watchOS中使用NSAttributedString呢?
旁注:
接下来,我希望新的AttributedString能可靠地取代NSAttributedString,但截至watchOS 8和iOS 15,AttributedString是broken and incomplete,这迫使我寻找一种解决方案,在带有SwiftUI的watchOS中使用NSAttributedString。

pbossiut

pbossiut1#

最简单的方法是绘制图像:

func renderImage(_ attributedString: NSAttributedString, for width: CGFloat) -> UIImage? {
    let boundingRect = attributedString.boundingRect(with: CGSize(width: width, height: .infinity), options: [.usesLineFragmentOrigin], context: nil)
    UIGraphicsBeginImageContextWithOptions(boundingRect.size, false, 0)
    attributedString.draw(in: CGRect(origin: .zero, size: boundingRect.size))
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return image

然后将其与Image()一起使用

if let image = renderImage(longText, for: geometry.size.width) {
          Image(uiImage: image)
        }
iovurdzv

iovurdzv2#

在最新的swiftUI中,您可以使用AttributedString代替NSAttributedString
有关如何使用它的详细信息,请参阅Apple文档:https://developer.apple.com/documentation/foundation/attributedstring
但在 Package 原始NSTextField(macos)/ UITextField(IOS)控件的情况下,您仍然可以在swiftUI应用程序中使用NSAttributedString
macos Package 器示例(必须易于重写):

import SwiftUI
import Cocoa

@available(OSX 11.0, *)
public struct AttributedText: NSViewRepresentable {
    private let text: NSAttributedString
    private let selectable: Bool
    
    public init(attributedString: NSAttributedString, selectable: Bool = true) {
        self.text = attributedString
        self.selectable = selectable
    }
    
    public func makeNSView(context: Context) -> NSTextField {
        let textField = NSTextField(labelWithAttributedString: text)
        textField.preferredMaxLayoutWidth = textField.frame.width
        textField.allowsEditingTextAttributes = true // Fix of clear of styles on click
        
        textField.isSelectable = selectable
        
        return textField
    }
    
    public func updateNSView(_ textField: NSTextField, context: Context) {
        textField.attributedStringValue = text
    }
}

但在大多数情况下,SwiftUI最好使用本地方式--AttributedString

相关问题