2016-04-02 3 views
3

Im пытается сделать UITextView отображать документ rtfd с изображением в нем. Проблема в том, что изображение перекрывает рамку UITextView - она ​​имеет большую ширину. Мне нужно, чтобы это изображение масштабировалось до ширины UITextView. Это, как я загружаю строку:Авторезистирование изображения в NSAttributedString с помощью UITextView

if let text = try? NSMutableAttributedString(URL: NSBundle.mainBundle().URLForResource("License agreement", withExtension: "rtfd")!, options: [NSDocumentTypeDocumentAttribute : NSRTFDTextDocumentType], documentAttributes: nil) { 

     textView.attributedText = text 
    } 

Я также попытался с файлом с Веб-архив img style="width: 100%", но это тоже не сработало.

Каков наилучший способ отображения rtfd или другого документа таким образом, чтобы изображения масштабировались в соответствии с шириной?

+0

перебирать 'NSAttributedString' ищет приписываемой' NSAttachmentAttributeName'. Затем вы можете изменить размер изображения в соответствии с шириной 'UITextView'. – Larme

ответ

2

Спасибо LARME для вас комментировать, мне удалось заставить его работать так:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    prepareTextImages() 
} 

private var text: NSMutableAttributedString? 
private func prepareTextImages() { 
    let width = CGRectGetWidth(self.view.frame) - self.containerView.frame.origin.x * 2 - 10 
    text?.enumerateAttribute(NSAttachmentAttributeName, inRange: NSRange(location: 0, length: text!.length), options: [], usingBlock: { [width] (object, range, pointer) in 
     let textViewAsAny: Any = self.textView 
     if let attachment = object as? NSTextAttachment, let img = attachment.imageForBounds(self.textView.bounds, textContainer: textViewAsAny as? NSTextContainer, characterIndex: range.location) { 
      if attachment.fileType == "public.png" { 
       let aspect = img.size.width/img.size.height 
       if img.size.width <= width { 
        attachment.bounds = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height) 
        return 
       } 
       let height = width/aspect 
       attachment.bounds = CGRect(x: 0, y: 0, width: width, height: height) 
      } 
     } 
     }) 
} 

Существует небольшая проблема с этим - при прокрутке я вижу небольшую задержку при просмотре изображения. Не получается с полноразмерным изображением без изменения его размера. Может кто-нибудь подумать о причине?

+0

Почему вы снова устанавливаете атрибутный текст в 'viewDidLayoutSubviews()'? – Larme

+0

Вы правы, я удалил это позже. Забыл изменить это здесь. –

+0

Это спасло мое время, спасибо большое DamianDudycz –

0

Если вы poattributeText свойства TextView в вы нашли у него есть много объектов, как это:

NSAttachment = "<NSTextAttachment: 0x6000002a39c0> \"XXXXXXX.jpg\""; 
NSColor = "kCGColorSpaceModelRGB 0 0 0 1 "; 
NSFont = "<UICTFont: 0x7f8356400f60> font-family: \"Times New Roman\"; font-weight: normal; font-style: normal; font-size: 12.00pt"; 
NSKern = 0; 
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 12, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 15/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0"; 
NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 "; 
NSStrokeWidth = 0; 

Тогда вы увидите, что NSTextAttachment является Bingo. Так enum эти объекты, получить NSTextAttachment и изменить границы этого: (я установил изображение имеет запас 10px в правой части экрана)

[attributeString enumerateAttribute:NSAttachmentAttributeName inRange:NSMakeRange(0, attributeString.length) options:0 usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) { 

      if (value) { 

       if ([value isKindOfClass:[NSTextAttachment class]]) { 

        NSTextAttachment *attach = value; 
        CGFloat scale = SCREEN_WIDTH/attach.bounds.size.width; 
        CGRect newRect = CGRectMake(attach.bounds.origin.x, attach.bounds.origin.y,SCREEN_WIDTH-10, attach.bounds.size.height*scale); 
        attach.bounds = newRect; 
       } 
      } 
     }];