Files
fanyin-ios/Pods/YYText/YYText/Utility/UIPasteboard+YYText.m
2025-08-12 14:27:12 +08:00

147 lines
4.7 KiB
Objective-C

//
// UIPasteboard+YYText.m
// YYText <https://github.com/ibireme/YYText>
//
// Created by ibireme on 15/4/2.
// Copyright (c) 2015 ibireme.
//
// This source code is licensed under the MIT-style license found in the
// LICENSE file in the root directory of this source tree.
//
#import "UIPasteboard+YYText.h"
#import "NSAttributedString+YYText.h"
#import <MobileCoreServices/MobileCoreServices.h>
#if __has_include("YYImage.h")
#import "YYImage.h"
#define YYTextAnimatedImageAvailable 1
#elif __has_include(<YYImage/YYImage.h>)
#import <YYImage/YYImage.h>
#define YYTextAnimatedImageAvailable 1
#elif __has_include(<YYWebImage/YYImage.h>)
#import <YYWebImage/YYImage.h>
#define YYTextAnimatedImageAvailable 1
#else
#define YYTextAnimatedImageAvailable 0
#endif
// Dummy class for category
@interface UIPasteboard_YYText : NSObject @end
@implementation UIPasteboard_YYText @end
NSString *const YYTextPasteboardTypeAttributedString = @"com.ibireme.NSAttributedString";
NSString *const YYTextUTTypeWEBP = @"com.google.webp";
@implementation UIPasteboard (YYText)
- (void)setYy_PNGData:(NSData *)PNGData {
[self setData:PNGData forPasteboardType:(id)kUTTypePNG];
}
- (NSData *)yy_PNGData {
return [self dataForPasteboardType:(id)kUTTypePNG];
}
- (void)setYy_JPEGData:(NSData *)JPEGData {
[self setData:JPEGData forPasteboardType:(id)kUTTypeJPEG];
}
- (NSData *)yy_JPEGData {
return [self dataForPasteboardType:(id)kUTTypeJPEG];
}
- (void)setYy_GIFData:(NSData *)GIFData {
[self setData:GIFData forPasteboardType:(id)kUTTypeGIF];
}
- (NSData *)yy_GIFData {
return [self dataForPasteboardType:(id)kUTTypeGIF];
}
- (void)setYy_WEBPData:(NSData *)WEBPData {
[self setData:WEBPData forPasteboardType:YYTextUTTypeWEBP];
}
- (NSData *)yy_WEBPData {
return [self dataForPasteboardType:YYTextUTTypeWEBP];
}
- (void)setYy_ImageData:(NSData *)imageData {
[self setData:imageData forPasteboardType:(id)kUTTypeImage];
}
- (NSData *)yy_ImageData {
return [self dataForPasteboardType:(id)kUTTypeImage];
}
- (void)setYy_AttributedString:(NSAttributedString *)attributedString {
self.string = [attributedString yy_plainTextForRange:NSMakeRange(0, attributedString.length)];
NSData *data = [attributedString yy_archiveToData];
if (data) {
NSDictionary *item = @{YYTextPasteboardTypeAttributedString : data};
[self addItems:@[item]];
}
[attributedString enumerateAttribute:YYTextAttachmentAttributeName inRange:NSMakeRange(0, attributedString.length) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(YYTextAttachment *attachment, NSRange range, BOOL *stop) {
// save image
UIImage *simpleImage = nil;
if ([attachment.content isKindOfClass:[UIImage class]]) {
simpleImage = attachment.content;
} else if ([attachment.content isKindOfClass:[UIImageView class]]) {
simpleImage = ((UIImageView *)attachment.content).image;
}
if (simpleImage) {
NSDictionary *item = @{@"com.apple.uikit.image" : simpleImage};
[self addItems:@[item]];
}
#if YYTextAnimatedImageAvailable
// save animated image
if ([attachment.content isKindOfClass:[UIImageView class]]) {
UIImageView *imageView = attachment.content;
Class aniImageClass = NSClassFromString(@"YYImage");
UIImage *image = imageView.image;
if (aniImageClass && [image isKindOfClass:aniImageClass]) {
NSData *data = [image valueForKey:@"animatedImageData"];
NSNumber *type = [image valueForKey:@"animatedImageType"];
if (data) {
switch (type.unsignedIntegerValue) {
case YYImageTypeGIF: {
NSDictionary *item = @{(id)kUTTypeGIF : data};
[self addItems:@[item]];
} break;
case YYImageTypePNG: { // APNG
NSDictionary *item = @{(id)kUTTypePNG : data};
[self addItems:@[item]];
} break;
case YYImageTypeWebP: {
NSDictionary *item = @{(id)YYTextUTTypeWEBP : data};
[self addItems:@[item]];
} break;
default: break;
}
}
}
}
#endif
}];
}
- (NSAttributedString *)yy_AttributedString {
for (NSDictionary *items in self.items) {
NSData *data = items[YYTextPasteboardTypeAttributedString];
if (data) {
return [NSAttributedString yy_unarchiveFromData:data];
}
}
return nil;
}
@end