2014-07-01 17 views
7

Tôi có một lớp con NSTextAttachment với ghi đè
attachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
imageForBounds:textContainer:characterIndex:.Vẽ lại NSTextAttachments trong UITextView với văn bản được phân bổ

Tôi cần vẽ lại (các) tệp đính kèm tại một số điểm. Gọi số setNeedsDisplay trên UITextView không hoạt động.

Bất kỳ ý tưởng nào? Tôi muốn tránh tạo lại các tệp đính kèm và/hoặc chuỗi được phân bổ.

Trả lời

16

Bạn sẽ muốn sử dụng một trong các phương pháp textView.layoutManager 's.

  • invalidateDisplayCharacterRange:
    • imageForBounds:textContainer:characterIndex: sẽ được gọi một lần nữa.
    • attachmentBoundsForTextContainer:[...]Index: sẽ không được gọi lại là.
    • Tốt nếu image đã được thay đổi bằng một số khác trong số cùng kích thước.
  • invalidateLayoutForCharacterRange:actualCharacterRange:
    • imageForBounds:textContainer:characterIndex: sẽ được gọi một lần nữa.
    • attachmentBoundsForTextContainer:[...]Index: sẽ được gọi lại.
    • Tốt nếu image đã được thay đổi bằng một số khác là một kích thước khác nhau.

Nếu bạn chỉ muốn cập nhật một tập tin đính kèm duy nhất, bạn có thể tìm thấy phương pháp helper này tôi đã viết hữu ích:

- (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; 
} 

Bạn có thể vượt qua các kết quả NSRange của phương pháp này để đối số đầu tiên của một trong các phương thức invalidate này. Đối với các đối số actualCharacterRange: của phương pháp thứ hai, tôi đã đi qua trong NULL mà không có bất kỳ vấn đề.

+0

Thanks a lot Nó của giải quyết vấn đề của tôi. – jhondge

2

Vâng, sau khi đào một số, có thể thực hiện bằng cách hủy bỏ hiệu lực quản lý bố trí:

[textView.layoutManager invalidate....] 

Apple docs

-1

Nếu bạn chỉ muốn thay đổi NSTextAttachment được init bởi một hình ảnh, tôi đề nghị bạn sử dụng

setAttachmentSize:size forGlyphRange:range 
Các vấn đề liên quan