Swift iOS - 如何将 NSTextAttachment 内容模式设置为 Aspect Fit?

Swift iOS -How to Set NSTextAttachment Content Mode to Aspect Fit?

我有一个附加到字符串的 PDF 图像。我使用 NSTextAttachmentNSAttributedString 来完成它。我将它们添加到 textView,结果是 Hello,下面是 World 的图像。

问题是当我在 textAttachment 上设置 PDF 图像的边界时,World 图像失真了。它又长又宽。

如何在 textAttachment 对象上设置 contentMode 以使用 .aspectRatio 正确重绘图像?

数字 #4 是我设置边界的地方

// #1. Define dict attribute for string
let bold17 = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 17)]

// #2. Create "hello" string and add the dict attribute to it
let helloStr = NSAttributedString(string: "Hello\n\n", attributes: bold17)

// #3. Create NSTextAttachment
let textAttachment = NSTextAttachment()

// #4. Add image to the textAttachment then set it's bounds
textAttachment.image = UIImage(named: "world_PDF")
textAttachment.bounds = CGRect(x: 0, y: 0, width: 200, height: 200)

// #5. Set image as NSAttributedString
let worldImage = NSAttributedString(attachment: textAttachment)

// #6. Create NSMutableString to 
let mutableAttributedString = NSMutableAttributedString()

// #7. Append the "hello" string and the "world" image to each other using the mutableAttributedString object
mutableAttributedString.append(helloStr)
mutableAttributedString.append(worldImage)

// #8. Set the mutableAttributedString to the textView then center it
textView.attributedText = mutableAttributedString
textView.textAlignment = .center

我关注了@Maciej Swic 的回答

Resize NSTextAttachment Image

出于某种原因,我无法扩展 NSTextAttachment class,所以我将它添加到我正在使用它的 class 的底部。我删除了 边界 属性 我在我的问题中使用了它,而是使用了他的函数。它在#4,第二行:

class MyController: UIViewController{

    override func viewDidLoad() {
            super.viewDidLoad()

       // #1. Define dict attribute for string
       let bold17 = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 17)]

       // #2. Create "hello" string and add the dict attribute to it
       let helloStr = NSAttributedString(string: "Hello\n\n", attributes: bold17)

       // #3. Create NSTextAttachment
       let textAttachment = NSTextAttachment()

       // #4. Add image to the textAttachment then set it's bounds
       textAttachment.image = UIImage(named: "world_PDF")
       textAttachment.setImageHeight(height: 200) // <----HIS ANSWER HERE

       // #5. Set image as NSAttributedString
       let worldImage = NSAttributedString(attachment: textAttachment)

       // #6. Create NSMutableString to 
       let mutableAttributedString = NSMutableAttributedString()

       // #7. Append the "hello" string and the "world" image to each other using the mutableAttributedString object
       mutableAttributedString.append(helloStr)
       mutableAttributedString.append(worldImage)

       // #8. Set the mutableAttributedString to the textView then center it
       textView.attributedText = mutableAttributedString
       textView.textAlignment = .center

    }
}

extension NSTextAttachment {
    func setImageHeight(height: CGFloat) {
        guard let image = image else { return }
        let ratio = image.size.width / image.size.height

        bounds = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: ratio * height, height: height)
    }
}