浏览代码

bugfix for YYImage

ibireme 9 年之前
父节点
当前提交
17942e7d5d

+ 1 - 1
Demo/YYTextDemo/YYImage/YYImage.m

@@ -144,7 +144,7 @@ static CGFloat _NSStringPathScale(NSString *string) {
 
 - (instancetype)initWithData:(NSData *)data scale:(CGFloat)scale {
     if (data.length == 0) return nil;
-    if (scale <= 0) scale = 1;
+    if (scale <= 0) scale = [UIScreen mainScreen].scale;
     _preloadedLock = OS_SPINLOCK_INIT;
     @autoreleasepool {
         YYImageDecoder *decoder = [YYImageDecoder decoderWithData:data scale:scale];

+ 1 - 1
Framework/Info.plist

@@ -15,7 +15,7 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>0.9.3</string>
+	<string>0.9.4</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>

+ 1 - 1
YYText.podspec

@@ -1,7 +1,7 @@
 Pod::Spec.new do |s|
   s.name         = 'YYText'
   s.summary      = 'Powerful text framework for iOS to display and edit rich text.'
-  s.version      = '0.9.3'
+  s.version      = '0.9.4'
   s.license      = { :type => 'MIT', :file => 'LICENSE' }
   s.authors      = { 'ibireme' => 'ibireme@gmail.com' }
   s.social_media_url = 'http://blog.ibireme.com'

+ 1 - 4
YYText/Utility/NSAttributedString+YYText.m

@@ -626,10 +626,7 @@ return style. _attr_;
         hasAnim = YES;
     } else if (NSProtocolFromString(@"YYAnimatedImage") &&
                [image conformsToProtocol:NSProtocolFromString(@"YYAnimatedImage")]) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wundeclared-selector"
-        NSNumber *frameCount = [image performSelector:@selector(animatedImageFrameCount)];
-#pragma clang diagnostic pop
+        NSNumber *frameCount = [image valueForKey:@"animatedImageFrameCount"];
         if (frameCount.intValue > 1) hasAnim = YES;
     }
     

+ 36 - 22
YYText/Utility/UIPasteboard+YYText.m

@@ -87,35 +87,49 @@ NSString *const YYTextUTTypeWEBP = @"com.google.webp";
         [self addItems:@[item]];
     }
     [attributedString enumerateAttribute:YYTextAttachmentAttributeName inRange:NSMakeRange(0, attributedString.length) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(YYTextAttachment *attachment, NSRange range, BOOL *stop) {
-        UIImage *img = attachment.content;
-        if ([img isKindOfClass:[UIImage class]]) {
-            NSDictionary *item = @{@"com.apple.uikit.image" : img};
+        
+        // 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
-            Class cls = NSClassFromString(@"YYImage");
-            if (cls && [img isKindOfClass:cls]) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wundeclared-selector"
-                NSData *data = [img performSelector:@selector(animatedImageData)];
-                NSNumber *type = [img performSelector:@selector(animatedImageType)];
-#pragma clang diagnostic pop
+        // 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) {
-                    if (type.unsignedIntegerValue == YYImageTypeGIF) {
-                        NSDictionary *item = @{(id)kUTTypeGIF : data};
-                        [self addItems:@[item]];
-                    } else if (type.unsignedIntegerValue == YYImageTypePNG) {
-                        NSDictionary *item = @{(id)kUTTypePNG : data};
-                        [self addItems:@[item]];
-                    } else if (type.unsignedIntegerValue == YYImageTypeWebP) {
-                        NSDictionary *item = @{(id)YYTextUTTypeWEBP : data};
-                        [self addItems:@[item]];
+                    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
-            
         }
+#endif
+        
     }];
 }
 

+ 23 - 12
YYText/YYTextView.m

@@ -2848,17 +2848,16 @@ typedef NS_ENUM(NSUInteger, YYTextMoveDirection) {
         
         Class cls = NSClassFromString(@"YYImage");
         if (cls) {
-            NSNumber *scale = @(YYTextScreenScale());
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wundeclared-selector"
             if (p.yy_GIFData) {
-                img = [(id)cls performSelector:@selector(imageWithData:scale:) withObject:p.yy_PNGData withObject:scale];
+                img = [(id)cls performSelector:@selector(imageWithData:scale:) withObject:p.yy_GIFData withObject:nil];
             }
             if (!img && p.yy_PNGData) {
-                img = [(id)cls performSelector:@selector(imageWithData:scale:) withObject:p.yy_PNGData withObject:scale];
+                img = [(id)cls performSelector:@selector(imageWithData:scale:) withObject:p.yy_PNGData withObject:nil];
             }
             if (!img && p.yy_WEBPData) {
-                img = [(id)cls performSelector:@selector(imageWithData:scale:) withObject:p.yy_WEBPData withObject:scale];
+                img = [(id)cls performSelector:@selector(imageWithData:scale:) withObject:p.yy_WEBPData withObject:nil];
             }
 #pragma clang diagnostic pop
         }
@@ -2872,17 +2871,29 @@ typedef NS_ENUM(NSUInteger, YYTextMoveDirection) {
         if (img && img.size.width > 1 && img.size.height > 1) {
             id content = img;
             
-            #if YYTextAnimatedImageAvailable
-            if ([img conformsToProtocol:@protocol(YYAnimatedImage)]) {
-                id<YYAnimatedImage> ani = (id)img;
-                if (ani.animatedImageFrameCount > 1) {
-                    YYAnimatedImageView *aniView = [[YYAnimatedImageView alloc] initWithImage:img];
-                    if (aniView) {
-                        content = aniView;
+            if (cls) {
+                if ([img conformsToProtocol:NSProtocolFromString(@"YYAnimatedImage")]) {
+                    NSNumber *frameCount = [img valueForKey:@"animatedImageFrameCount"];
+                    if (frameCount.integerValue > 1) {
+                        Class viewCls = NSClassFromString(@"YYAnimatedImageView");
+                        UIImageView *imgView = [(id)viewCls new];
+                        imgView.image = img;
+                        imgView.frame = CGRectMake(0, 0, img.size.width, img.size.height);
+                        if (imgView) {
+                            content = imgView;
+                        }
                     }
                 }
             }
-            #endif
+            
+            if ([content isKindOfClass:[UIImage class]] && img.images.count > 1) {
+                UIImageView *imgView = [UIImageView new];
+                imgView.image = img;
+                imgView.frame = CGRectMake(0, 0, img.size.width, img.size.height);
+                if (imgView) {
+                    content = imgView;
+                }
+            }
             
             NSMutableAttributedString *attText = [NSAttributedString yy_attachmentStringWithContent:content contentMode:UIViewContentModeScaleToFill width:img.size.width ascent:img.size.height descent:0];
             NSDictionary *attrs = _typingAttributesHolder.yy_attributes;