Swift:在加载样式化RTF后,将字符串替换为UITextView中的NSTextAttachment

时间:2017-11-19 16:52:12

标签: ios swift replace uitextview nstextattachment

在我的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...?
    }
}

1 个答案:

答案 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转换为NSAttributedStringNSTextAttachment的一些代码:How to add images as text attachment in Swift using nsattributedstring