美文网首页
SDWebImage-SDWebImageCompat(一)

SDWebImage-SDWebImageCompat(一)

作者: 嘻嘻zhy | 来源:发表于2018-07-08 19:12 被阅读103次

    SDWebImage库中SDWebImageCompat是最基础的配置文件,为了兼容苹果各个平台。

    SDWebImageCompat.h

    #import <TargetConditionals.h>
    
    //不支持OC的GC内存管理
    #ifdef __OBJC_GC__
        #error SDWebImage does not support Objective-C Garbage Collection
    #endif
    
    //苹果的`TargetConditionals.h`文件有点怪,在所有平台上TARGET_OS_MAC都被定义了,所以只能通过TARGET_OS_IPHONE=0这种方式进行判断
    #if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH
        #define SD_MAC 1
    #else
        #define SD_MAC 0
    #endif
    
    //判断是否支持UIKIT, iOS 与 tvOS都支持。
    #if TARGET_OS_IOS || TARGET_OS_TV
        #define SD_UIKIT 1
    #else
        #define SD_UIKIT 0
    #endif
    
    //是否是iOS系统
    #if TARGET_OS_IOS
        #define SD_IOS 1
    #else
        #define SD_IOS 0
    #endif
    
    //是否是TV系统
    #if TARGET_OS_TV
        #define SD_TV 1
    #else
        #define SD_TV 0
    #endif
    
    //是否是watchOS系统
    #if TARGET_OS_WATCH
        #define SD_WATCH 1
    #else
        #define SD_WATCH 0
    #endif
    
    
    #if SD_MAC
        #import <AppKit/AppKit.h>
        #ifndef UIImage
            #define UIImage NSImage
        #endif
        #ifndef UIImageView
            #define UIImageView NSImageView
        #endif
        #ifndef UIView
            #define UIView NSView
        #endif
    #else
        #if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0
            #error SDWebImage doesn't support Deployment Target version < 5.0
        #endif
    
        #if SD_UIKIT
            #import <UIKit/UIKit.h>
        #endif
        #if SD_WATCH
            #import <WatchKit/WatchKit.h>
            #ifndef UIView
                #define UIView WKInterfaceObject
            #endif
            #ifndef UIImageView
                #define UIImageView WKInterfaceImage
            #endif
        #endif
    #endif
    
    #ifndef NS_ENUM
    #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
    #endif
    
    #ifndef NS_OPTIONS
    #define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
    #endif
    
    FOUNDATION_EXPORT UIImage *SDScaledImageForKey(NSString *key, UIImage *image);
    
    typedef void(^SDWebImageNoParamsBlock)(void);
    
    FOUNDATION_EXPORT NSString *const SDWebImageErrorDomain;
    
    #ifndef dispatch_queue_async_safe
    #define dispatch_queue_async_safe(queue, block)\
        if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\
            block();\
        } else {\
            dispatch_async(queue, block);\
        }
    #endif
    
    #ifndef dispatch_main_async_safe
    #define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block)
    #endif
    
    

    SDWebImageCompat.m

    #import "SDWebImageCompat.h"
    #import "UIImage+MultiFormat.h"
    
    //只能支持ARC
    #if !__has_feature(objc_arc)
        #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag
    #endif
    
    #if !OS_OBJECT_USE_OBJC
        #error SDWebImage need ARC for dispatch object
    #endif
    
    //获取合适的scale的UIImage
    inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullable image) {
        if (!image) {
            return nil;
        }
        
    #if SD_MAC
        return image;
    #elif SD_UIKIT || SD_WATCH
        if ((image.images).count > 0) {
            NSMutableArray<UIImage *> *scaledImages = [NSMutableArray array];
    
            for (UIImage *tempImage in image.images) {
                [scaledImages addObject:SDScaledImageForKey(key, tempImage)];
            }
            
            UIImage *animatedImage = [UIImage animatedImageWithImages:scaledImages duration:image.duration];
            if (animatedImage) {
                animatedImage.sd_imageLoopCount = image.sd_imageLoopCount;
            }
            return animatedImage;
        } else {
    #if SD_WATCH
            if ([[WKInterfaceDevice currentDevice] respondsToSelector:@selector(screenScale)]) {
    #elif SD_UIKIT
            if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    #endif
                CGFloat scale = 1;
                if (key.length >= 8) {
                    NSRange range = [key rangeOfString:@"@2x."];
                    if (range.location != NSNotFound) {
                        scale = 2.0;
                    }
                    
                    range = [key rangeOfString:@"@3x."];
                    if (range.location != NSNotFound) {
                        scale = 3.0;
                    }
                }
    
                UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation];
                image = scaledImage;
            }
            return image;
        }
    #endif
    }
    
    NSString *const SDWebImageErrorDomain = @"SDWebImageErrorDomain";
    

    相关文章

      网友评论

          本文标题:SDWebImage-SDWebImageCompat(一)

          本文链接:https://www.haomeiwen.com/subject/kvoouftx.html