在我的iOS / swift项目中,我使用下面的代码将RTF文档加载到UITextView。 RTF本身包含样式文本,如“... blah blah [ABC.png] blah blah [DEF.png] blah ......”这是加载到UITextView很好。
现在,我想将所有出现的[someImage.png]替换为实际图像为NSTextAttachment。我怎么能这样做?
我知道在RTF文档中嵌入图像的可能性,但我不能在这个项目中这样做。
if let rtfPath = Bundle.main.url(forResource: "testABC", withExtension: "rtf")
{
do
{
//load RTF to UITextView
let attributedStringWithRtf = try NSAttributedString(url: rtfPath, options: [.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil)
txtView.attributedText = attributedStringWithRtf
//find all "[ABC.png]" and replace with image
let regPattern = "\\[.*?\\]"
//now...?
}
}
答案 0 :(得分:0)
这是你可以做的事情。
注意:我不是Swift Developper,更像是Objective-C,所以可能会有一些丑陋的Swift代码(try!
等)。但是更多的是使用NSRegularExpression
的逻辑(我在Objective-C中使用它,因为它在CocoaTouch中共享)
所以主线指令:
找到图像占位符的位置
从中创建NSAttributeString
/ NSTextAttachment
将占位符替换为先前的属性字符串。
let regPattern = "\\[((.*?).png)\\]"
let regex = try! NSRegularExpression.init(pattern: regPattern, options: [])
let matches = regex.matches(in: attributedStringWithRtf.string, options: [], range: NSMakeRange(0, attributedStringWithRtf.length))
for aMatch in matches.reversed()
{
let allRangeToReplace = attributedStringWithRtf.attributedSubstring(from: aMatch.range(at: 0)).string
let imageNameWithExtension = attributedStringWithRtf.attributedSubstring(from: aMatch.range(at: 1)).string
let imageNameWithoutExtension = attributedStringWithRtf.attributedSubstring(from: aMatch.range(at: 2)).string
print("allRangeToReplace: \(allRangeToReplace)")
print("imageNameWithExtension: \(imageNameWithExtension)")
print("imageNameWithoutExtension: \(imageNameWithoutExtension)")
//Create your NSAttributedString with NSTextAttachment here
let myImageAttribute = ...
attributedStringWithRtf.replaceCharacters(in: imageNameRange, with: myImageAttributeString)
}
那是什么意思?
我使用了修改模式。我写了“png”,但你可以改变它。我添加了一些()
来轻松搞定有趣的部分。我认为您可能想要检索图像的名称,无论是否有.png
,这就是为什么我得到了所有这些print()
。也许是因为您已将其保存在您的应用中,等等。如果您需要将扩展程序添加为一个组,则可能需要将其添加到regPattern
的括号中,并检查要调用的aMatch.range(at: ??)
。使用Bundle.main.url(forResource: imageName, withExtension: imageExtension)
我使用matches.reversed()
因为如果您使用不同长度的替换修改“匹配”的长度,则之前的范围将会关闭。所以从头到尾可以做到这一点。
将UIImage
转换为NSAttributedString
到NSTextAttachment
的一些代码:How to add images as text attachment in Swift using nsattributedstring