2014-07-01 13 views

Antwort

16

Sie werden eine der textView.layoutManager ‚s Methoden verwenden möchten.

  • invalidateDisplayCharacterRange:
    • imageForBounds:textContainer:characterIndex: wieder aufgerufen werden.
    • attachmentBoundsForTextContainer:[...]Index: wird nicht erneut aufgerufen werden.
    • Gut, wenn die image mit einer anderen der gleichen Größe geändert wurde.
  • invalidateLayoutForCharacterRange:actualCharacterRange:
    • imageForBounds:textContainer:characterIndex: wieder aufgerufen werden.
    • attachmentBoundsForTextContainer:[...]Index: wird erneut aufgerufen.
    • Gut, wenn die image mit einer anderen anderen Größe geändert wurde.

Wenn Sie nur eine einzelne Anlage aktualisieren möchten, können Sie diese Hilfsmethode finde ich schrieb hilfreich:

- (NSRange)rangeOfAttachment:(NSTextAttachment *)attachment { 
    __block NSRange ret; 
    [self.textStorage enumerateAttribute:NSAttachmentAttributeName 
           inRange:NSMakeRange(0, self.textStorage.length) 
           options:0 
           usingBlock:^(id value, NSRange range, BOOL *stop) { 
            if (attachment == value) { 
             ret = range; 
             *stop = YES; 
            } 
           }]; 
    return ret; 
} 

Sie können die resultierende NSRange dieser Methode auf das erste Argument übergeben von entweder diese Methoden. Für das actualCharacterRange: Argument der zweiten Methode habe ich NULL ohne irgendwelche Probleme übergeben.

+0

Vielen Dank .Es ist mein Problem gelöst zu verwenden. – jhondge

2

Nun, nach einiger Graben, kann man erkennen, durch Ungültigmachen des Layout-Manager getan:

[textView.layoutManager invalidate....] 

Apple docs

-1

Wenn Sie wollen einfach nur die NSTextAttachment ändern, die von einem Bild init ist, schlage ich Ihnen

setAttachmentSize:size forGlyphRange:range 
Verwandte Themen