Copy NSAttributedString in UIPasteBoard

前端 未结 4 1369
故里飘歌
故里飘歌 2020-11-30 09:15

How do you copy an NSAttributedString in the pasteboard, to allow the user to paste, or to paste programmatically (with - (void)paste:(id)sender

4条回答
  •  悲哀的现实
    2020-11-30 09:39

    I have found that when I (as a user of the application) copy rich text from a UITextView into the pasteboard, the pasteboard contains two types:

    "public.text",
    "Apple Web Archive pasteboard type
    

    Based on that, I created a convenient category on UIPasteboard.
    (With heavy use of code from this answer).

    It works, but:
    The conversion to html format means I will lose custom attributes. Any clean solution will be gladly accepted.

    File UIPasteboard+AttributedString.h:

    @interface UIPasteboard (AttributedString)
    
    - (void) setAttributedString:(NSAttributedString *)attributedString;
    
    @end
    

    File UIPasteboard+AttributedString.m:

    #import 
    
    #import "UIPasteboard+AttributedString.h"
    
    @implementation UIPasteboard (AttributedString)
    
    - (void) setAttributedString:(NSAttributedString *)attributedString {
        NSString *htmlString = [attributedString htmlString]; // This uses DTCoreText category NSAttributedString+HTML - https://github.com/Cocoanetics/DTCoreText
        NSDictionary *resourceDictionary = @{ @"WebResourceData" : [htmlString dataUsingEncoding:NSUTF8StringEncoding],
        @"WebResourceFrameName":  @"",
        @"WebResourceMIMEType" : @"text/html",
        @"WebResourceTextEncodingName" : @"UTF-8",
        @"WebResourceURL" : @"about:blank" };
    
    
    
        NSDictionary *htmlItem = @{ (NSString *)kUTTypeText : [attributedString string],
            @"Apple Web Archive pasteboard type" : @{ @"WebMainResource" : resourceDictionary } };
    
        [self setItems:@[ htmlItem ]];
    }
    
    
    @end
    

    Only implemented setter. If you want to write the getter, and/or put it on GitHub, be my guest :)

提交回复
热议问题