gpt4 book ai didi

html - NSAttributedString:使图像适合容器

转载 作者:太空狗 更新时间:2023-10-29 14:42:33 24 4
gpt4 key购买 nike

我有一个由 HTML 制成的 NSAttributedString,它显示一些图像。问题是图像比容器大,我想知道如何将它们放入其中。

谢谢你的帮助

最佳答案

我终于找到了如何做到这一点:

content.enumerateAttribute(NSAttachmentAttributeName, inRange: NSMakeRange(0, content.length), options: NSAttributedStringEnumerationOptions(0)) { (value, range, stop) -> Void in
if let attachement = value as? NSTextAttachment {
let image = attachement.imageForBounds(attachement.bounds, textContainer: NSTextContainer(), characterIndex: range.location)
let screenSize: CGRect = UIScreen.mainScreen().bounds
if image.size.width > screenSize.width-2 {
let newImage = image.resizeImage((screenSize.width-2)/image.size.width)
let newAttribut = NSTextAttachment()
newAttribut.image = newImage
content.addAttribute(NSAttachmentAttributeName, value: newAttribut, range: range)
}
}
}

函数 resizeImage() 定义如下:

extension UIImage {
func resizeImage(scale: CGFloat) -> UIImage {
let newSize = CGSizeMake(self.size.width*scale, self.size.height*scale)
let rect = CGRectMake(0, 0, newSize.width, newSize.height)

UIGraphicsBeginImageContext(newSize)
self.drawInRect(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}

swift 3版本

text.enumerateAttribute(NSAttachmentAttributeName, in: NSMakeRange(0, text.length), options: .init(rawValue: 0), using: { (value, range, stop) in
if let attachement = value as? NSTextAttachment {
let image = attachement.image(forBounds: attachement.bounds, textContainer: NSTextContainer(), characterIndex: range.location)!
let screenSize: CGRect = UIScreen.main.bounds
if image.size.width > screenSize.width-20 {
let newImage = image.resizeImage(scale: (screenSize.width-2)/image.size.width)
let newAttribut = NSTextAttachment()
newAttribut.image = newImage
text.addAttribute(NSAttachmentAttributeName, value: newAttribut, range: range)
}
}
})

函数 resizeImage() 定义如下:

func resizeImage(scale: CGFloat) -> UIImage {
let newSize = CGSize(width: self.size.width*scale, height: self.size.height*scale)
let rect = CGRect(origin: CGPoint.zero, size: newSize)

UIGraphicsBeginImageContext(newSize)
self.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}

Swift 4 版本 + Extension 和可定制的图片最大宽度

extension NSAttributedString {
func attributedStringWithResizedImages(with maxWidth: CGFloat) -> NSAttributedString {
let text = NSMutableAttributedString(attributedString: self)
text.enumerateAttribute(NSAttributedStringKey.attachment, in: NSMakeRange(0, text.length), options: .init(rawValue: 0), using: { (value, range, stop) in
if let attachement = value as? NSTextAttachment {
let image = attachement.image(forBounds: attachement.bounds, textContainer: NSTextContainer(), characterIndex: range.location)!
if image.size.width > maxWidth {
let newImage = image.resizeImage(scale: maxWidth/image.size.width)
let newAttribut = NSTextAttachment()
newAttribut.image = newImage
text.addAttribute(NSAttributedStringKey.attachment, value: newAttribut, range: range)
}
}
})
return text
}
}

extension UIImage {
func resizeImage(scale: CGFloat) -> UIImage {
let newSize = CGSize(width: self.size.width*scale, height: self.size.height*scale)
let rect = CGRect(origin: CGPoint.zero, size: newSize)

UIGraphicsBeginImageContext(newSize)
self.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}

关于html - NSAttributedString:使图像适合容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920795/

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