2017-08-05 35 views
1

之前,我將包含圖像的特定字符串更改爲NSTextAttachment以顯示自定義圖釋。將包含圖像的NSTextAttachment替換爲字符串

字符串NSTextAttachment代碼

{ 
    guard 
     let original = self.attributedText 
     else { return } 
    let pattern = "\\[img src=(\\w+)\\]" 

    do{ 
     let regex = try NSRegularExpression(pattern: pattern, options: []) 
     let matches = regex.matches(in: original.string, options : [], range : NSMakeRange(0, original.string.characters.count)) 
     let attributeString = NSMutableAttributedString(attributedString: original) 

     for match in matches.reversed(){ 
      let emoticonString = attributeString.attributedSubstring(from: match.rangeAt(1)).string 

      if let emoticonAndroid = Emoticon(rawValue: emoticonString), 
       let image = UIImage(named : "\(emoticonAndroid.convertFromAndroid().rawValue)_000"){ 
       image.accessibilityIdentifier = emoticonAndroid.rawValue 
       let attributedImage = NSTextAttachment() 
       attributedImage.image = image 
       attributedImage.bounds = CGRect(x: 0, y: -8, width: 25, height: 25) 
       attributeString.beginEditing() 
       attributeString.replaceCharacters(in: match.rangeAt(0), with: NSAttributedString(attachment: attributedImage)) 
       attributeString.endEditing() 
      } 
     } 

     self.attributedText = attributeString 
    }catch{ 
     return 
    } 

} 

但是,我需要更換NSTextAttachment串發送消息。 我使用NSMutableAttributedString.replaceCharacters(in:with :)方法。但是,它只能使用一個表情圖像。

one emoticon two emoticons or more

我該如何解決?

NSTextAttachment到字符串代碼

{ 
    if let original = self.attributedText{ 
     let attributeString = NSMutableAttributedString(attributedString: original) 

     original.enumerateAttribute(NSAttachmentAttributeName, in: NSMakeRange(0, original.length), options: [], using: { attribute, range, _ in 
      if let attachment = attribute as? NSTextAttachment, 
       let image = attachment.image{ 
       let str = "[img src=\(image.accessibilityIdentifier!)]" 

       attributeString.beginEditing() 
       attributeString.(in: range, with: str) 
       attributeString.endEditing() 
      } 
     }) 

     self.attributedText = attributeString 
     return attributeString.string 
    }else{ 
     return nil 
    } 
} 

回答

0

嗯..我解決了這個問題。

第一:NSTextAttachment

的計數數
var count = 0 
    self.attributedText.enumerateAttribute(NSAttachmentAttributeName, in : NSMakeRange(0, self.attributedText.length), options: [], using: { attribute, range, _ in 
     if let attachment = attribute as? NSTextAttachment, 
      let image = attachment.image{ 
      count = count + 1 
     } 
    }) 
    return count 

第二:與字符串替換NSTextAttachment並計算改變後的範圍。 < - 重複

for i in 0..<self.countOfNSTextAttachment(){ 
     let attributedString = NSMutableAttributedString(attributedString: self.attributedText) 
     var count = 0 
     attributedString.enumerateAttribute(NSAttachmentAttributeName, in : NSMakeRange(0, attributedString.length), options: [], using: { attribute, range, _ in 
      if let attachment = attribute as? NSTextAttachment, 
       let image = attachment.image{ 
       let str = "[img src=\(image.accessibilityIdentifier!)]" 

       if count == 0{ 
        attributedString.beginEditing() 
        attributedString.replaceCharacters(in: range, with: NSAttributedString(string : str)) 
        attributedString.endEditing() 
        self.attributedText = attributedString 
       }else{ 
        return 
       } 
       count = count + 1 
      } 
     }) 
    } 

    return self.attributedText.string 

結果:result

完美!

相關問題