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

时间:2017-11-06 01:21:29

标签: ios swift uiimage nsattributedstring nstextattachment

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

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

如何在textAttachment对象上设置.aspectRatio以使用// #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 正确地重新绘制图像?

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

{{1}}

1 个答案:

答案 0 :(得分:1)

我关注了@Maciej Swic的回答

Resize NSTextAttachment Image

由于某种原因,我无法扩展NSTextAttachment类,所以我将它添加到我正在使用它的类的底部。我删除了我在我的问题中使用的 bounds 属性并使用了他的功能。它位于#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)
    }
}