添加到NSAttributedString时图像被翻转

时间:2017-10-10 12:04:19

标签: swift macos cocoa nsattributedstring nsimage

在调整NSAttributedString中的图像大小时,我遇到了一个奇怪的问题。调整大小扩展正常工作,但是当图像添加到NSAttributedString时,由于某种原因它会被垂直翻转。

这是调整大小的扩展名:

extension NSImage {
  func resize(containerWidth: CGFloat) -> NSImage {

    var scale : CGFloat = 1.0
    let currentWidth = self.size.width
    let currentHeight = self.size.height

    if currentWidth > containerWidth {
      scale = (containerWidth * 0.9) / currentWidth
    }

    let newWidth = currentWidth * scale
    let newHeight = currentHeight * scale

    self.size = NSSize(width: newWidth, height: newHeight)

    return self
  }
}

以下是属性字符串中图像的枚举:

newAttributedString.enumerateAttribute(NSAttributedStringKey.attachment, in: NSMakeRange(0, newAttributedString.length), options: []) { value, range, stop in
    if let attachement = value as? NSTextAttachment {
        let image = attachement.image(forBounds: attachement.bounds, textContainer: NSTextContainer(), characterIndex: range.location)!

        let newImage = image.resize(containerWidth: markdown.bounds.width)
        let newAttribute = NSTextAttachment()
        newAttribute.image = newImage
        newAttributedString.addAttribute(NSAttributedStringKey.attachment, value: newAttribute, range: range)
    }
}

我设置了断点并检查了图像,它们都在正确的旋转中,除非它到达这一行:

newAttributedString.addAttribute(NSAttributedStringKey.attachment, value: newAttribute, range: range)

图像垂直翻转。

我不知道是什么导致这种垂直翻转。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

如果你看一下NSTextAttachment的开发者文档:

https://developer.apple.com/documentation/uikit/nstextattachment

bounds参数定义如下:

“在文本坐标系中定义接收器图形表示的布局边界。”

我知道在使用CoreText布局文本时,你需要翻转坐标,所以我想你也需要用垂直反射转换你的bounds参数。

希望有所帮助。

答案 1 :(得分:0)

我想通了,它比我制作它简单得多。

因为图像是在NSAttribuetdString中附加到NSTextView中,所以我不需要在NSAttributedString中调整每个图像的大小,而只需要在NSTextView中设置附件缩放

markdown.layoutManager?.defaultAttachmentScaling = NSImageScaling.scaleProportionallyDown 

只需一行