2016-04-02 9 views
3

Ich versuche UITextView Rtfd Dokument mit Bild darin zu machen. Das Problem ist, dass das Bild den Rahmen von UITextView überlappt - es hat eine größere Breite. Ich brauche dieses Bild für die Breite von UITextView. Dies ist, wie ich die Zeichenfolge laden:Autorisieren Bild in NSAttributedString mit UITextView

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

     textView.attributedText = text 
    } 

Ich habe auch versucht mit webarchive Datei mit img style="width: 100%", aber das hat auch nicht funktioniert.

Was ist der beste Weg, um RTFD oder andere Dokumente so anzuzeigen, dass Bilder auf die Breite skaliert werden?

+0

Iterate durch die 'NSAttributedString' für zugeschrieben' NSAttachmentAttributeName' suchen. Dann kannst du dein Bild entsprechend der Breite des 'UITextView's skalieren. – Larme

Antwort

2

Danke Larme für Sie einen Kommentar, ich mag es, diese Arbeit zu machen verwaltet:

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) 
      } 
     } 
     }) 
} 

Es gibt kleines Problem dabei - wenn ich sehe, eine kleine Verzögerung Scrollen, wenn das Bild angezeigt wird. Es ist nicht mit voller Größe passiert, ohne seine Größe zu ändern. Kann jemand einen Grund dafür finden?

+0

Warum setzen Sie den attributierten Text in 'viewDidLayoutSubviews()' erneut? – Larme

+0

Sie haben Recht, ich habe das später gelöscht. Habe vergessen das hier zu ändern. –

+0

Das hat mir viel Zeit gespart, vielen Dank DamianDudycz –

0

Wenn Sie das Textview die poattributeText Eigenschaft können Sie fanden es viele Objekte wie dieses hat:

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; 

Dann werden Sie feststellen, dass die NSTextAttachment ist die Bingo. So enum diese Objekte, erhalten die NSTextAttachment und ändern die Grenzen es: (Ich habe das Bild hat eine 10px-Marge auf rechten Bildschirm)

[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; 
       } 
      } 
     }]; 
Verwandte Themen