2015-09-24 22 views
8

Sto provando a creare una tastiera personalizzata per iOS utilizzando immagini che ho inserito come pulsanti. Quando premo un pulsante, l'immagine collegata al pulsante viene inserita in una stringa attribuita che viene caricata in un UiTextView all'interno della visualizzazione personalizzata della tastiera. Funziona.Come aggiungere immagini come allegato di testo in Swift utilizzando nsattributedstring

Il problema è che quando aggiungo una nuova immagine alla stringa attribuita, le vecchie e le nuove immagini nella stringa si stanno modificando sull'immagine che ho attualmente premuto. Non riesco a capire perché le vecchie immagini nella stringa stanno cambiando.

Qualche suggerimento? Ho provato a utilizzare replaceCharactersInRange e insertAttributedString ma non riesco a farlo funzionare. Ecco il codice (dopo viewDidLoad):

let textAttachment = NSTextAttachment() 

let textView = UITextView(frame: CGRectMake(5, 5, 200, 40)) 
var attributedString = NSMutableAttributedString(string: "") 

@IBAction func buttonPressed(button :UIButton) { 

    let string = button.titleLabel?.text 

    textAttachment.image = UIImage(named: "\(string!).png")! 
    textAttachment.image = UIImage(CGImage: textAttachment.image!.CGImage!, scale: 6, orientation: .Up) 
    let attrStringWithImage = NSAttributedString(attachment: textAttachment) 
    attributedString.appendAttributedString(attrStringWithImage); 


    textView.attributedText = attributedString; 
    } 

Grazie!

risposta

0

Ho trovato il problema, ho bisogno di avere variabili diverse per NSTextAttachment (ad esempio textAttachment1, textAttachment2 ecc.) Altrimenti utilizza solo la prima immagine che è stata indirizzata.

0

questo funziona per me:

let attributedStringTextAttachment = NSTextAttachment() 
attributedStringTextAttachment.image = UIImage(named: "image") 
3

Non possiamo semplicemente accodare immagine NSTextAttachment .Abbiamo per memorizzare tutta l'immagine e la concatenazione attaccato alla esistenti attribuito String.

func buttonPressed(_ sender: Any) { 

    let button = sender as! UIButton 
    let tag = button.tag 
    let attributedString:NSAttributedString! 

    switch tag { 
    case 2: 
     attributedString = addAttributedText(text: (button.titleLabel?.text)!) 
    case 3: 
     attributedString = addAttributedText(text: (button.titleLabel?.text)!) 
    case 4: 
     attributedString = addAttributedText(text: (button.titleLabel?.text)!) 
    default: 
     attributedString = addAttributedText(text: "launch") 
     } 
     textView.attributedText = attributedString 
    } 

    func addAttributedText(text:String) -> NSAttributedString { 
     textViewDidChange(textView) 
     let axtractedImageAttribute = NSMutableAttributedString() 
     for image in imageArray { 
      let attachment:NSTextAttachment = NSTextAttachment() 
      attachment.image = image 
      attachment.setImageHeight(height: 20) 
      let attachmentString:NSAttributedString = NSAttributedString(attachment: attachment) 
      axtractedImageAttribute.append(attachmentString) 
     } 

     let attachment:NSTextAttachment = NSTextAttachment() 
     attachment.image = UIImage(named: "\(text).png") 
     attachment.setImageHeight(height: 20) 
     let attachmentString:NSAttributedString = NSAttributedString(attachment: attachment) 
     let attributedString:NSMutableAttributedString = NSMutableAttributedString(string:textView.text!) 
     attributedString.append(axtractedImageAttribute) 
     attributedString.append(attachmentString) 
     return attributedString 
    } 

    //MARKS:- Extract attachedImage 
    func textViewDidChange(_ textView: UITextView) { 
     imageArray = [UIImage]() 
     let range = NSRange(location: 0, length: textView.attributedText.length) 
     if (textView.textStorage.containsAttachments(in: range)) { 
      let attrString = textView.attributedText 
      var location = 0 
      while location < range.length { 
       var r = NSRange() 
       let attrDictionary = attrString?.attributes(at: location, effectiveRange: &r) 
       if attrDictionary != nil { 
        let attachment = attrDictionary![NSAttachmentAttributeName] as? NSTextAttachment 
        if attachment != nil { 
         if attachment!.image != nil { 
          imageArray.append(attachment!.image!) 
         } 
        } 
        location += r.length 
       } 
      } 
     } 
    } 

} 

enter image description here enter image description here

Demo Reference

+0

Se ho 2 immagini differenti allegati, come potrei riconoscere quale im clic? Ho fatto il codice per stampare qualcosa quando si fa clic su un allegato di immagine, ma ho bisogno di realizzare azioni diverse a seconda dell'immagine. –

+0

Inoltre, è possibile allegare un video? –