├── WMZBanner
├── Assets.xcassets
│ ├── Contents.json
│ ├── bannerP1.imageset
│ │ ├── bannerP1.png
│ │ └── Contents.json
│ ├── bannerP2.imageset
│ │ ├── bannerP2.png
│ │ └── Contents.json
│ ├── bannerP3.imageset
│ │ ├── bannerP3.png
│ │ └── Contents.json
│ ├── bannerP4.imageset
│ │ ├── bannerP4.png
│ │ └── Contents.json
│ ├── slidePoint.imageset
│ │ ├── slidePoint@2x.png
│ │ └── Contents.json
│ ├── slideCirclePoint.imageset
│ │ ├── slideCirclePoint@2x.png
│ │ └── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── ViewController.h
├── Demo
│ ├── 叠加样式
│ │ ├── DemoAdd.h
│ │ └── DemoAdd.m
│ ├── 显示全部属性
│ │ └── demoOne.h
│ ├── 卡片样式
│ │ ├── DemoCard.h
│ │ ├── MyCell.h
│ │ └── MyCell.m
│ ├── 天猫样式
│ │ ├── DemoTianMao.h
│ │ ├── TianMaoCell.h
│ │ ├── TianMaoCell.m
│ │ └── DemoTianMao.m
│ ├── 正常样式
│ │ ├── demoNormal.h
│ │ └── demoNormal.m
│ ├── 自定义pageControl
│ │ ├── 特殊样式
│ │ │ ├── FadeDemo.h
│ │ │ ├── SpecilDemo.h
│ │ │ ├── SpecilFirstScaleDemo.h
│ │ │ ├── SpecilFirstScaleDemo.m
│ │ │ ├── FadeDemo.m
│ │ │ └── SpecilDemo.m
│ │ └── DemoPageControl.h
│ ├── 跑马灯
│ │ ├── DemoMarqueen.h
│ │ └── DemoMarqueen.m
│ └── 电商播报
│ │ ├── DemoDianshang.h
│ │ ├── KuaiBaoCell.h
│ │ ├── marqueCell.h
│ │ ├── KuaiBaoCell.m
│ │ ├── marqueCell.m
│ │ └── DemoDianshang.m
├── AppDelegate.h
├── main.m
├── SDWebImage
│ ├── SDWebImage
│ │ ├── Private
│ │ │ ├── SDInternalMacros.m
│ │ │ ├── SDImageGIFCoderInternal.h
│ │ │ ├── UIColor+HexString.h
│ │ │ ├── SDImageAPNGCoderInternal.h
│ │ │ ├── SDWeakProxy.h
│ │ │ ├── SDAsyncBlockOperation.h
│ │ │ ├── SDImageCachesManagerOperation.h
│ │ │ ├── NSBezierPath+RoundedCorners.h
│ │ │ ├── SDImageAssetManager.h
│ │ │ ├── UIColor+HexString.m
│ │ │ ├── SDInternalMacros.h
│ │ │ ├── SDAsyncBlockOperation.m
│ │ │ ├── SDWeakProxy.m
│ │ │ ├── NSBezierPath+RoundedCorners.m
│ │ │ └── SDImageCachesManagerOperation.m
│ │ └── Core
│ │ │ ├── SDWebImageError.m
│ │ │ ├── SDWebImageCompat.m
│ │ │ ├── SDWebImageOperation.h
│ │ │ ├── SDImageAPNGCoder.h
│ │ │ ├── UIImage+GIF.m
│ │ │ ├── SDImageCoder.m
│ │ │ ├── SDImageFrame.m
│ │ │ ├── UIImage+GIF.h
│ │ │ ├── SDAnimatedImageRep.h
│ │ │ ├── SDImageGIFCoder.h
│ │ │ ├── SDWebImageCacheKeyFilter.m
│ │ │ ├── SDWebImageCacheKeyFilter.h
│ │ │ ├── SDWebImageCacheSerializer.m
│ │ │ ├── SDWebImageDownloaderRequestModifier.m
│ │ │ ├── SDImageLoadersManager.h
│ │ │ ├── SDImageFrame.h
│ │ │ ├── SDWebImageCacheSerializer.h
│ │ │ ├── SDWebImageDownloaderRequestModifier.h
│ │ │ ├── SDImageIOCoder.h
│ │ │ ├── UIImage+MemoryCacheCost.h
│ │ │ ├── UIImage+ForceDecode.m
│ │ │ ├── SDImageGraphics.h
│ │ │ ├── UIImage+MemoryCacheCost.m
│ │ │ ├── UIImage+ForceDecode.h
│ │ │ ├── SDWebImageDownloaderConfig.m
│ │ │ ├── SDWebImageError.h
│ │ │ ├── SDWebImageOptionsProcessor.m
│ │ │ ├── UIView+WebCacheOperation.h
│ │ │ ├── NSData+ImageContentType.h
│ │ │ ├── UIImage+MultiFormat.m
│ │ │ ├── UIImage+Metadata.h
│ │ │ ├── SDImageCodersManager.h
│ │ │ ├── SDWebImageCompat.h
│ │ │ ├── SDImageCacheConfig.m
│ │ │ ├── SDWebImageOptionsProcessor.h
│ │ │ ├── NSImage+Compatibility.h
│ │ │ ├── SDMemoryCache.h
│ │ │ ├── SDImageCachesManager.h
│ │ │ ├── UIView+WebCacheOperation.m
│ │ │ ├── SDImageCacheDefine.m
│ │ │ ├── UIImage+MultiFormat.h
│ │ │ ├── NSImage+Compatibility.m
│ │ │ ├── UIImageView+WebCache.m
│ │ │ ├── UIImageView+HighlightedWebCache.m
│ │ │ ├── SDImageLoadersManager.m
│ │ │ ├── SDAnimatedImageRep.m
│ │ │ ├── SDAnimatedImageView.h
│ │ │ ├── SDWebImageIndicator.h
│ │ │ ├── SDImageGraphics.m
│ │ │ ├── SDAnimatedImageView+WebCache.m
│ │ │ ├── SDWebImageDownloaderConfig.h
│ │ │ ├── SDImageCodersManager.m
│ │ │ └── UIImage+Metadata.m
│ └── WebImage
│ │ └── SDWebImage.h
├── WMZBanner
│ ├── WMZBannerFlowLayout.h
│ ├── WMZBannerOverLayout.h
│ ├── WMZBannerFadeLayout.h
│ ├── WMZBannerControl.h
│ ├── WMZBannerView.h
│ ├── WMZBannerConfig.h
│ └── WMZBannerFadeLayout.m
├── Base.lproj
│ ├── Main.storyboard
│ └── LaunchScreen.storyboard
├── Info.plist
├── AppDelegate.m
└── ViewController.m
├── WMZBanner.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcuserdata
│ │ └── wmz.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── xcuserdata
│ └── wmz.xcuserdatad
│ ├── xcschemes
│ └── xcschememanagement.plist
│ └── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
├── WMZBannerTests
├── Info.plist
└── WMZBannerTests.m
├── WMZBannerUITests
├── Info.plist
└── WMZBannerUITests.m
├── WMZBanner.podspec
└── LICENSE
/WMZBanner/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP1.imageset/bannerP1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner/Assets.xcassets/bannerP1.imageset/bannerP1.png
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP2.imageset/bannerP2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner/Assets.xcassets/bannerP2.imageset/bannerP2.png
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP3.imageset/bannerP3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner/Assets.xcassets/bannerP3.imageset/bannerP3.png
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP4.imageset/bannerP4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner/Assets.xcassets/bannerP4.imageset/bannerP4.png
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/slidePoint.imageset/slidePoint@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner/Assets.xcassets/slidePoint.imageset/slidePoint@2x.png
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/slideCirclePoint.imageset/slideCirclePoint@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner/Assets.xcassets/slideCirclePoint.imageset/slideCirclePoint@2x.png
--------------------------------------------------------------------------------
/WMZBanner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/WMZBanner.xcodeproj/project.xcworkspace/xcuserdata/wmz.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wwmz/WMZBanner/HEAD/WMZBanner.xcodeproj/project.xcworkspace/xcuserdata/wmz.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/WMZBanner/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : UIViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/WMZBanner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/叠加样式/DemoAdd.h:
--------------------------------------------------------------------------------
1 | //
2 | // DemoAdd.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/17.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface DemoAdd : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/显示全部属性/demoOne.h:
--------------------------------------------------------------------------------
1 | //
2 | // demoOne.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/16.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface demoOne : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/卡片样式/DemoCard.h:
--------------------------------------------------------------------------------
1 | //
2 | // DemoCard.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/17.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface DemoCard : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/天猫样式/DemoTianMao.h:
--------------------------------------------------------------------------------
1 | //
2 | // DemoTianMao.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/16.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface DemoTianMao : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/正常样式/demoNormal.h:
--------------------------------------------------------------------------------
1 | //
2 | // demoNormal.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/16.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface demoNormal : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/特殊样式/FadeDemo.h:
--------------------------------------------------------------------------------
1 | //
2 | // FadeDemo.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2020/6/17.
6 | // Copyright © 2020 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface FadeDemo : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/跑马灯/DemoMarqueen.h:
--------------------------------------------------------------------------------
1 | //
2 | // DemoMarqueen.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/19.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface DemoMarqueen : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 |
16 | @end
17 |
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/电商播报/DemoDianshang.h:
--------------------------------------------------------------------------------
1 | //
2 | // DemoDianshang.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/19.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface DemoDianshang : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/特殊样式/SpecilDemo.h:
--------------------------------------------------------------------------------
1 | //
2 | // SpecilDemo.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2020/4/15.
6 | // Copyright © 2020 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface SpecilDemo : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/DemoPageControl.h:
--------------------------------------------------------------------------------
1 | //
2 | // DemoPageControl.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/19.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface DemoPageControl : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/特殊样式/SpecilFirstScaleDemo.h:
--------------------------------------------------------------------------------
1 | //
2 | // SpecilFirstScaleDemo.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2020/8/19.
6 | // Copyright © 2020 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface SpecilFirstScaleDemo : UIViewController
14 |
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/卡片样式/MyCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // MyCell.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | NS_ASSUME_NONNULL_BEGIN
11 |
12 | @interface MyCell : UICollectionViewCell
13 | @property(nonatomic,strong)UILabel *leftText;
14 | @property(nonatomic,strong)UIImageView *icon;
15 | @end
16 |
17 | NS_ASSUME_NONNULL_END
18 |
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "bannerP1.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "bannerP2.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "bannerP3.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/bannerP4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "bannerP4.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WMZBanner/Demo/电商播报/KuaiBaoCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // KuaiBaoCell.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/17.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface KuaiBaoCell : UICollectionViewCell
14 | @property(nonatomic,strong)UILabel *label;
15 | @property(nonatomic,strong)UILabel *detailBtn;
16 | @end
17 |
18 | NS_ASSUME_NONNULL_END
19 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/电商播报/marqueCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // marqueCell.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/17.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface marqueCell : UICollectionViewCell
14 | @property(nonatomic,strong)UILabel *label;
15 | @property(nonatomic,strong)UIButton *detailBtn;
16 | @end
17 |
18 | NS_ASSUME_NONNULL_END
19 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDInternalMacros.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDInternalMacros.h"
10 |
11 | void sd_executeCleanupBlock (__strong sd_cleanupBlock_t *block) {
12 | (*block)();
13 | }
14 |
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/slidePoint.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "filename" : "slidePoint@2x.png",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/slideCirclePoint.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "filename" : "slideCirclePoint@2x.png",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerFlowLayout.h:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerFlowLayout.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WMZBannerParam.h"
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface WMZBannerFlowLayout : UICollectionViewFlowLayout
14 | @property(nonatomic,strong)WMZBannerParam *param;
15 | - (instancetype)initConfigureWithModel:(WMZBannerParam *)param;
16 | @end
17 |
18 | NS_ASSUME_NONNULL_END
19 |
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerOverLayout.h:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerOverLayout.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/18.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WMZBannerParam.h"
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface WMZBannerOverLayout : UICollectionViewFlowLayout
14 | @property(nonatomic,strong)WMZBannerParam *param;
15 | - (instancetype)initConfigureWithModel:(WMZBannerParam *)param;
16 | @end
17 |
18 | NS_ASSUME_NONNULL_END
19 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDImageGIFCoderInternal.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 | #import "SDImageGIFCoder.h"
11 |
12 | @interface SDImageGIFCoder ()
13 |
14 | - (float)sd_frameDurationAtIndex:(NSUInteger)index source:(nonnull CGImageSourceRef)source;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerFadeLayout.h:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerFadeLayout.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2020/6/15.
6 | // Copyright © 2020 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WMZBannerParam.h"
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface WMZBannerFadeLayout : UICollectionViewFlowLayout
14 | @property(nonatomic,strong)WMZBannerParam *param;
15 | @property(nonatomic,assign)BOOL right;
16 | - (instancetype)initConfigureWithModel:(WMZBannerParam *)param;
17 | @end
18 |
19 | NS_ASSUME_NONNULL_END
20 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageError.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Jamie Pinkham
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageError.h"
11 |
12 | NSErrorDomain const _Nonnull SDWebImageErrorDomain = @"SDWebImageErrorDomain";
13 | NSErrorUserInfoKey const _Nonnull SDWebImageErrorDownloadStatusCodeKey = @"SDWebImageErrorDownloadStatusCodeKey";
14 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageCompat.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | #if !__has_feature(objc_arc)
12 | #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag
13 | #endif
14 |
15 | #if !OS_OBJECT_USE_OBJC
16 | #error SDWebImage need ARC for dispatch object
17 | #endif
18 |
--------------------------------------------------------------------------------
/WMZBanner.xcodeproj/xcuserdata/wmz.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | WMZBanner.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 | WMZBanner.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 0
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/UIColor+HexString.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | @interface UIColor (HexString)
12 |
13 | /**
14 | Convenience way to get hex string from color. The output should always be 32-bit RGBA hex string like `#00000000`.
15 | */
16 | @property (nonatomic, copy, readonly, nonnull) NSString *sd_hexString;
17 |
18 | @end
19 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDImageAPNGCoderInternal.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 | #import "SDImageAPNGCoder.h"
11 |
12 | @interface SDImageAPNGCoder ()
13 |
14 | - (float)sd_frameDurationAtIndex:(NSUInteger)index source:(nonnull CGImageSourceRef)source;
15 | - (NSUInteger)sd_imageLoopCountWithSource:(nonnull CGImageSourceRef)source;
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDWeakProxy.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | @interface SDWeakProxy : NSProxy
13 |
14 | @property (nonatomic, weak, readonly, nullable) id target;
15 |
16 | - (nonnull instancetype)initWithTarget:(nonnull id)target;
17 | + (nonnull instancetype)proxyWithTarget:(nonnull id)target;
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 |
11 | /// A protocol represents cancelable operation.
12 | @protocol SDWebImageOperation
13 |
14 | - (void)cancel;
15 |
16 | @end
17 |
18 | /// NSOperation conform to `SDWebImageOperation`.
19 | @interface NSOperation (SDWebImageOperation)
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDImageCoder.h"
11 |
12 | /**
13 | Built in coder using ImageIO that supports APNG encoding/decoding
14 | */
15 | @interface SDImageAPNGCoder : NSObject
16 |
17 | @property (nonatomic, class, readonly, nonnull) SDImageAPNGCoder *sharedCoder;
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+GIF.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Laurin Brandner
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "UIImage+GIF.h"
11 | #import "SDImageGIFCoder.h"
12 |
13 | @implementation UIImage (GIF)
14 |
15 | + (nullable UIImage *)sd_imageWithGIFData:(nullable NSData *)data {
16 | if (!data) {
17 | return nil;
18 | }
19 | return [[SDImageGIFCoder sharedCoder] decodedImageWithData:data options:0];
20 | }
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/天猫样式/TianMaoCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // TianMaoCell.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/16.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WMZBannerConfig.h"
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface TianMaoCell : UICollectionViewCell
14 | @property(nonatomic,strong)UIImageView *backImage;
15 | @property(nonatomic,strong)UILabel *topLa;
16 | @property(nonatomic,strong)UILabel *titleLa;
17 | @property(nonatomic,strong)UILabel *textLa;
18 | @property(nonatomic,strong)UILabel *typeLa;
19 | @property(nonatomic,strong)UIView *bottomView;
20 | @property(nonatomic,strong)UIButton *detailBtn;
21 | @end
22 |
23 | NS_ASSUME_NONNULL_END
24 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | @class SDAsyncBlockOperation;
12 | typedef void (^SDAsyncBlock)(SDAsyncBlockOperation * __nonnull asyncOperation);
13 |
14 | @interface SDAsyncBlockOperation : NSOperation
15 |
16 | - (nonnull instancetype)initWithBlock:(nonnull SDAsyncBlock)block;
17 | + (nonnull instancetype)blockOperationWithBlock:(nonnull SDAsyncBlock)block;
18 | - (void)complete;
19 |
20 | @end
21 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | // This is used for operation management, but not for operation queue execute
13 | @interface SDImageCachesManagerOperation : NSOperation
14 |
15 | @property (nonatomic, assign, readonly) NSUInteger pendingCount;
16 |
17 | - (void)beginWithTotalCount:(NSUInteger)totalCount;
18 | - (void)completeOne;
19 | - (void)done;
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageCoder.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageCoder.h"
10 |
11 | SDImageCoderOption const SDImageCoderDecodeFirstFrameOnly = @"decodeFirstFrameOnly";
12 | SDImageCoderOption const SDImageCoderDecodeScaleFactor = @"decodeScaleFactor";
13 |
14 | SDImageCoderOption const SDImageCoderEncodeFirstFrameOnly = @"encodeFirstFrameOnly";
15 | SDImageCoderOption const SDImageCoderEncodeCompressionQuality = @"encodeCompressionQuality";
16 |
17 | SDImageCoderOption const SDImageCoderWebImageContext = @"webImageContext";
18 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/NSBezierPath+RoundedCorners.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | #if SD_MAC
12 |
13 | #import "UIImage+Transform.h"
14 |
15 | @interface NSBezierPath (RoundedCorners)
16 |
17 | /**
18 | Convenience way to create a bezier path with the specify rounding corners on macOS. Same as the one on `UIBezierPath`.
19 | */
20 | + (nonnull instancetype)sd_bezierPathWithRoundedRect:(NSRect)rect byRoundingCorners:(SDRectCorner)corners cornerRadius:(CGFloat)cornerRadius;
21 |
22 | @end
23 |
24 | #endif
25 |
--------------------------------------------------------------------------------
/WMZBannerTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/WMZBannerUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageFrame.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageFrame.h"
10 |
11 | @interface SDImageFrame ()
12 |
13 | @property (nonatomic, strong, readwrite, nonnull) UIImage *image;
14 | @property (nonatomic, readwrite, assign) NSTimeInterval duration;
15 |
16 | @end
17 |
18 | @implementation SDImageFrame
19 |
20 | + (instancetype)frameWithImage:(UIImage *)image duration:(NSTimeInterval)duration {
21 | SDImageFrame *frame = [[SDImageFrame alloc] init];
22 | frame.image = image;
23 | frame.duration = duration;
24 |
25 | return frame;
26 | }
27 |
28 | @end
29 |
--------------------------------------------------------------------------------
/WMZBanner.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 |
3 | s.name = "WMZBanner"
4 | s.version = "1.2.0"
5 | s.platform = :ios, '8.0'
6 | s.license = "Copyright (c) 2018年 WMZ. All rights reserved."
7 | s.summary = "轻量级轮播图,支持自定义内容和自定义卡片样式,支持网络图片和本地图片混合使用"
8 | s.description = <<-DESC
9 | 轻量级
10 | DESC
11 | s.homepage = "https://github.com/wwmz/WMZBanner"
12 | s.license = {:type => "MIT", :file => "LICENSE" }
13 | s.author = { "wmz" => "925457662@qq.com" }
14 | s.source = { :git => "https://github.com/wwmz/WMZBanner.git",:tag => s.version.to_s}
15 | s.source_files = "WMZBanner/WMZBanner/**/*.{h,m}"
16 | s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }
17 | s.frameworks = 'UIKit','Foundation'
18 | s.dependency 'SDWebImage'
19 | end
20 |
21 |
22 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+GIF.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Laurin Brandner
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageCompat.h"
11 |
12 | /**
13 | This category is just use as a convenience method. For more detail control, use methods in `UIImage+MultiFormat.h` or directlly use `SDImageCoder`.
14 | */
15 | @interface UIImage (GIF)
16 |
17 | /**
18 | Creates an animated UIImage from an NSData.
19 | This will create animated image if the data is Animated GIF. And will create a static image is the data is Static GIF.
20 |
21 | @param data The GIF data
22 | @return The created image
23 | */
24 | + (nullable UIImage *)sd_imageWithGIFData:(nullable NSData *)data;
25 |
26 | @end
27 |
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerControl.h:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerControl.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WMZBannerParam.h"
11 | NS_ASSUME_NONNULL_BEGIN
12 | @interface WMZBannerControl : UIControl
13 | @property (nonatomic, strong) UIImage *currentImage;
14 | @property (nonatomic, strong) UIImage *inactiveImage;
15 | @property (nonatomic, assign) CGSize currentImageSize;
16 | @property (nonatomic, assign) CGSize inactiveImageSize;
17 | @property (nonatomic, assign) NSInteger numberOfPages;
18 | @property (nonatomic, assign) NSInteger currentPage;
19 | @property (nonatomic,strong) UIColor *currentPageIndicatorTintColor;
20 | @property (nonatomic,strong) UIColor *pageIndicatorTintColor;
21 | @property (nonatomic, strong) WMZBannerParam *param;
22 | - (instancetype)initWithFrame:(CGRect)frame WithModel:(WMZBannerParam *)param;
23 |
24 | @end
25 |
26 | NS_ASSUME_NONNULL_END
27 |
--------------------------------------------------------------------------------
/WMZBannerTests/WMZBannerTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerTests.m
3 | // WMZBannerTests
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface WMZBannerTests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation WMZBannerTests
16 |
17 | - (void)setUp {
18 | // Put setup code here. This method is called before the invocation of each test method in the class.
19 | }
20 |
21 | - (void)tearDown {
22 | // Put teardown code here. This method is called after the invocation of each test method in the class.
23 | }
24 |
25 | - (void)testExample {
26 | // This is an example of a functional test case.
27 | // Use XCTAssert and related functions to verify your tests produce the correct results.
28 | }
29 |
30 | - (void)testPerformanceExample {
31 | // This is an example of a performance test case.
32 | [self measureBlock:^{
33 | // Put the code you want to measure the time of here.
34 | }];
35 | }
36 |
37 | @end
38 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/电商播报/KuaiBaoCell.m:
--------------------------------------------------------------------------------
1 |
2 |
3 | //
4 | // KuaiBaoCell.m
5 | // WMZBanner
6 | //
7 | // Created by wmz on 2019/12/17.
8 | // Copyright © 2019 wmz. All rights reserved.
9 | //
10 |
11 | #import "KuaiBaoCell.h"
12 |
13 | @implementation KuaiBaoCell
14 | -(instancetype)initWithFrame:(CGRect)frame
15 | {
16 | self = [super initWithFrame:frame];
17 | if (self){
18 | self.contentView.backgroundColor = [UIColor whiteColor];
19 | self.label = [UILabel new];
20 | self.label.font = [UIFont systemFontOfSize:17.0];
21 | self.label.textColor = [UIColor redColor];
22 | [self.contentView addSubview:self.label];
23 | self.label.frame = CGRectMake(10, 10, frame.size.width*0.15, frame.size.height-20);
24 |
25 | self.detailBtn = [UILabel new];
26 | self.detailBtn.font = [UIFont systemFontOfSize:17.0];
27 | self.detailBtn.frame = CGRectMake(frame.size.width*0.15, 10, frame.size.width*0.85,frame.size.height-20);
28 | [self.contentView addSubview:self.detailBtn];
29 | }
30 | return self;
31 | }
32 | @end
33 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | #if SD_MAC
12 |
13 | /**
14 | A subclass of `NSBitmapImageRep` to fix that GIF loop count issue because `NSBitmapImageRep` will reset `NSImageCurrentFrameDuration` by using `kCGImagePropertyGIFDelayTime` but not `kCGImagePropertyGIFUnclampedDelayTime`.
15 | Built in GIF coder use this instead of `NSBitmapImageRep` for better GIF rendering. If you do not want this, only enable `SDImageIOCoder`, which just call `NSImage` API and actually use `NSBitmapImageRep` for GIF image.
16 | This also support APNG format using `SDImageAPNGCoder`. Which provide full alpha-channel support and the correct duration match the `kCGImagePropertyAPNGUnclampedDelayTime`.
17 | */
18 | @interface SDAnimatedImageRep : NSBitmapImageRep
19 |
20 | @end
21 |
22 | #endif
23 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDImageAssetManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | // Apple parse the Asset Catalog compiled file(`Assets.car`) by CoreUI.framework, however it's a private framework and there are no other ways to directly get the data. So we just process the normal bundle files :)
13 |
14 | @interface SDImageAssetManager : NSObject
15 |
16 | @property (nonatomic, strong, nonnull) NSMapTable *imageTable;
17 |
18 | + (nonnull instancetype)sharedAssetManager;
19 | - (nullable NSString *)getPathForName:(nonnull NSString *)name bundle:(nonnull NSBundle *)bundle preferredScale:(nonnull CGFloat *)scale;
20 | - (nullable UIImage *)imageForName:(nonnull NSString *)name;
21 | - (void)storeImage:(nonnull UIImage *)image forName:(nonnull NSString *)name;
22 |
23 | @end
24 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 WMZ
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDImageCoder.h"
11 |
12 | /**
13 | Built in coder using ImageIO that supports animated GIF encoding/decoding
14 | @note `SDImageIOCoder` supports GIF but only as static (will use the 1st frame).
15 | @note Use `SDImageGIFCoder` for fully animated GIFs. For `UIImageView`, it will produce animated `UIImage`(`NSImage` on macOS) for rendering. For `SDAnimatedImageView`, it will use `SDAnimatedImage` for rendering.
16 | @note The recommended approach for animated GIFs is using `SDAnimatedImage` with `SDAnimatedImageView`. It's more performant than `UIImageView` for GIF displaying(especially on memory usage)
17 | */
18 | @interface SDImageGIFCoder : NSObject
19 |
20 | @property (nonatomic, class, readonly, nonnull) SDImageGIFCoder *sharedCoder;
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCacheKeyFilter.h"
10 |
11 | @interface SDWebImageCacheKeyFilter ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageCacheKeyFilterBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageCacheKeyFilter
18 |
19 | - (instancetype)initWithBlock:(SDWebImageCacheKeyFilterBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)cacheKeyFilterWithBlock:(SDWebImageCacheKeyFilterBlock)block {
28 | SDWebImageCacheKeyFilter *cacheKeyFilter = [[SDWebImageCacheKeyFilter alloc] initWithBlock:block];
29 | return cacheKeyFilter;
30 | }
31 |
32 | - (NSString *)cacheKeyForURL:(NSURL *)url {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(url);
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/电商播报/marqueCell.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | //
7 | // marqueCell.m
8 | // WMZBanner
9 | //
10 | // Created by wmz on 2019/12/17.
11 | // Copyright © 2019 wmz. All rights reserved.
12 | //
13 |
14 | #import "marqueCell.h"
15 |
16 | @implementation marqueCell
17 | -(instancetype)initWithFrame:(CGRect)frame
18 | {
19 | self = [super initWithFrame:frame];
20 | if (self){
21 | self.contentView.backgroundColor = [UIColor whiteColor];
22 | self.label = [UILabel new];
23 | self.label.font = [UIFont systemFontOfSize:17.0];
24 | self.label.textColor = [UIColor blackColor];
25 | [self.contentView addSubview:self.label];
26 | self.label.frame = CGRectMake(10, 10, frame.size.width*0.7, frame.size.height-20);
27 |
28 | self.detailBtn = [UIButton buttonWithType:UIButtonTypeCustom];
29 | self.detailBtn.frame = CGRectMake(frame.size.width*0.7, 10, frame.size.width*0.3,frame.size.height-20);
30 | [self.contentView addSubview:self.detailBtn];
31 | [self.detailBtn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
32 | }
33 | return self;
34 | }
35 | @end
36 |
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerView.h:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerView.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import "WMZBannerParam.h"
10 | #import
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface WMZBannerView : UIView
14 | //背景图
15 | @property(strong,nonatomic)UIImageView *bgImgView;
16 |
17 | /**
18 | * 调用方法
19 | *
20 | */
21 | - (instancetype)initConfigureWithModel:(WMZBannerParam *)param withView:(UIView*)parentView;
22 |
23 | /**
24 | * 调用方法
25 | *
26 | */
27 | - (instancetype)initConfigureWithModel:(WMZBannerParam *)param;
28 | /**
29 | * 更新UI
30 | *
31 | */
32 | - (void)updateUI;
33 |
34 |
35 | /**
36 | * 手动调用滚动
37 | *
38 | */
39 | - (void)scrolToPath:(NSIndexPath*)path animated:(BOOL)animated;
40 |
41 | @end
42 |
43 | @interface Collectioncell : UICollectionViewCell
44 | @property(nonatomic,strong)UIImageView *icon;
45 | @property(nonatomic,strong)WMZBannerParam *param;
46 | @end
47 |
48 | @interface CollectionTextCell : UICollectionViewCell
49 | @property(nonatomic,strong)UILabel *label;
50 | @property(nonatomic,strong)WMZBannerParam *param;
51 | @end
52 |
53 | NS_ASSUME_NONNULL_END
54 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSString * _Nullable(^SDWebImageCacheKeyFilterBlock)(NSURL * _Nonnull url);
13 |
14 | /**
15 | This is the protocol for cache key filter.
16 | We can use a block to specify the cache key filter. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageCacheKeyFilter
19 |
20 | - (nullable NSString *)cacheKeyForURL:(nonnull NSURL *)url;
21 |
22 | @end
23 |
24 | /**
25 | A cache key filter class with block.
26 | */
27 | @interface SDWebImageCacheKeyFilter : NSObject
28 |
29 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block;
30 | + (nonnull instancetype)cacheKeyFilterWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block;
31 |
32 | @end
33 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCacheSerializer.h"
10 |
11 | @interface SDWebImageCacheSerializer ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageCacheSerializerBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageCacheSerializer
18 |
19 | - (instancetype)initWithBlock:(SDWebImageCacheSerializerBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)cacheSerializerWithBlock:(SDWebImageCacheSerializerBlock)block {
28 | SDWebImageCacheSerializer *cacheSerializer = [[SDWebImageCacheSerializer alloc] initWithBlock:block];
29 | return cacheSerializer;
30 | }
31 |
32 | - (NSData *)cacheDataWithImage:(UIImage *)image originalData:(NSData *)data imageURL:(nullable NSURL *)imageURL {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(image, data, imageURL);
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageDownloaderRequestModifier.h"
10 |
11 | @interface SDWebImageDownloaderRequestModifier ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageDownloaderRequestModifierBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageDownloaderRequestModifier
18 |
19 | - (instancetype)initWithBlock:(SDWebImageDownloaderRequestModifierBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)requestModifierWithBlock:(SDWebImageDownloaderRequestModifierBlock)block {
28 | SDWebImageDownloaderRequestModifier *requestModifier = [[SDWebImageDownloaderRequestModifier alloc] initWithBlock:block];
29 | return requestModifier;
30 | }
31 |
32 | - (NSURLRequest *)modifiedRequestWithRequest:(NSURLRequest *)request {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(request);
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/UIColor+HexString.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIColor+HexString.h"
10 |
11 | @implementation UIColor (HexString)
12 |
13 | - (NSString *)sd_hexString {
14 | CGFloat red, green, blue, alpha;
15 | #if SD_UIKIT
16 | if (![self getRed:&red green:&green blue:&blue alpha:&alpha]) {
17 | [self getWhite:&red alpha:&alpha];
18 | green = red;
19 | blue = red;
20 | }
21 | #else
22 | @try {
23 | [self getRed:&red green:&green blue:&blue alpha:&alpha];
24 | }
25 | @catch (NSException *exception) {
26 | [self getWhite:&red alpha:&alpha];
27 | green = red;
28 | blue = red;
29 | }
30 | #endif
31 |
32 | red = roundf(red * 255.f);
33 | green = roundf(green * 255.f);
34 | blue = roundf(blue * 255.f);
35 | alpha = roundf(alpha * 255.f);
36 |
37 | uint hex = ((uint)alpha << 24) | ((uint)red << 16) | ((uint)green << 8) | ((uint)blue);
38 |
39 | return [NSString stringWithFormat:@"#%08x", hex];
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/卡片样式/MyCell.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | //
6 | // MyCell.m
7 | // WMZBanner
8 | //
9 | // Created by wmz on 2019/9/6.
10 | // Copyright © 2019 wmz. All rights reserved.
11 | //
12 |
13 | #import "MyCell.h"
14 |
15 | @implementation MyCell
16 | -(instancetype)initWithFrame:(CGRect)frame
17 | {
18 | self = [super initWithFrame:frame];
19 | if (self){
20 | self.icon = [UIImageView new];
21 | self.icon.contentMode = UIViewContentModeScaleAspectFill;
22 | self.icon.layer.masksToBounds = YES;
23 | [self.contentView addSubview:self.icon];
24 | self.icon.frame = self.contentView.bounds;
25 | self.leftText = [UILabel new];
26 | self.leftText.backgroundColor = [UIColor lightGrayColor];
27 | self.leftText.alpha = 0.8;
28 | self.leftText.textColor = [UIColor whiteColor];
29 | self.leftText.numberOfLines = 1;
30 | self.leftText.textAlignment = NSTextAlignmentCenter;
31 | [self.icon addSubview:self.leftText];
32 |
33 | self.leftText.frame = CGRectMake(0, self.contentView.frame.size.height-35, self.contentView.frame.size.width, 35);
34 | self.contentView.layer.masksToBounds = YES;
35 | self.contentView.layer.cornerRadius = 8;
36 |
37 | }
38 | return self;
39 | }
40 | @end
41 |
--------------------------------------------------------------------------------
/WMZBannerUITests/WMZBannerUITests.m:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerUITests.m
3 | // WMZBannerUITests
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface WMZBannerUITests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation WMZBannerUITests
16 |
17 | - (void)setUp {
18 | // Put setup code here. This method is called before the invocation of each test method in the class.
19 |
20 | // In UI tests it is usually best to stop immediately when a failure occurs.
21 | self.continueAfterFailure = NO;
22 |
23 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
24 | [[[XCUIApplication alloc] init] launch];
25 |
26 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
27 | }
28 |
29 | - (void)tearDown {
30 | // Put teardown code here. This method is called after the invocation of each test method in the class.
31 | }
32 |
33 | - (void)testExample {
34 | // Use recording to get started writing UI tests.
35 | // Use XCTAssert and related functions to verify your tests produce the correct results.
36 | }
37 |
38 | @end
39 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageLoader.h"
10 |
11 | /**
12 | A loaders manager to manage multiple loaders
13 | */
14 | @interface SDImageLoadersManager : NSObject
15 |
16 | /**
17 | Returns the global shared loaders manager instance. By default we will set [`SDWebImageDownloader.sharedDownloader`] into the loaders array.
18 | */
19 | @property (nonatomic, class, readonly, nonnull) SDImageLoadersManager *sharedManager;
20 |
21 | /**
22 | All image loaders in manager. The loaders array is a priority queue, which means the later added loader will have the highest priority
23 | */
24 | @property (nonatomic, copy, nullable) NSArray>* loaders;
25 |
26 | /**
27 | Add a new image loader to the end of loaders array. Which has the highest priority.
28 |
29 | @param loader loader
30 | */
31 | - (void)addLoader:(nonnull id)loader;
32 |
33 | /**
34 | Remove a image loader in the loaders array.
35 |
36 | @param loader loader
37 | */
38 | - (void)removeLoader:(nonnull id)loader;
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageFrame.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | /**
13 | This class is used for creating animated images via `animatedImageWithFrames` in `SDImageCoderHelper`.
14 | @note If you need to specify animated images loop count, use `sd_imageLoopCount` property in `UIImage+Metadata.h`.
15 | */
16 | @interface SDImageFrame : NSObject
17 |
18 | /**
19 | The image of current frame. You should not set an animated image.
20 | */
21 | @property (nonatomic, strong, readonly, nonnull) UIImage *image;
22 | /**
23 | The duration of current frame to be displayed. The number is seconds but not milliseconds. You should not set this to zero.
24 | */
25 | @property (nonatomic, readonly, assign) NSTimeInterval duration;
26 |
27 | /**
28 | Create a frame instance with specify image and duration
29 |
30 | @param image current frame's image
31 | @param duration current frame's duration
32 | @return frame instance
33 | */
34 | + (instancetype _Nonnull)frameWithImage:(UIImage * _Nonnull)image duration:(NSTimeInterval)duration;
35 |
36 | @end
37 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSData * _Nullable(^SDWebImageCacheSerializerBlock)(UIImage * _Nonnull image, NSData * _Nullable data, NSURL * _Nullable imageURL);
13 |
14 | /**
15 | This is the protocol for cache serializer.
16 | We can use a block to specify the cache serializer. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageCacheSerializer
19 |
20 | - (nullable NSData *)cacheDataWithImage:(nonnull UIImage *)image originalData:(nullable NSData *)data imageURL:(nullable NSURL *)imageURL;
21 |
22 | @end
23 |
24 | /**
25 | A cache serializer class with block.
26 | */
27 | @interface SDWebImageCacheSerializer : NSObject
28 |
29 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
30 | + (nonnull instancetype)cacheSerializerWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
31 |
32 | @end
33 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBlock)(NSURLRequest * _Nonnull request);
13 |
14 | /**
15 | This is the protocol for downloader request modifier.
16 | We can use a block to specify the downloader request modifier. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageDownloaderRequestModifier
19 |
20 | - (nullable NSURLRequest *)modifiedRequestWithRequest:(nonnull NSURLRequest *)request;
21 |
22 | @end
23 |
24 | /**
25 | A downloader request modifier class with block.
26 | */
27 | @interface SDWebImageDownloaderRequestModifier : NSObject
28 |
29 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
30 | + (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
31 |
32 | @end
33 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageIOCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDImageCoder.h"
11 |
12 | /**
13 | Built in coder that supports PNG, JPEG, TIFF, includes support for progressive decoding.
14 |
15 | GIF
16 | Also supports static GIF (meaning will only handle the 1st frame).
17 | For a full GIF support, we recommend `SDAnimatedImageView` to keep both CPU and memory balanced.
18 |
19 | HEIC
20 | This coder also supports HEIC format because ImageIO supports it natively. But it depends on the system capabilities, so it won't work on all devices, see: https://devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/511_working_with_heif_and_hevc.pdf
21 | Decode(Software): !Simulator && (iOS 11 || tvOS 11 || macOS 10.13)
22 | Decode(Hardware): !Simulator && ((iOS 11 && A9Chip) || (macOS 10.13 && 6thGenerationIntelCPU))
23 | Encode(Software): macOS 10.13
24 | Encode(Hardware): !Simulator && ((iOS 11 && A10FusionChip) || (macOS 10.13 && 6thGenerationIntelCPU))
25 | */
26 | @interface SDImageIOCoder : NSObject
27 |
28 | @property (nonatomic, class, readonly, nonnull) SDImageIOCoder *sharedCoder;
29 |
30 | @end
31 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | /**
12 | UIImage category for memory cache cost.
13 | */
14 | @interface UIImage (MemoryCacheCost)
15 |
16 | /**
17 | The memory cache cost for specify image used by image cache. The cost function is the bytes size held in memory.
18 | If you set some associated object to `UIImage`, you can set the custom value to indicate the memory cost.
19 |
20 | For `UIImage`, this method return the single frame bytes size when `image.images` is nil for static image. Retuen full frame bytes size when `image.images` is not nil for animated image.
21 | For `NSImage`, this method return the single frame bytes size because `NSImage` does not store all frames in memory.
22 | @note Note that because of the limitations of category this property can get out of sync if you create another instance with CGImage or other methods.
23 | @note For custom animated class conforms to `SDAnimatedImage`, you can override this getter method in your subclass to return a more proper value instead, which representing the current frame's total bytes.
24 | */
25 | @property (assign, nonatomic) NSUInteger sd_memoryCost;
26 |
27 | @end
28 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIImage+ForceDecode.h"
10 | #import "SDImageCoderHelper.h"
11 | #import "objc/runtime.h"
12 |
13 | @implementation UIImage (ForceDecode)
14 |
15 | - (BOOL)sd_isDecoded {
16 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_isDecoded));
17 | return value.boolValue;
18 | }
19 |
20 | - (void)setSd_isDecoded:(BOOL)sd_isDecoded {
21 | objc_setAssociatedObject(self, @selector(sd_isDecoded), @(sd_isDecoded), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
22 | }
23 |
24 | + (nullable UIImage *)sd_decodedImageWithImage:(nullable UIImage *)image {
25 | if (!image) {
26 | return nil;
27 | }
28 | return [SDImageCoderHelper decodedImageWithImage:image];
29 | }
30 |
31 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image {
32 | return [self sd_decodedAndScaledDownImageWithImage:image limitBytes:0];
33 | }
34 |
35 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image limitBytes:(NSUInteger)bytes {
36 | if (!image) {
37 | return nil;
38 | }
39 | return [SDImageCoderHelper decodedAndScaledDownImageWithImage:image limitBytes:bytes];
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageGraphics.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 | #import
11 |
12 | /**
13 | These following graphics context method are provided to easily write cross-platform(AppKit/UIKit) code.
14 | For UIKit, these methods just call the same method in `UIGraphics.h`. See the documentation for usage.
15 | For AppKit, these methods use `NSGraphicsContext` to create image context and match the behavior like UIKit.
16 | */
17 |
18 | /// Returns the current graphics context.
19 | FOUNDATION_EXPORT CGContextRef __nullable SDGraphicsGetCurrentContext(void) CF_RETURNS_NOT_RETAINED;
20 | /// Creates a bitmap-based graphics context and makes it the current context.
21 | FOUNDATION_EXPORT void SDGraphicsBeginImageContext(CGSize size);
22 | /// Creates a bitmap-based graphics context with the specified options.
23 | FOUNDATION_EXPORT void SDGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
24 | /// Removes the current bitmap-based graphics context from the top of the stack.
25 | FOUNDATION_EXPORT void SDGraphicsEndImageContext(void);
26 | /// Returns an image based on the contents of the current bitmap-based graphics context.
27 | FOUNDATION_EXPORT UIImage * __nullable SDGraphicsGetImageFromCurrentImageContext(void);
28 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIImage+MemoryCacheCost.h"
10 | #import "objc/runtime.h"
11 | #import "NSImage+Compatibility.h"
12 |
13 | FOUNDATION_STATIC_INLINE NSUInteger SDMemoryCacheCostForImage(UIImage *image) {
14 | CGImageRef imageRef = image.CGImage;
15 | if (!imageRef) {
16 | return 0;
17 | }
18 | NSUInteger bytesPerFrame = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef);
19 | NSUInteger frameCount;
20 | #if SD_MAC
21 | frameCount = 1;
22 | #elif SD_UIKIT || SD_WATCH
23 | frameCount = image.images.count > 0 ? image.images.count : 1;
24 | #endif
25 | NSUInteger cost = bytesPerFrame * frameCount;
26 | return cost;
27 | }
28 |
29 | @implementation UIImage (MemoryCacheCost)
30 |
31 | - (NSUInteger)sd_memoryCost {
32 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_memoryCost));
33 | NSUInteger memoryCost;
34 | if (value != nil) {
35 | memoryCost = [value unsignedIntegerValue];
36 | } else {
37 | memoryCost = SDMemoryCacheCostForImage(self);
38 | }
39 | return memoryCost;
40 | }
41 |
42 | - (void)setSd_memoryCost:(NSUInteger)sd_memoryCost {
43 | objc_setAssociatedObject(self, @selector(sd_memoryCost), @(sd_memoryCost), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
44 | }
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/特殊样式/SpecilFirstScaleDemo.m:
--------------------------------------------------------------------------------
1 | //
2 | // SpecilFirstScaleDemo.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2020/8/19.
6 | // Copyright © 2020 wmz. All rights reserved.
7 | //
8 |
9 | #import "SpecilFirstScaleDemo.h"
10 | #import "WMZBannerView.h"
11 | @interface SpecilFirstScaleDemo ()
12 |
13 | @end
14 |
15 | @implementation SpecilFirstScaleDemo
16 |
17 | - (void)viewDidLoad {
18 | [super viewDidLoad];
19 | self.view.backgroundColor = [UIColor whiteColor];
20 | [self styleOne];
21 | }
22 |
23 |
24 | - (void)styleOne{
25 | WMZBannerParam *param = BannerParam()
26 | .wFrameSet(CGRectMake(10,100, BannerWitdh-20, BannerHeight*0.25))
27 | .wItemSizeSet(CGSizeMake((BannerWitdh-50)/3, BannerHeight*0.18))
28 | .wDataSet([self getData])
29 | .wScaleSet(YES)
30 | .wLineSpacingSet(10)
31 | .wRepeatSet(YES)
32 | .wHideBannerControlSet(YES)
33 | .wSpecialStyleSet(SpecialStyleFirstScale);
34 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
35 | [self.view addSubview:viewOne];
36 | }
37 |
38 | - (NSArray*)getData{
39 | return @[
40 | @"http://f.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=64fdb384ce5c1038242bc6c68721bf25/060828381f30e92435342faf44086e061c95f798.jpg",
41 | @"http://dmimg.5054399.com/allimg/optuji/qbanop/38.jpg",
42 | @"http://img4.imgtn.bdimg.com/it/u=3778233232,2537963140&fm=26&gp=0.jpg",
43 | @"http://gss0.baidu.com/-4o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/09fa513d269759ee1100528cb2fb43166d22df20.jpg"
44 |
45 | ];
46 | }
47 |
48 |
49 | @end
50 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | /**
12 | UIImage category about force decode feature (avoid Image/IO's lazy decoding during rendering behavior).
13 | */
14 | @interface UIImage (ForceDecode)
15 |
16 | /**
17 | A bool value indicating whether the image has already been decoded. This can help to avoid extra force decode.
18 | */
19 | @property (nonatomic, assign) BOOL sd_isDecoded;
20 |
21 | /**
22 | Decode the provided image. This is useful if you want to force decode the image before rendering to improve performance.
23 |
24 | @param image The image to be decoded
25 | @return The decoded image
26 | */
27 | + (nullable UIImage *)sd_decodedImageWithImage:(nullable UIImage *)image;
28 |
29 | /**
30 | Decode and scale down the provided image
31 |
32 | @param image The image to be decoded
33 | @return The decoded and scaled down image
34 | */
35 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image;
36 |
37 | /**
38 | Decode and scale down the provided image with limit bytes
39 |
40 | @param image The image to be decoded
41 | @param bytes The limit bytes size. Provide 0 to use the build-in limit.
42 | @return The decoded and scaled down image
43 | */
44 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image limitBytes:(NSUInteger)bytes;
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/WMZBanner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageDownloaderConfig.h"
10 |
11 | static SDWebImageDownloaderConfig * _defaultDownloaderConfig;
12 |
13 | @implementation SDWebImageDownloaderConfig
14 |
15 | + (SDWebImageDownloaderConfig *)defaultDownloaderConfig {
16 | static dispatch_once_t onceToken;
17 | dispatch_once(&onceToken, ^{
18 | _defaultDownloaderConfig = [SDWebImageDownloaderConfig new];
19 | });
20 | return _defaultDownloaderConfig;
21 | }
22 |
23 | - (instancetype)init {
24 | self = [super init];
25 | if (self) {
26 | _maxConcurrentDownloads = 6;
27 | _downloadTimeout = 15.0;
28 | _executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
29 | }
30 | return self;
31 | }
32 |
33 | - (id)copyWithZone:(NSZone *)zone {
34 | SDWebImageDownloaderConfig *config = [[[self class] allocWithZone:zone] init];
35 | config.maxConcurrentDownloads = self.maxConcurrentDownloads;
36 | config.downloadTimeout = self.downloadTimeout;
37 | config.minimumProgressInterval = self.minimumProgressInterval;
38 | config.sessionConfiguration = [self.sessionConfiguration copyWithZone:zone];
39 | config.operationClass = self.operationClass;
40 | config.executionOrder = self.executionOrder;
41 | config.urlCredential = self.urlCredential;
42 | config.username = self.username;
43 | config.password = self.password;
44 |
45 | return config;
46 | }
47 |
48 |
49 | @end
50 |
--------------------------------------------------------------------------------
/WMZBanner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageError.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Jamie Pinkham
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageCompat.h"
11 |
12 | FOUNDATION_EXPORT NSErrorDomain const _Nonnull SDWebImageErrorDomain;
13 |
14 | /// The HTTP status code for invalid download response (NSNumber *)
15 | FOUNDATION_EXPORT NSErrorUserInfoKey const _Nonnull SDWebImageErrorDownloadStatusCodeKey;
16 |
17 | /// SDWebImage error domain and codes
18 | typedef NS_ERROR_ENUM(SDWebImageErrorDomain, SDWebImageError) {
19 | SDWebImageErrorInvalidURL = 1000, // The URL is invalid, such as nil URL or corrupted URL
20 | SDWebImageErrorBadImageData = 1001, // The image data can not be decoded to image, or the image data is empty
21 | SDWebImageErrorCacheNotModified = 1002, // The remote location specify that the cached image is not modified, such as the HTTP response 304 code. It's useful for `SDWebImageRefreshCached`
22 | SDWebImageErrorInvalidDownloadOperation = 2000, // The image download operation is invalid, such as nil operation or unexpected error occur when operation initialized
23 | SDWebImageErrorInvalidDownloadStatusCode = 2001, // The image download response a invalid status code. You can check the status code in error's userInfo under `SDWebImageErrorDownloadStatusCodeKey`
24 | SDWebImageErrorCancelled = 2002, // The image loading operation is cancelled before finished, during either async disk cache query, or waiting before actual network request. For actual network request error, check `NSURLErrorDomain` error domain and code.
25 | };
26 |
--------------------------------------------------------------------------------
/WMZBanner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | NSAppTransportSecurity
22 |
23 | NSAllowsArbitraryLoads
24 |
25 |
26 | LSRequiresIPhoneOS
27 |
28 | UILaunchStoryboardName
29 | LaunchScreen
30 | UIMainStoryboardFile
31 | Main
32 | UIRequiredDeviceCapabilities
33 |
34 | armv7
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UISupportedInterfaceOrientations~ipad
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationPortraitUpsideDown
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageOptionsProcessor.h"
10 |
11 | @interface SDWebImageOptionsResult ()
12 |
13 | @property (nonatomic, assign) SDWebImageOptions options;
14 | @property (nonatomic, copy, nullable) SDWebImageContext *context;
15 |
16 | @end
17 |
18 | @implementation SDWebImageOptionsResult
19 |
20 | - (instancetype)initWithOptions:(SDWebImageOptions)options context:(SDWebImageContext *)context {
21 | self = [super init];
22 | if (self) {
23 | self.options = options;
24 | self.context = context;
25 | }
26 | return self;
27 | }
28 |
29 | @end
30 |
31 | @interface SDWebImageOptionsProcessor ()
32 |
33 | @property (nonatomic, copy, nonnull) SDWebImageOptionsProcessorBlock block;
34 |
35 | @end
36 |
37 | @implementation SDWebImageOptionsProcessor
38 |
39 | - (instancetype)initWithBlock:(SDWebImageOptionsProcessorBlock)block {
40 | self = [super init];
41 | if (self) {
42 | self.block = block;
43 | }
44 | return self;
45 | }
46 |
47 | + (instancetype)optionsProcessorWithBlock:(SDWebImageOptionsProcessorBlock)block {
48 | SDWebImageOptionsProcessor *optionsProcessor = [[SDWebImageOptionsProcessor alloc] initWithBlock:block];
49 | return optionsProcessor;
50 | }
51 |
52 | - (SDWebImageOptionsResult *)processedResultForURL:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context {
53 | if (!self.block) {
54 | return nil;
55 | }
56 | return self.block(url, options, context);
57 | }
58 |
59 | @end
60 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 | #import "SDWebImageOperation.h"
11 |
12 | /**
13 | These methods are used to support canceling for UIView image loading, it's designed to be used internal but not external.
14 | All the stored operations are weak, so it will be dalloced after image loading finished. If you need to store operations, use your own class to keep a strong reference for them.
15 | */
16 | @interface UIView (WebCacheOperation)
17 |
18 | /**
19 | * Get the image load operation for key
20 | *
21 | * @param key key for identifying the operations
22 | * @return the image load operation
23 | */
24 | - (nullable id)sd_imageLoadOperationForKey:(nullable NSString *)key;
25 |
26 | /**
27 | * Set the image load operation (storage in a UIView based weak map table)
28 | *
29 | * @param operation the operation
30 | * @param key key for storing the operation
31 | */
32 | - (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key;
33 |
34 | /**
35 | * Cancel all operations for the current UIView and key
36 | *
37 | * @param key key for identifying the operations
38 | */
39 | - (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key;
40 |
41 | /**
42 | * Just remove the operations corresponding to the current UIView and key without cancelling them
43 | *
44 | * @param key key for identifying the operations
45 | */
46 | - (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key;
47 |
48 | @end
49 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDInternalMacros.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDmetamacros.h"
11 |
12 | #ifndef SD_LOCK
13 | #define SD_LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
14 | #endif
15 |
16 | #ifndef SD_UNLOCK
17 | #define SD_UNLOCK(lock) dispatch_semaphore_signal(lock);
18 | #endif
19 |
20 | #ifndef SD_OPTIONS_CONTAINS
21 | #define SD_OPTIONS_CONTAINS(options, value) (((options) & (value)) == (value))
22 | #endif
23 |
24 | #ifndef weakify
25 | #define weakify(...) \
26 | sd_keywordify \
27 | metamacro_foreach_cxt(sd_weakify_,, __weak, __VA_ARGS__)
28 | #endif
29 |
30 | #ifndef strongify
31 | #define strongify(...) \
32 | sd_keywordify \
33 | _Pragma("clang diagnostic push") \
34 | _Pragma("clang diagnostic ignored \"-Wshadow\"") \
35 | metamacro_foreach(sd_strongify_,, __VA_ARGS__) \
36 | _Pragma("clang diagnostic pop")
37 | #endif
38 |
39 | #define sd_weakify_(INDEX, CONTEXT, VAR) \
40 | CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR);
41 |
42 | #define sd_strongify_(INDEX, VAR) \
43 | __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_);
44 |
45 | #if DEBUG
46 | #define sd_keywordify autoreleasepool {}
47 | #else
48 | #define sd_keywordify try {} @catch (...) {}
49 | #endif
50 |
51 | #ifndef onExit
52 | #define onExit \
53 | sd_keywordify \
54 | __strong sd_cleanupBlock_t metamacro_concat(sd_exitBlock_, __LINE__) __attribute__((cleanup(sd_executeCleanupBlock), unused)) = ^
55 | #endif
56 |
57 | typedef void (^sd_cleanupBlock_t)(void);
58 |
59 | #if defined(__cplusplus)
60 | extern "C" {
61 | #endif
62 | void sd_executeCleanupBlock (__strong sd_cleanupBlock_t *block);
63 | #if defined(__cplusplus)
64 | }
65 | #endif
66 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDAsyncBlockOperation.h"
10 |
11 | @interface SDAsyncBlockOperation ()
12 |
13 | @property (assign, nonatomic, getter = isExecuting) BOOL executing;
14 | @property (assign, nonatomic, getter = isFinished) BOOL finished;
15 | @property (nonatomic, copy, nonnull) SDAsyncBlock executionBlock;
16 |
17 | @end
18 |
19 | @implementation SDAsyncBlockOperation
20 |
21 | @synthesize executing = _executing;
22 | @synthesize finished = _finished;
23 |
24 | - (nonnull instancetype)initWithBlock:(nonnull SDAsyncBlock)block {
25 | self = [super init];
26 | if (self) {
27 | self.executionBlock = block;
28 | }
29 | return self;
30 | }
31 |
32 | + (nonnull instancetype)blockOperationWithBlock:(nonnull SDAsyncBlock)block {
33 | SDAsyncBlockOperation *operation = [[SDAsyncBlockOperation alloc] initWithBlock:block];
34 | return operation;
35 | }
36 |
37 | - (void)start {
38 | if (self.isCancelled) {
39 | return;
40 | }
41 |
42 | [self willChangeValueForKey:@"isExecuting"];
43 | self.executing = YES;
44 | [self didChangeValueForKey:@"isExecuting"];
45 |
46 | if (self.executionBlock) {
47 | self.executionBlock(self);
48 | } else {
49 | [self complete];
50 | }
51 | }
52 |
53 | - (void)cancel {
54 | [super cancel];
55 | [self complete];
56 | }
57 |
58 | - (void)complete {
59 | [self willChangeValueForKey:@"isExecuting"];
60 | [self willChangeValueForKey:@"isFinished"];
61 | self.executing = NO;
62 | self.finished = YES;
63 | [self didChangeValueForKey:@"isExecuting"];
64 | [self didChangeValueForKey:@"isFinished"];
65 | }
66 |
67 | @end
68 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDWeakProxy.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWeakProxy.h"
10 |
11 | @implementation SDWeakProxy
12 |
13 | - (instancetype)initWithTarget:(id)target {
14 | _target = target;
15 | return self;
16 | }
17 |
18 | + (instancetype)proxyWithTarget:(id)target {
19 | return [[SDWeakProxy alloc] initWithTarget:target];
20 | }
21 |
22 | - (id)forwardingTargetForSelector:(SEL)selector {
23 | return _target;
24 | }
25 |
26 | - (void)forwardInvocation:(NSInvocation *)invocation {
27 | void *null = NULL;
28 | [invocation setReturnValue:&null];
29 | }
30 |
31 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
32 | return [NSObject instanceMethodSignatureForSelector:@selector(init)];
33 | }
34 |
35 | - (BOOL)respondsToSelector:(SEL)aSelector {
36 | return [_target respondsToSelector:aSelector];
37 | }
38 |
39 | - (BOOL)isEqual:(id)object {
40 | return [_target isEqual:object];
41 | }
42 |
43 | - (NSUInteger)hash {
44 | return [_target hash];
45 | }
46 |
47 | - (Class)superclass {
48 | return [_target superclass];
49 | }
50 |
51 | - (Class)class {
52 | return [_target class];
53 | }
54 |
55 | - (BOOL)isKindOfClass:(Class)aClass {
56 | return [_target isKindOfClass:aClass];
57 | }
58 |
59 | - (BOOL)isMemberOfClass:(Class)aClass {
60 | return [_target isMemberOfClass:aClass];
61 | }
62 |
63 | - (BOOL)conformsToProtocol:(Protocol *)aProtocol {
64 | return [_target conformsToProtocol:aProtocol];
65 | }
66 |
67 | - (BOOL)isProxy {
68 | return YES;
69 | }
70 |
71 | - (NSString *)description {
72 | return [_target description];
73 | }
74 |
75 | - (NSString *)debugDescription {
76 | return [_target debugDescription];
77 | }
78 |
79 | @end
80 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/NSBezierPath+RoundedCorners.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "NSBezierPath+RoundedCorners.h"
10 |
11 | #if SD_MAC
12 |
13 | @implementation NSBezierPath (RoundedCorners)
14 |
15 | + (instancetype)sd_bezierPathWithRoundedRect:(NSRect)rect byRoundingCorners:(SDRectCorner)corners cornerRadius:(CGFloat)cornerRadius {
16 | NSBezierPath *path = [NSBezierPath bezierPath];
17 |
18 | CGFloat maxCorner = MIN(NSWidth(rect), NSHeight(rect)) / 2;
19 |
20 | CGFloat topLeftRadius = MIN(maxCorner, (corners & SDRectCornerTopLeft) ? cornerRadius : 0);
21 | CGFloat topRightRadius = MIN(maxCorner, (corners & SDRectCornerTopRight) ? cornerRadius : 0);
22 | CGFloat bottomLeftRadius = MIN(maxCorner, (corners & SDRectCornerBottomLeft) ? cornerRadius : 0);
23 | CGFloat bottomRightRadius = MIN(maxCorner, (corners & SDRectCornerBottomRight) ? cornerRadius : 0);
24 |
25 | NSPoint topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect));
26 | NSPoint topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect));
27 | NSPoint bottomLeft = NSMakePoint(NSMinX(rect), NSMinY(rect));
28 | NSPoint bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect));
29 |
30 | [path moveToPoint:NSMakePoint(NSMidX(rect), NSMaxY(rect))];
31 | [path appendBezierPathWithArcFromPoint:topLeft toPoint:bottomLeft radius:topLeftRadius];
32 | [path appendBezierPathWithArcFromPoint:bottomLeft toPoint:bottomRight radius:bottomLeftRadius];
33 | [path appendBezierPathWithArcFromPoint:bottomRight toPoint:topRight radius:bottomRightRadius];
34 | [path appendBezierPathWithArcFromPoint:topRight toPoint:topLeft radius:topRightRadius];
35 | [path closePath];
36 |
37 | return path;
38 | }
39 |
40 | @end
41 |
42 | #endif
43 |
--------------------------------------------------------------------------------
/WMZBanner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/特殊样式/FadeDemo.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | //
8 | // FadeDemo.m
9 | // WMZBanner
10 | //
11 | // Created by wmz on 2020/6/17.
12 | // Copyright © 2020 wmz. All rights reserved.
13 | //
14 |
15 | #import "FadeDemo.h"
16 | #import "WMZBannerView.h"
17 | @interface FadeDemo ()
18 |
19 | @end
20 |
21 | @implementation FadeDemo
22 |
23 | - (void)viewDidLoad {
24 | [super viewDidLoad];
25 | self.view.backgroundColor = [UIColor whiteColor];
26 | [self styleOne];
27 | [self styleTwo];
28 | }
29 |
30 |
31 | - (void)styleOne{
32 | WMZBannerParam *param = BannerParam()
33 | .wFrameSet(CGRectMake(10,100, BannerWitdh-20, BannerHeight*0.25))
34 | .wItemSizeSet(CGSizeMake(BannerWitdh-20, BannerHeight*0.25))
35 | .wDataSet([self getData])
36 | //淡入淡出
37 | .wFadeOpenSet(YES)
38 | .wAutoScrollSet(YES)
39 | .wRepeatSet(YES)
40 | .wAutoScrollSecondSet(1.5)
41 | ;
42 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
43 | [self.view addSubview:viewOne];
44 | }
45 |
46 | - (void)styleTwo{
47 | WMZBannerParam *param = BannerParam()
48 | .wFrameSet(CGRectMake(10,BannerHeight*0.25+150, BannerWitdh-20, BannerHeight*0.25))
49 | .wItemSizeSet(CGSizeMake(BannerWitdh-30, BannerHeight*0.25))
50 | .wDataSet([self getData])
51 | .wLineSpacingSet(5)
52 | .wHideBannerControlSet(YES)
53 | //淡入淡出
54 | .wFadeOpenSet(YES)
55 | //纵向
56 | .wVerticalSet(YES);
57 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
58 | [self.view addSubview:viewOne];
59 | }
60 |
61 | - (NSArray*)getData{
62 | return @[
63 | @"http://f.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=64fdb384ce5c1038242bc6c68721bf25/060828381f30e92435342faf44086e061c95f798.jpg",
64 | @"http://dmimg.5054399.com/allimg/optuji/qbanop/38.jpg",
65 | @"http://img4.imgtn.bdimg.com/it/u=3778233232,2537963140&fm=26&gp=0.jpg",
66 | @"http://gss0.baidu.com/-4o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/09fa513d269759ee1100528cb2fb43166d22df20.jpg"
67 |
68 | ];
69 | }
70 |
71 | @end
72 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Fabrice Aneche
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 | #import "SDWebImageCompat.h"
12 |
13 | /**
14 | You can use switch case like normal enum. It's also recommended to add a default case. You should not assume anything about the raw value.
15 | For custom coder plugin, it can also extern the enum for supported format. See `SDImageCoder` for more detailed information.
16 | */
17 | typedef NSInteger SDImageFormat NS_TYPED_EXTENSIBLE_ENUM;
18 | static const SDImageFormat SDImageFormatUndefined = -1;
19 | static const SDImageFormat SDImageFormatJPEG = 0;
20 | static const SDImageFormat SDImageFormatPNG = 1;
21 | static const SDImageFormat SDImageFormatGIF = 2;
22 | static const SDImageFormat SDImageFormatTIFF = 3;
23 | static const SDImageFormat SDImageFormatWebP = 4;
24 | static const SDImageFormat SDImageFormatHEIC = 5;
25 | static const SDImageFormat SDImageFormatHEIF = 6;
26 |
27 | /**
28 | NSData category about the image content type and UTI.
29 | */
30 | @interface NSData (ImageContentType)
31 |
32 | /**
33 | * Return image format
34 | *
35 | * @param data the input image data
36 | *
37 | * @return the image format as `SDImageFormat` (enum)
38 | */
39 | + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
40 |
41 | /**
42 | * Convert SDImageFormat to UTType
43 | *
44 | * @param format Format as SDImageFormat
45 | * @return The UTType as CFStringRef
46 | */
47 | + (nonnull CFStringRef)sd_UTTypeFromImageFormat:(SDImageFormat)format CF_RETURNS_NOT_RETAINED NS_SWIFT_NAME(sd_UTType(from:));
48 |
49 | /**
50 | * Convert UTTyppe to SDImageFormat
51 | *
52 | * @param uttype The UTType as CFStringRef
53 | * @return The Format as SDImageFormat
54 | */
55 | + (SDImageFormat)sd_imageFormatFromUTType:(nonnull CFStringRef)uttype;
56 |
57 | @end
58 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIImage+MultiFormat.h"
10 | #import "SDImageCodersManager.h"
11 |
12 | @implementation UIImage (MultiFormat)
13 |
14 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data {
15 | return [self sd_imageWithData:data scale:1];
16 | }
17 |
18 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale {
19 | return [self sd_imageWithData:data scale:scale firstFrameOnly:NO];
20 | }
21 |
22 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale firstFrameOnly:(BOOL)firstFrameOnly {
23 | if (!data) {
24 | return nil;
25 | }
26 | SDImageCoderOptions *options = @{SDImageCoderDecodeScaleFactor : @(MAX(scale, 1)), SDImageCoderDecodeFirstFrameOnly : @(firstFrameOnly)};
27 | return [[SDImageCodersManager sharedManager] decodedImageWithData:data options:options];
28 | }
29 |
30 | - (nullable NSData *)sd_imageData {
31 | return [self sd_imageDataAsFormat:SDImageFormatUndefined];
32 | }
33 |
34 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat {
35 | return [self sd_imageDataAsFormat:imageFormat compressionQuality:1];
36 | }
37 |
38 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality {
39 | return [self sd_imageDataAsFormat:imageFormat compressionQuality:compressionQuality firstFrameOnly:NO];
40 | }
41 |
42 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality firstFrameOnly:(BOOL)firstFrameOnly {
43 | SDImageCoderOptions *options = @{SDImageCoderEncodeCompressionQuality : @(compressionQuality), SDImageCoderEncodeFirstFrameOnly : @(firstFrameOnly)};
44 | return [[SDImageCodersManager sharedManager] encodedDataWithImage:self format:imageFormat options:options];
45 | }
46 |
47 | @end
48 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+Metadata.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 | #import "NSData+ImageContentType.h"
11 |
12 | /**
13 | UIImage category for image metadata, including animation, loop count, format, incremental, etc.
14 | */
15 | @interface UIImage (Metadata)
16 |
17 | /**
18 | * UIKit:
19 | * For static image format, this value is always 0.
20 | * For animated image format, 0 means infinite looping.
21 | * Note that because of the limitations of categories this property can get out of sync if you create another instance with CGImage or other methods.
22 | * AppKit:
23 | * NSImage currently only support animated via GIF imageRep unlike UIImage.
24 | * The getter of this property will get the loop count from GIF imageRep
25 | * The setter of this property will set the loop count from GIF imageRep
26 | */
27 | @property (nonatomic, assign) NSUInteger sd_imageLoopCount;
28 |
29 | /**
30 | * UIKit:
31 | * Check the `images` array property
32 | * AppKit:
33 | * NSImage currently only support animated via GIF imageRep unlike UIImage. It will check the imageRep's frame count.
34 | */
35 | @property (nonatomic, assign, readonly) BOOL sd_isAnimated;
36 |
37 | /**
38 | * The image format represent the original compressed image data format.
39 | * If you don't manually specify a format, this information is retrieve from CGImage using `CGImageGetUTType`, which may return nil for non-CG based image. At this time it will return `SDImageFormatUndefined` as default value.
40 | * @note Note that because of the limitations of categories this property can get out of sync if you create another instance with CGImage or other methods.
41 | */
42 | @property (nonatomic, assign) SDImageFormat sd_imageFormat;
43 |
44 | /**
45 | A bool value indicating whether the image is during incremental decoding and may not contains full pixels.
46 | */
47 | @property (nonatomic, assign) BOOL sd_isIncremental;
48 |
49 | @end
50 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/自定义pageControl/特殊样式/SpecilDemo.m:
--------------------------------------------------------------------------------
1 | //
2 | // SpecilDemo.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2020/4/15.
6 | // Copyright © 2020 wmz. All rights reserved.
7 | //
8 |
9 | #import "SpecilDemo.h"
10 | #import "WMZBannerView.h"
11 | @interface SpecilDemo ()
12 |
13 | @end
14 |
15 | @implementation SpecilDemo
16 |
17 | - (void)viewDidLoad {
18 | [super viewDidLoad];
19 | self.view.backgroundColor = [UIColor whiteColor];
20 | [self styleOne];
21 | }
22 |
23 |
24 | - (void)styleOne{
25 | WMZBannerParam *param = BannerParam()
26 | .wFrameSet(CGRectMake(10,100, BannerWitdh-20, BannerHeight*0.25))
27 | .wItemSizeSet(CGSizeMake(BannerWitdh-20, BannerHeight*0.23))
28 | .wDataSet([self getData])
29 | //自定义下划线
30 | .wSpecialCustumLineSet(^(UIView *line) {
31 | line.frame = CGRectMake(0, 0, 100, 3);
32 | line.backgroundColor = [UIColor redColor];
33 | })
34 | .wHideBannerControlSet(YES)
35 | .wSpecialStyleSet(SpecialStyleLine);
36 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
37 | [self.view addSubview:viewOne];
38 |
39 | }
40 |
41 | - (NSArray*)getData{
42 | return @[
43 | @{@"name":@"第0个",@"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f4aadd0b85f93309a4629c998773ae83&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1206%2F07%2Fc0%2F11909864_1339034191111.jpg"},
44 | @{@"name":@"第1个",@"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f06819b43c8032d203642874d1893f3d&imgtype=0&src=http%3A%2F%2Fi2.sinaimg.cn%2Fent%2Fs%2Fm%2Fp%2F2009-06-25%2FU1326P28T3D2580888F326DT20090625072056.jpg"},
45 | @{@"name":@"第2个",@"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577338893&di=189401ebacb9704d18f6ab02b7336923&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201308%2F05%2F20130805105309_5E2zE.jpeg"},
46 | @{@"name":@"第3个",@"icon":@"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3425860897,3737508983&fm=26&gp=0.jpg"}
47 |
48 | ];
49 | }
50 |
51 | @end
52 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageCachesManagerOperation.h"
10 | #import "SDInternalMacros.h"
11 |
12 | @implementation SDImageCachesManagerOperation
13 | {
14 | dispatch_semaphore_t _pendingCountLock;
15 | }
16 |
17 | @synthesize executing = _executing;
18 | @synthesize finished = _finished;
19 | @synthesize cancelled = _cancelled;
20 | @synthesize pendingCount = _pendingCount;
21 |
22 | - (instancetype)init {
23 | if (self = [super init]) {
24 | _pendingCountLock = dispatch_semaphore_create(1);
25 | _pendingCount = 0;
26 | }
27 | return self;
28 | }
29 |
30 | - (void)beginWithTotalCount:(NSUInteger)totalCount {
31 | self.executing = YES;
32 | self.finished = NO;
33 | _pendingCount = totalCount;
34 | }
35 |
36 | - (NSUInteger)pendingCount {
37 | SD_LOCK(_pendingCountLock);
38 | NSUInteger pendingCount = _pendingCount;
39 | SD_UNLOCK(_pendingCountLock);
40 | return pendingCount;
41 | }
42 |
43 | - (void)completeOne {
44 | SD_LOCK(_pendingCountLock);
45 | _pendingCount = _pendingCount > 0 ? _pendingCount - 1 : 0;
46 | SD_UNLOCK(_pendingCountLock);
47 | }
48 |
49 | - (void)cancel {
50 | self.cancelled = YES;
51 | [self reset];
52 | }
53 |
54 | - (void)done {
55 | self.finished = YES;
56 | self.executing = NO;
57 | [self reset];
58 | }
59 |
60 | - (void)reset {
61 | SD_LOCK(_pendingCountLock);
62 | _pendingCount = 0;
63 | SD_UNLOCK(_pendingCountLock);
64 | }
65 |
66 | - (void)setFinished:(BOOL)finished {
67 | [self willChangeValueForKey:@"isFinished"];
68 | _finished = finished;
69 | [self didChangeValueForKey:@"isFinished"];
70 | }
71 |
72 | - (void)setExecuting:(BOOL)executing {
73 | [self willChangeValueForKey:@"isExecuting"];
74 | _executing = executing;
75 | [self didChangeValueForKey:@"isExecuting"];
76 | }
77 |
78 | - (void)setCancelled:(BOOL)cancelled {
79 | [self willChangeValueForKey:@"isCancelled"];
80 | _cancelled = cancelled;
81 | [self didChangeValueForKey:@"isCancelled"];
82 | }
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/WMZBanner/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "ViewController.h"
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
19 | // Override point for customization after application launch.
20 | self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
21 | [self.window makeKeyAndVisible];
22 | return YES;
23 | }
24 |
25 |
26 | - (void)applicationWillResignActive:(UIApplication *)application {
27 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
28 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
29 | }
30 |
31 |
32 | - (void)applicationDidEnterBackground:(UIApplication *)application {
33 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
34 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
35 | }
36 |
37 |
38 | - (void)applicationWillEnterForeground:(UIApplication *)application {
39 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
40 | }
41 |
42 |
43 | - (void)applicationDidBecomeActive:(UIApplication *)application {
44 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
45 | }
46 |
47 |
48 | - (void)applicationWillTerminate:(UIApplication *)application {
49 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
50 | }
51 |
52 |
53 | @end
54 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/跑马灯/DemoMarqueen.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | //
5 | // DemoMarqueen.m
6 | // WMZBanner
7 | //
8 | // Created by wmz on 2019/12/19.
9 | // Copyright © 2019 wmz. All rights reserved.
10 | //
11 |
12 | #import "DemoMarqueen.h"
13 | #import "WMZBannerView.h"
14 | @interface DemoMarqueen ()
15 |
16 | @end
17 |
18 | @implementation DemoMarqueen
19 |
20 | - (void)viewDidLoad {
21 | [super viewDidLoad];
22 |
23 | self.view.backgroundColor = [UIColor whiteColor];
24 |
25 | /*
26 | *横向
27 | */
28 | WMZBannerParam *param = BannerParam()
29 | .wFrameSet(CGRectMake(10, BannerHeight/6, BannerWitdh-20, BannerHeight/4))
30 | .wDataSet([self getData])
31 | //开启跑马灯
32 | .wMarqueeSet(YES)
33 | //开启循环滚动
34 | .wRepeatSet(YES)
35 | //速率
36 | .wMarqueeRateSet(0.6);
37 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
38 | [self.view addSubview:viewOne];
39 |
40 |
41 | /*
42 | *纵向
43 | */
44 | WMZBannerParam *param1 = BannerParam()
45 | .wFrameSet(CGRectMake(10, BannerHeight/2, BannerWitdh-20, BannerHeight/4))
46 | .wDataSet([self getData])
47 | //开启跑马灯
48 | .wMarqueeSet(YES)
49 | //开启循环滚动
50 | .wRepeatSet(YES)
51 | //不可拖动
52 | .wCanFingerSlidingSet(NO)
53 | //纵向
54 | .wVerticalSet(YES);
55 |
56 | WMZBannerView *viewOne1 = [[WMZBannerView alloc]initConfigureWithModel:param1];
57 | [self.view addSubview:viewOne1];
58 | }
59 |
60 | - (NSArray*)getData{
61 | return @[
62 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f4aadd0b85f93309a4629c998773ae83&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1206%2F07%2Fc0%2F11909864_1339034191111.jpg",
63 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f06819b43c8032d203642874d1893f3d&imgtype=0&src=http%3A%2F%2Fi2.sinaimg.cn%2Fent%2Fs%2Fm%2Fp%2F2009-06-25%2FU1326P28T3D2580888F326DT20090625072056.jpg",
64 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577338893&di=189401ebacb9704d18f6ab02b7336923&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201308%2F05%2F20130805105309_5E2zE.jpeg",
65 | @"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3425860897,3737508983&fm=26&gp=0.jpg"
66 | ];
67 | }
68 | - (void)dealloc{
69 |
70 | }
71 | @end
72 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageCodersManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDImageCoder.h"
11 |
12 | /**
13 | Global object holding the array of coders, so that we avoid passing them from object to object.
14 | Uses a priority queue behind scenes, which means the latest added coders have the highest priority.
15 | This is done so when encoding/decoding something, we go through the list and ask each coder if they can handle the current data.
16 | That way, users can add their custom coders while preserving our existing prebuilt ones
17 |
18 | Note: the `coders` getter will return the coders in their reversed order
19 | Example:
20 | - by default we internally set coders = `IOCoder`, `GIFCoder`, `APNGCoder`
21 | - calling `coders` will return `@[IOCoder, GIFCoder, APNGCoder]`
22 | - call `[addCoder:[MyCrazyCoder new]]`
23 | - calling `coders` now returns `@[IOCoder, GIFCoder, APNGCoder, MyCrazyCoder]`
24 |
25 | Coders
26 | ------
27 | A coder must conform to the `SDImageCoder` protocol or even to `SDProgressiveImageCoder` if it supports progressive decoding
28 | Conformance is important because that way, they will implement `canDecodeFromData` or `canEncodeToFormat`
29 | Those methods are called on each coder in the array (using the priority order) until one of them returns YES.
30 | That means that coder can decode that data / encode to that format
31 | */
32 | @interface SDImageCodersManager : NSObject
33 |
34 | /**
35 | Returns the global shared coders manager instance.
36 | */
37 | @property (nonatomic, class, readonly, nonnull) SDImageCodersManager *sharedManager;
38 |
39 | /**
40 | All coders in coders manager. The coders array is a priority queue, which means the later added coder will have the highest priority
41 | */
42 | @property (nonatomic, copy, nullable) NSArray> *coders;
43 |
44 | /**
45 | Add a new coder to the end of coders array. Which has the highest priority.
46 |
47 | @param coder coder
48 | */
49 | - (void)addCoder:(nonnull id)coder;
50 |
51 | /**
52 | Remove a coder in the coders array.
53 |
54 | @param coder coder
55 | */
56 | - (void)removeCoder:(nonnull id)coder;
57 |
58 | @end
59 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageCompat.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Jamie Pinkham
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 |
12 | #ifdef __OBJC_GC__
13 | #error SDWebImage does not support Objective-C Garbage Collection
14 | #endif
15 |
16 | // Seems like TARGET_OS_MAC is always defined (on all platforms).
17 | // To determine if we are running on macOS, use TARGET_OS_OSX in Xcode 8
18 | #if TARGET_OS_OSX
19 | #define SD_MAC 1
20 | #else
21 | #define SD_MAC 0
22 | #endif
23 |
24 | // iOS and tvOS are very similar, UIKit exists on both platforms
25 | // Note: watchOS also has UIKit, but it's very limited
26 | #if TARGET_OS_IOS || TARGET_OS_TV
27 | #define SD_UIKIT 1
28 | #else
29 | #define SD_UIKIT 0
30 | #endif
31 |
32 | #if TARGET_OS_IOS
33 | #define SD_IOS 1
34 | #else
35 | #define SD_IOS 0
36 | #endif
37 |
38 | #if TARGET_OS_TV
39 | #define SD_TV 1
40 | #else
41 | #define SD_TV 0
42 | #endif
43 |
44 | #if TARGET_OS_WATCH
45 | #define SD_WATCH 1
46 | #else
47 | #define SD_WATCH 0
48 | #endif
49 |
50 |
51 | #if SD_MAC
52 | #import
53 | #ifndef UIImage
54 | #define UIImage NSImage
55 | #endif
56 | #ifndef UIImageView
57 | #define UIImageView NSImageView
58 | #endif
59 | #ifndef UIView
60 | #define UIView NSView
61 | #endif
62 | #ifndef UIColor
63 | #define UIColor NSColor
64 | #endif
65 | #else
66 | #if SD_UIKIT
67 | #import
68 | #endif
69 | #if SD_WATCH
70 | #import
71 | #ifndef UIView
72 | #define UIView WKInterfaceObject
73 | #endif
74 | #ifndef UIImageView
75 | #define UIImageView WKInterfaceImage
76 | #endif
77 | #endif
78 | #endif
79 |
80 | #ifndef NS_ENUM
81 | #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
82 | #endif
83 |
84 | #ifndef NS_OPTIONS
85 | #define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
86 | #endif
87 |
88 | #ifndef dispatch_main_async_safe
89 | #define dispatch_main_async_safe(block)\
90 | if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) {\
91 | block();\
92 | } else {\
93 | dispatch_async(dispatch_get_main_queue(), block);\
94 | }
95 | #endif
96 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageCacheConfig.h"
10 | #import "SDMemoryCache.h"
11 | #import "SDDiskCache.h"
12 |
13 | static SDImageCacheConfig *_defaultCacheConfig;
14 | static const NSInteger kDefaultCacheMaxDiskAge = 60 * 60 * 24 * 7; // 1 week
15 |
16 | @implementation SDImageCacheConfig
17 |
18 | + (SDImageCacheConfig *)defaultCacheConfig {
19 | static dispatch_once_t onceToken;
20 | dispatch_once(&onceToken, ^{
21 | _defaultCacheConfig = [SDImageCacheConfig new];
22 | });
23 | return _defaultCacheConfig;
24 | }
25 |
26 | - (instancetype)init {
27 | if (self = [super init]) {
28 | _shouldDisableiCloud = YES;
29 | _shouldCacheImagesInMemory = YES;
30 | _shouldUseWeakMemoryCache = YES;
31 | _shouldRemoveExpiredDataWhenEnterBackground = YES;
32 | _diskCacheReadingOptions = 0;
33 | _diskCacheWritingOptions = NSDataWritingAtomic;
34 | _maxDiskAge = kDefaultCacheMaxDiskAge;
35 | _maxDiskSize = 0;
36 | _diskCacheExpireType = SDImageCacheConfigExpireTypeModificationDate;
37 | _memoryCacheClass = [SDMemoryCache class];
38 | _diskCacheClass = [SDDiskCache class];
39 | }
40 | return self;
41 | }
42 |
43 | - (id)copyWithZone:(NSZone *)zone {
44 | SDImageCacheConfig *config = [[[self class] allocWithZone:zone] init];
45 | config.shouldDisableiCloud = self.shouldDisableiCloud;
46 | config.shouldCacheImagesInMemory = self.shouldCacheImagesInMemory;
47 | config.shouldUseWeakMemoryCache = self.shouldUseWeakMemoryCache;
48 | config.shouldRemoveExpiredDataWhenEnterBackground = self.shouldRemoveExpiredDataWhenEnterBackground;
49 | config.diskCacheReadingOptions = self.diskCacheReadingOptions;
50 | config.diskCacheWritingOptions = self.diskCacheWritingOptions;
51 | config.maxDiskAge = self.maxDiskAge;
52 | config.maxDiskSize = self.maxDiskSize;
53 | config.maxMemoryCost = self.maxMemoryCost;
54 | config.maxMemoryCount = self.maxMemoryCount;
55 | config.diskCacheExpireType = self.diskCacheExpireType;
56 | config.fileManager = self.fileManager; // NSFileManager does not conform to NSCopying, just pass the reference
57 | config.memoryCacheClass = self.memoryCacheClass;
58 | config.diskCacheClass = self.diskCacheClass;
59 |
60 | return config;
61 | }
62 |
63 | @end
64 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 | #import "SDWebImageDefine.h"
12 |
13 | @class SDWebImageOptionsResult;
14 |
15 | typedef SDWebImageOptionsResult * _Nullable(^SDWebImageOptionsProcessorBlock)(NSURL * _Nullable url, SDWebImageOptions options, SDWebImageContext * _Nullable context);
16 |
17 | /**
18 | The options result contains both options and context.
19 | */
20 | @interface SDWebImageOptionsResult : NSObject
21 |
22 | /**
23 | WebCache options.
24 | */
25 | @property (nonatomic, assign, readonly) SDWebImageOptions options;
26 |
27 | /**
28 | Context options.
29 | */
30 | @property (nonatomic, copy, readonly, nullable) SDWebImageContext *context;
31 |
32 | /**
33 | Create a new options result.
34 |
35 | @param options options
36 | @param context context
37 | @return The options result contains both options and context.
38 | */
39 | - (nonnull instancetype)initWithOptions:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context;
40 |
41 | @end
42 |
43 | /**
44 | This is the protocol for options processor.
45 | Options processor can be used, to control the final result for individual image request's `SDWebImageOptions` and `SDWebImageContext`
46 | Implements the protocol to have a global control for each indivadual image request's option.
47 | */
48 | @protocol SDWebImageOptionsProcessor
49 |
50 | /**
51 | Return the processed options result for specify image URL, with its options and context
52 |
53 | @param url The URL to the image
54 | @param options A mask to specify options to use for this request
55 | @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
56 | @return The processed result, contains both options and context
57 | */
58 | - (nullable SDWebImageOptionsResult *)processedResultForURL:(nullable NSURL *)url
59 | options:(SDWebImageOptions)options
60 | context:(nullable SDWebImageContext *)context;
61 |
62 | @end
63 |
64 | /**
65 | A options processor class with block.
66 | */
67 | @interface SDWebImageOptionsProcessor : NSObject
68 |
69 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block;
70 | + (nonnull instancetype)optionsProcessorWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block;
71 |
72 | @end
73 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | #if SD_MAC
12 |
13 | /**
14 | This category is provided to easily write cross-platform(AppKit/UIKit) code. For common usage, see `UIImage+Metadata.h`.
15 | */
16 | @interface NSImage (Compatibility)
17 |
18 | /**
19 | The underlying Core Graphics image object. This will actually use `CGImageForProposedRect` with the image size.
20 | */
21 | @property (nonatomic, readonly, nullable) CGImageRef CGImage;
22 | /**
23 | The scale factor of the image. This wil actually use `bestRepresentationForRect` with image size and pixel size to calculate the scale factor. If failed, use the default value 1.0. Should be greater than or equal to 1.0.
24 | */
25 | @property (nonatomic, readonly) CGFloat scale;
26 |
27 | // These are convenience methods to make AppKit's `NSImage` match UIKit's `UIImage` behavior. The scale factor should be greater than or equal to 1.0.
28 |
29 | /**
30 | Returns an image object with the scale factor and orientation. The representation is created from the Core Graphics image object.
31 | @note The difference between this and `initWithCGImage:size` is that `initWithCGImage:size` will actually create a `NSCGImageSnapshotRep` representation and always use `backingScaleFactor` as scale factor. So we should avoid it and use `NSBitmapImageRep` with `initWithCGImage:` instead.
32 | @note The difference between this and UIKit's `UIImage` equivalent method is the way to process orientation. If the provided image orientation is not equal to Up orientation, this method will firstly rotate the CGImage to the correct orientation to work compatible with `NSImageView`. However, UIKit will not actually rotate CGImage and just store it as `imageOrientation` property.
33 |
34 | @param cgImage A Core Graphics image object
35 | @param scale The image scale factor
36 | @param orientation The orientation of the image data
37 | @return The image object
38 | */
39 | - (nonnull instancetype)initWithCGImage:(nonnull CGImageRef)cgImage scale:(CGFloat)scale orientation:(CGImagePropertyOrientation)orientation;
40 |
41 | /**
42 | Returns an image object with the scale factor. The representation is created from the image data.
43 | @note The difference between these this and `initWithData:` is that `initWithData:` will always use `backingScaleFactor` as scale factor.
44 |
45 | @param data The image data
46 | @param scale The image scale factor
47 | @return The image object
48 | */
49 | - (nullable instancetype)initWithData:(nonnull NSData *)data scale:(CGFloat)scale;
50 |
51 | @end
52 |
53 | #endif
54 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDMemoryCache.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | @class SDImageCacheConfig;
12 | /**
13 | A protocol to allow custom memory cache used in SDImageCache.
14 | */
15 | @protocol SDMemoryCache
16 |
17 | @required
18 | /**
19 | Create a new memory cache instance with the specify cache config. You can check `maxMemoryCost` and `maxMemoryCount` used for memory cache.
20 |
21 | @param config The cache config to be used to create the cache.
22 | @return The new memory cache instance.
23 | */
24 | - (nonnull instancetype)initWithConfig:(nonnull SDImageCacheConfig *)config;
25 |
26 | /**
27 | Returns the value associated with a given key.
28 |
29 | @param key An object identifying the value. If nil, just return nil.
30 | @return The value associated with key, or nil if no value is associated with key.
31 | */
32 | - (nullable id)objectForKey:(nonnull id)key;
33 |
34 | /**
35 | Sets the value of the specified key in the cache (0 cost).
36 |
37 | @param object The object to be stored in the cache. If nil, it calls `removeObjectForKey:`.
38 | @param key The key with which to associate the value. If nil, this method has no effect.
39 | @discussion Unlike an NSMutableDictionary object, a cache does not copy the key
40 | objects that are put into it.
41 | */
42 | - (void)setObject:(nullable id)object forKey:(nonnull id)key;
43 |
44 | /**
45 | Sets the value of the specified key in the cache, and associates the key-value
46 | pair with the specified cost.
47 |
48 | @param object The object to store in the cache. If nil, it calls `removeObjectForKey`.
49 | @param key The key with which to associate the value. If nil, this method has no effect.
50 | @param cost The cost with which to associate the key-value pair.
51 | @discussion Unlike an NSMutableDictionary object, a cache does not copy the key
52 | objects that are put into it.
53 | */
54 | - (void)setObject:(nullable id)object forKey:(nonnull id)key cost:(NSUInteger)cost;
55 |
56 | /**
57 | Removes the value of the specified key in the cache.
58 |
59 | @param key The key identifying the value to be removed. If nil, this method has no effect.
60 | */
61 | - (void)removeObjectForKey:(nonnull id)key;
62 |
63 | /**
64 | Empties the cache immediately.
65 | */
66 | - (void)removeAllObjects;
67 |
68 | @end
69 |
70 | /**
71 | A memory cache which auto purge the cache on memory warning and support weak cache.
72 | */
73 | @interface SDMemoryCache : NSCache
74 |
75 | @property (nonatomic, strong, nonnull, readonly) SDImageCacheConfig *config;
76 |
77 | @end
78 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/正常样式/demoNormal.m:
--------------------------------------------------------------------------------
1 | //
2 | // demoNormal.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/16.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import "demoNormal.h"
10 | #import "WMZBannerView.h"
11 | @interface demoNormal ()
12 |
13 | @end
14 |
15 | @implementation demoNormal
16 |
17 | - (void)viewDidLoad {
18 | [super viewDidLoad];
19 |
20 | self.view.backgroundColor = [UIColor whiteColor];
21 |
22 |
23 |
24 | /*
25 | *横向
26 | */
27 | WMZBannerParam *param =
28 | BannerParam()
29 | // .wEventDidScrollSet(^(long contentoffet) {
30 | // NSLog(@"%ld",contentoffet);
31 | // })
32 | .wFrameSet(CGRectMake(10, BannerHeight/6, BannerWitdh-20, BannerHeight/4))
33 | .wDataSet(@[])
34 | //自定义图片圆角
35 | .wCustomImageRadioSet(5)
36 | //开启循环滚动
37 | .wRepeatSet(YES)
38 | //设置item的间距
39 | // .wLineSpacingSet(10)
40 | //开启自动滚动
41 | .wAutoScrollSet(YES)
42 | //自动滚动时间
43 | .wAutoScrollSecondSet(3)
44 |
45 | ;
46 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
47 | viewOne.layer.cornerRadius = 5;
48 | viewOne.layer.masksToBounds = YES;
49 |
50 | [self.view addSubview:viewOne];
51 |
52 | //模拟刷新数据
53 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
54 | param.wDataSet([self getData]);
55 | [viewOne updateUI];
56 | });
57 |
58 |
59 |
60 | /*
61 | *纵向
62 | */
63 | WMZBannerParam *param1 = BannerParam()
64 | .wFrameSet(CGRectMake(10, BannerHeight/2, BannerWitdh-20, BannerHeight/4))
65 | .wDataSet([self getData])
66 | //开启循环滚动
67 | .wRepeatSet(YES)
68 | //开启纵向
69 | .wVerticalSet(YES);
70 | WMZBannerView *viewTwo = [[WMZBannerView alloc]initConfigureWithModel:param1];
71 | [self.view addSubview:viewTwo];
72 | }
73 |
74 | - (NSArray*)getData{
75 | return @[
76 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f4aadd0b85f93309a4629c998773ae83&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1206%2F07%2Fc0%2F11909864_1339034191111.jpg",
77 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f06819b43c8032d203642874d1893f3d&imgtype=0&src=http%3A%2F%2Fi2.sinaimg.cn%2Fent%2Fs%2Fm%2Fp%2F2009-06-25%2FU1326P28T3D2580888F326DT20090625072056.jpg",
78 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577338893&di=189401ebacb9704d18f6ab02b7336923&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201308%2F05%2F20130805105309_5E2zE.jpeg",
79 | @"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3425860897,3737508983&fm=26&gp=0.jpg"
80 | ];
81 | }
82 |
83 | - (void)dealloc{
84 |
85 | }
86 |
87 | @end
88 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageCachesManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDImageCacheDefine.h"
11 |
12 | /// Policy for cache operation
13 | typedef NS_ENUM(NSUInteger, SDImageCachesManagerOperationPolicy) {
14 | SDImageCachesManagerOperationPolicySerial, // process all caches serially (from the highest priority to the lowest priority cache by order)
15 | SDImageCachesManagerOperationPolicyConcurrent, // process all caches concurrently
16 | SDImageCachesManagerOperationPolicyHighestOnly, // process the highest priority cache only
17 | SDImageCachesManagerOperationPolicyLowestOnly // process the lowest priority cache only
18 | };
19 |
20 | /**
21 | A caches manager to manage multiple caches.
22 | */
23 | @interface SDImageCachesManager : NSObject
24 |
25 | /**
26 | Returns the global shared caches manager instance. By default we will set [`SDImageCache.sharedImageCache`] into the caches array.
27 | */
28 | @property (nonatomic, class, readonly, nonnull) SDImageCachesManager *sharedManager;
29 |
30 | // These are op policy for cache manager.
31 |
32 | /**
33 | Operation policy for query op.
34 | Defaults to `Serial`, means query all caches serially (one completion called then next begin) until one cache query success (`image` != nil).
35 | */
36 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy queryOperationPolicy;
37 |
38 | /**
39 | Operation policy for store op.
40 | Defaults to `HighestOnly`, means store to the highest priority cache only.
41 | */
42 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy storeOperationPolicy;
43 |
44 | /**
45 | Operation policy for remove op.
46 | Defaults to `Concurrent`, means remove all caches concurrently.
47 | */
48 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy removeOperationPolicy;
49 |
50 | /**
51 | Operation policy for contains op.
52 | Defaults to `Serial`, means check all caches serially (one completion called then next begin) until one cache check success (`containsCacheType` != None).
53 | */
54 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy containsOperationPolicy;
55 |
56 | /**
57 | Operation policy for clear op.
58 | Defaults to `Concurrent`, means clear all caches concurrently.
59 | */
60 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy clearOperationPolicy;
61 |
62 | /**
63 | All caches in caches manager. The caches array is a priority queue, which means the later added cache will have the highest priority
64 | */
65 | @property (nonatomic, copy, nullable) NSArray> *caches;
66 |
67 | /**
68 | Add a new cache to the end of caches array. Which has the highest priority.
69 |
70 | @param cache cache
71 | */
72 | - (void)addCache:(nonnull id)cache;
73 |
74 | /**
75 | Remove a cache in the caches array.
76 |
77 | @param cache cache
78 | */
79 | - (void)removeCache:(nonnull id)cache;
80 |
81 | @end
82 |
--------------------------------------------------------------------------------
/WMZBanner/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "WMZBannerView.h"
11 | #import "MyCell.h"
12 | @interface ViewController ()
13 | @property(nonatomic,strong)UITableView *ta;
14 | @property(nonatomic,strong)NSArray *taData;
15 | @property(nonatomic,strong)NSArray *vcData;
16 | @end
17 |
18 | @implementation ViewController
19 |
20 | - (void)viewDidLoad {
21 | [super viewDidLoad];
22 |
23 | self.view.backgroundColor = [UIColor whiteColor];
24 |
25 | UITableView *ta = [[UITableView alloc]initWithFrame:CGRectMake(0, 88, self.view.frame.size.width,self.view.frame.size.height-88) style:UITableViewStyleGrouped];
26 | [self.view addSubview:ta];
27 | ta.estimatedRowHeight = 100;
28 | if (@available(iOS 11.0, *)) {
29 | ta.estimatedSectionFooterHeight = 0.01;
30 | ta.estimatedSectionHeaderHeight = 0.01;
31 | ta.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
32 | }else{
33 | self.automaticallyAdjustsScrollViewInsets = NO;
34 | }
35 | ta.dataSource = self;
36 | ta.delegate = self;
37 | self.ta = ta;
38 | }
39 |
40 |
41 | - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
42 | return 0.01;
43 | }
44 |
45 | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
46 | return 0.01;
47 | }
48 |
49 | - (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
50 | return nil;
51 | }
52 |
53 | - (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
54 | return nil;
55 | }
56 |
57 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
58 | return [self.taData count];
59 | }
60 |
61 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
62 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
63 | if (!cell) {
64 | cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
65 | }
66 | cell.textLabel.font = [UIFont systemFontOfSize:14.0f];
67 | cell.textLabel.text = self.taData[indexPath.row];
68 | return cell;
69 | }
70 |
71 |
72 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
73 | Class class = NSClassFromString(self.vcData[indexPath.row]);
74 | [self.navigationController pushViewController:[class new] animated:YES];
75 | }
76 |
77 | - (NSArray *)taData{
78 | if (!_taData) {
79 | _taData = @[@"显示全部属性(+更新数据)",@"自定义pageControl",@"正常样式(横向+纵向)",@"天猫精灵样式",@"电商播报",@"自定义卡片样式",@"叠加样式",@"跑马灯",@"特殊样式(下划线)",@"特殊样式(淡入淡出-横向/纵向)",@"特殊样式(首个变大)"];
80 | }
81 | return _taData;
82 | }
83 |
84 | - (NSArray *)vcData{
85 | if (!_vcData) {
86 | _vcData = @[@"demoOne",@"DemoPageControl",@"demoNormal",@"DemoTianMao",@"DemoDianshang",@"DemoCard",@"DemoAdd",@"DemoMarqueen",@"SpecilDemo",@"FadeDemo",@"SpecilFirstScaleDemo"];
87 | }
88 | return _vcData;
89 | }
90 |
91 | @end
92 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIView+WebCacheOperation.h"
10 | #import "objc/runtime.h"
11 |
12 | static char loadOperationKey;
13 |
14 | // key is strong, value is weak because operation instance is retained by SDWebImageManager's runningOperations property
15 | // we should use lock to keep thread-safe because these method may not be acessed from main queue
16 | typedef NSMapTable> SDOperationsDictionary;
17 |
18 | @implementation UIView (WebCacheOperation)
19 |
20 | - (SDOperationsDictionary *)sd_operationDictionary {
21 | @synchronized(self) {
22 | SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey);
23 | if (operations) {
24 | return operations;
25 | }
26 | operations = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0];
27 | objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
28 | return operations;
29 | }
30 | }
31 |
32 | - (nullable id)sd_imageLoadOperationForKey:(nullable NSString *)key {
33 | id operation;
34 | if (key) {
35 | SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
36 | @synchronized (self) {
37 | operation = [operationDictionary objectForKey:key];
38 | }
39 | }
40 | return operation;
41 | }
42 |
43 | - (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key {
44 | if (key) {
45 | [self sd_cancelImageLoadOperationWithKey:key];
46 | if (operation) {
47 | SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
48 | @synchronized (self) {
49 | [operationDictionary setObject:operation forKey:key];
50 | }
51 | }
52 | }
53 | }
54 |
55 | - (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key {
56 | if (key) {
57 | // Cancel in progress downloader from queue
58 | SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
59 | id operation;
60 |
61 | @synchronized (self) {
62 | operation = [operationDictionary objectForKey:key];
63 | }
64 | if (operation) {
65 | if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) {
66 | [operation cancel];
67 | }
68 | @synchronized (self) {
69 | [operationDictionary removeObjectForKey:key];
70 | }
71 | }
72 | }
73 | }
74 |
75 | - (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key {
76 | if (key) {
77 | SDOperationsDictionary *operationDictionary = [self sd_operationDictionary];
78 | @synchronized (self) {
79 | [operationDictionary removeObjectForKey:key];
80 | }
81 | }
82 | }
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/天猫样式/TianMaoCell.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | //
6 | // TianMaoCell.m
7 | // WMZBanner
8 | //
9 | // Created by wmz on 2019/12/16.
10 | // Copyright © 2019 wmz. All rights reserved.
11 | //
12 |
13 | #import "TianMaoCell.h"
14 |
15 | @implementation TianMaoCell
16 | -(instancetype)initWithFrame:(CGRect)frame
17 | {
18 | self = [super initWithFrame:frame];
19 | if (self){
20 | self.backImage = [UIImageView new];
21 | [self.contentView addSubview:self.backImage];
22 | self.backImage.frame = CGRectMake(0, 0, frame.size.width, frame.size.height*0.85);
23 |
24 |
25 | self.bottomView = [UIView new];
26 | [self.contentView addSubview:self.bottomView];
27 | self.bottomView.frame = CGRectMake(0, CGRectGetMaxY(self.backImage.frame), frame.size.width, frame.size.height*0.15);
28 | self.bottomView.backgroundColor = BannerColor(0x035eef);
29 |
30 |
31 | self.topLa = [UILabel new];
32 | self.topLa.text = @"最新上线";
33 | self.topLa.textAlignment = NSTextAlignmentCenter;
34 | self.topLa.frame = CGRectMake(20, 20, 80, 40);
35 | self.topLa.layer.masksToBounds = YES;
36 | self.topLa.layer.cornerRadius = 15;
37 | self.topLa.textColor = [UIColor whiteColor];
38 | [self.backImage addSubview:self.topLa];
39 | self.topLa.backgroundColor = BannerColor(0x035eef);
40 |
41 | self.titleLa = [UILabel new];
42 | self.titleLa.text = @"“天猫精灵,每天晚安闹钟”";
43 | self.titleLa.frame = CGRectMake(20, CGRectGetMaxY(self.topLa.frame)+20, frame.size.width - 40,50);
44 | self.titleLa.numberOfLines = 2;
45 | self.titleLa.textColor = [UIColor whiteColor];
46 | self.titleLa.font = [UIFont fontWithName:@"Helvetica-Bold" size:20];
47 | [self.backImage addSubview:self.titleLa];
48 |
49 | self.textLa = [UILabel new];
50 | self.textLa.text = @"真设美团晚安闹钟最高可得88元";
51 | self.textLa.textColor = BannerColor(0x666666);
52 | self.textLa.frame = CGRectMake(20, CGRectGetMaxY(self.titleLa.frame)+10, frame.size.width - 40,40);
53 | self.textLa.numberOfLines = 2;
54 | self.textLa.font = [UIFont systemFontOfSize:14.0f];
55 | [self.backImage addSubview:self.textLa];
56 |
57 | self.typeLa = [UILabel new];
58 | self.typeLa.text = @"先设置后抽奖";
59 | self.typeLa.textColor = [UIColor whiteColor];
60 | self.typeLa.frame = CGRectMake(20, 10, self.bottomView.frame.size.width*0.7,self.bottomView.frame.size.height-20);
61 | [self.bottomView addSubview:self.typeLa];
62 |
63 | self.detailBtn = [UIButton buttonWithType:UIButtonTypeCustom];
64 | self.detailBtn.backgroundColor = BannerColor(0x0d50c1);
65 | self.detailBtn.frame = CGRectMake(self.bottomView.frame.size.width*0.7, 10, self.bottomView.frame.size.width*0.3,self.bottomView.frame.size.height-20);
66 | [self.detailBtn setTitle:@"详情" forState:UIControlStateNormal];
67 | self.detailBtn.layer.masksToBounds = YES;
68 | self.detailBtn.layer.cornerRadius = (self.bottomView.frame.size.height-20)/2;
69 | [self.bottomView addSubview:self.detailBtn];
70 | [self.detailBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
71 |
72 |
73 | }
74 | return self;
75 | }
76 |
77 | @end
78 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageCacheDefine.h"
10 | #import "SDImageCodersManager.h"
11 | #import "SDImageCoderHelper.h"
12 | #import "SDAnimatedImage.h"
13 | #import "UIImage+Metadata.h"
14 | #import "SDInternalMacros.h"
15 |
16 | UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonnull imageData, NSString * _Nonnull cacheKey, SDWebImageOptions options, SDWebImageContext * _Nullable context) {
17 | UIImage *image;
18 | BOOL decodeFirstFrame = SD_OPTIONS_CONTAINS(options, SDWebImageDecodeFirstFrameOnly);
19 | NSNumber *scaleValue = context[SDWebImageContextImageScaleFactor];
20 | CGFloat scale = scaleValue.doubleValue >= 1 ? scaleValue.doubleValue : SDImageScaleFactorForKey(cacheKey);
21 | SDImageCoderOptions *coderOptions = @{SDImageCoderDecodeFirstFrameOnly : @(decodeFirstFrame), SDImageCoderDecodeScaleFactor : @(scale)};
22 | if (context) {
23 | SDImageCoderMutableOptions *mutableCoderOptions = [coderOptions mutableCopy];
24 | [mutableCoderOptions setValue:context forKey:SDImageCoderWebImageContext];
25 | coderOptions = [mutableCoderOptions copy];
26 | }
27 |
28 | if (!decodeFirstFrame) {
29 | Class animatedImageClass = context[SDWebImageContextAnimatedImageClass];
30 | // check whether we should use `SDAnimatedImage`
31 | if ([animatedImageClass isSubclassOfClass:[UIImage class]] && [animatedImageClass conformsToProtocol:@protocol(SDAnimatedImage)]) {
32 | image = [[animatedImageClass alloc] initWithData:imageData scale:scale options:coderOptions];
33 | if (image) {
34 | // Preload frames if supported
35 | if (options & SDWebImagePreloadAllFrames && [image respondsToSelector:@selector(preloadAllFrames)]) {
36 | [((id)image) preloadAllFrames];
37 | }
38 | } else {
39 | // Check image class matching
40 | if (options & SDWebImageMatchAnimatedImageClass) {
41 | return nil;
42 | }
43 | }
44 | }
45 | }
46 | if (!image) {
47 | image = [[SDImageCodersManager sharedManager] decodedImageWithData:imageData options:coderOptions];
48 | }
49 | if (image) {
50 | BOOL shouldDecode = !SD_OPTIONS_CONTAINS(options, SDWebImageAvoidDecodeImage);
51 | if ([image.class conformsToProtocol:@protocol(SDAnimatedImage)]) {
52 | // `SDAnimatedImage` do not decode
53 | shouldDecode = NO;
54 | } else if (image.sd_isAnimated) {
55 | // animated image do not decode
56 | shouldDecode = NO;
57 | }
58 | if (shouldDecode) {
59 | BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages);
60 | if (shouldScaleDown) {
61 | image = [SDImageCoderHelper decodedAndScaledDownImageWithImage:image limitBytes:0];
62 | } else {
63 | image = [SDImageCoderHelper decodedImageWithImage:image];
64 | }
65 | }
66 | }
67 |
68 | return image;
69 | }
70 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 | #import "NSData+ImageContentType.h"
11 |
12 | /**
13 | UIImage category for convenient image format decoding/encoding.
14 | */
15 | @interface UIImage (MultiFormat)
16 | #pragma mark - Decode
17 | /**
18 | Create and decode a image with the specify image data
19 |
20 | @param data The image data
21 | @return The created image
22 | */
23 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data;
24 |
25 | /**
26 | Create and decode a image with the specify image data and scale
27 |
28 | @param data The image data
29 | @param scale The image scale factor. Should be greater than or equal to 1.0.
30 | @return The created image
31 | */
32 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale;
33 |
34 | /**
35 | Create and decode a image with the specify image data and scale, allow specify animate/static control
36 |
37 | @param data The image data
38 | @param scale The image scale factor. Should be greater than or equal to 1.0.
39 | @param firstFrameOnly Even if the image data is animated image format, decode the first frame only as static image.
40 | @return The created image
41 | */
42 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale firstFrameOnly:(BOOL)firstFrameOnly;
43 |
44 | #pragma mark - Encode
45 | /**
46 | Encode the current image to the data, the image format is unspecified
47 |
48 | @return The encoded data. If can't encode, return nil
49 | */
50 | - (nullable NSData *)sd_imageData;
51 |
52 | /**
53 | Encode the current image to data with the specify image format
54 |
55 | @param imageFormat The specify image format
56 | @return The encoded data. If can't encode, return nil
57 | */
58 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat NS_SWIFT_NAME(sd_imageData(as:));
59 |
60 | /**
61 | Encode the current image to data with the specify image format and compression quality
62 |
63 | @param imageFormat The specify image format
64 | @param compressionQuality The quality of the resulting image data. Value between 0.0-1.0. Some coders may not support compression quality.
65 | @return The encoded data. If can't encode, return nil
66 | */
67 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality NS_SWIFT_NAME(sd_imageData(as:compressionQuality:));
68 |
69 | /**
70 | Encode the current image to data with the specify image format and compression quality, allow specify animate/static control
71 |
72 | @param imageFormat The specify image format
73 | @param compressionQuality The quality of the resulting image data. Value between 0.0-1.0. Some coders may not support compression quality.
74 | @param firstFrameOnly Even if the image is animated image, encode the first frame only as static image.
75 | @return The encoded data. If can't encode, return nil
76 | */
77 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality firstFrameOnly:(BOOL)firstFrameOnly NS_SWIFT_NAME(sd_imageData(as:compressionQuality:firstFrameOnly:));
78 |
79 | @end
80 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/叠加样式/DemoAdd.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | //
9 | // DemoAdd.m
10 | // WMZBanner
11 | //
12 | // Created by wmz on 2019/12/17.
13 | // Copyright © 2019 wmz. All rights reserved.
14 | //
15 |
16 | #import "DemoAdd.h"
17 | #import "WMZBannerView.h"
18 | @interface DemoAdd ()
19 |
20 | @end
21 |
22 | @implementation DemoAdd
23 |
24 | - (void)viewDidLoad {
25 | [super viewDidLoad];
26 | self.view.backgroundColor = [UIColor whiteColor];
27 |
28 |
29 | /*
30 | *横向
31 | */
32 | WMZBannerParam *param = BannerParam()
33 | .wFrameSet(CGRectMake(10,100, BannerWitdh-40, BannerHeight*0.35))
34 | .wItemSizeSet(CGSizeMake(BannerWitdh-60, BannerHeight*0.25))
35 | .wDataSet([self getData])
36 | .wEventScrollEndSet(^(id anyID, NSInteger index, BOOL isCenter, UICollectionViewCell *cell) {
37 | NSLog(@"滚动到第%ld个",index);
38 | })
39 | //设置item的间距
40 | .wLineSpacingSet(15)
41 | //开启卡片叠加模式
42 | .wCardOverLapSet(YES)
43 | //毛玻璃背景
44 | .wEffectSet(YES)
45 | //循环
46 | .wRepeatSet(YES)
47 | //开启自动滚动
48 | .wAutoScrollSet(YES)
49 | ;
50 | WMZBannerView *viewOne = [[WMZBannerView alloc]initConfigureWithModel:param];
51 | [self.view addSubview:viewOne];
52 |
53 |
54 |
55 | /*
56 | *纵向
57 | */
58 | WMZBannerParam *param1 =
59 | BannerParam()
60 | .wEventScrollEndSet(^(id anyID, NSInteger index, BOOL isCenter, UICollectionViewCell *cell) {
61 | NSLog(@"滚动到第%ld个",index);
62 | })
63 | .wFrameSet(CGRectMake(10, CGRectGetMaxY(viewOne.frame)+30 , BannerWitdh-20, BannerHeight*0.35))
64 | .wItemSizeSet(CGSizeMake(BannerWitdh/2, BannerHeight*0.3))
65 | .wDataSet([self getData])
66 | .wHideBannerControlSet(NO)
67 | //设置item的间距
68 | .wLineSpacingSet(40)
69 | //开启卡片叠加模式
70 | .wCardOverLapSet(YES)
71 | //缩放系数
72 | .wScaleFactorSet(0.6)
73 | //毛玻璃背景
74 | .wEffectSet(YES)
75 | .wRepeatSet(YES)
76 | //开启自动滚动
77 | .wAutoScrollSet(YES)
78 | //显示个数
79 | .wCardOverLapCountSet(3)
80 | //开启透明度变化 default NO
81 | .wCardOverAlphaOpenSet(YES)
82 | //透明度最小系数 default 0.1
83 | .wCardOverMinAlphaSet(0.1)
84 | //开启纵向
85 | .wVerticalSet(YES);
86 | WMZBannerView *viewTwo = [[WMZBannerView alloc]initConfigureWithModel:param1];
87 |
88 | [self.view addSubview:viewTwo];
89 |
90 | }
91 |
92 | - (NSArray*)getData{
93 | return @[
94 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f4aadd0b85f93309a4629c998773ae83&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1206%2F07%2Fc0%2F11909864_1339034191111.jpg",
95 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576744105022&di=f06819b43c8032d203642874d1893f3d&imgtype=0&src=http%3A%2F%2Fi2.sinaimg.cn%2Fent%2Fs%2Fm%2Fp%2F2009-06-25%2FU1326P28T3D2580888F326DT20090625072056.jpg",
96 | @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577338893&di=189401ebacb9704d18f6ab02b7336923&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201308%2F05%2F20130805105309_5E2zE.jpeg",
97 | @"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3425860897,3737508983&fm=26&gp=0.jpg"
98 | ];
99 | }
100 | - (void)dealloc{
101 |
102 | }
103 |
104 | @end
105 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/WebImage/SDWebImage.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Florent Vilmart
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 |
12 | #if SD_UIKIT
13 | #import
14 | #endif
15 |
16 | //! Project version number for WebImage.
17 | FOUNDATION_EXPORT double WebImageVersionNumber;
18 |
19 | //! Project version string for WebImage.
20 | FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
21 |
22 | // In this header, you should import all the public headers of your framework using statements like #import
23 |
24 | #import
25 | #import
26 | #import
27 | #import
28 | #import
29 | #import
30 | #import
31 | #import
32 | #import
33 | #import
34 | #import
35 | #import
36 | #import
37 | #import
38 | #import
39 | #import
40 | #import
41 | #import
42 | #import
43 | #import
44 | #import
45 | #import
46 | #import
47 | #import
48 | #import
49 | #import
50 | #import
51 | #import
52 | #import
53 | #import
54 | #import
55 | #import
56 | #import
57 | #import
58 | #import
59 | #import
60 | #import
61 | #import
62 | #import
63 | #import
64 | #import
65 | #import
66 | #import
67 | #import
68 | #import
69 | #import
70 |
71 | // Mac
72 | #if __has_include()
73 | #import
74 | #endif
75 | #if __has_include()
76 | #import
77 | #endif
78 | #if __has_include()
79 | #import
80 | #endif
81 |
82 | // MapKit
83 | #if __has_include()
84 | #import
85 | #endif
86 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "NSImage+Compatibility.h"
10 |
11 | #if SD_MAC
12 |
13 | #import "SDImageCoderHelper.h"
14 |
15 | @implementation NSImage (Compatibility)
16 |
17 | - (nullable CGImageRef)CGImage {
18 | NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
19 | CGImageRef cgImage = [self CGImageForProposedRect:&imageRect context:nil hints:nil];
20 | return cgImage;
21 | }
22 |
23 | - (CGFloat)scale {
24 | CGFloat scale = 1;
25 | NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
26 | NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
27 | CGFloat width = imageRep.size.width;
28 | CGFloat height = imageRep.size.height;
29 | NSUInteger pixelWidth = imageRep.pixelsWide;
30 | NSUInteger pixelHeight = imageRep.pixelsHigh;
31 | if (width > 0 && height > 0) {
32 | CGFloat widthScale = pixelWidth / width;
33 | CGFloat heightScale = pixelHeight / height;
34 | if (widthScale == heightScale && widthScale >= 1) {
35 | // Protect because there may be `NSImageRepMatchesDevice` (0)
36 | scale = widthScale;
37 | }
38 | }
39 |
40 | return scale;
41 | }
42 |
43 | - (instancetype)initWithCGImage:(nonnull CGImageRef)cgImage scale:(CGFloat)scale orientation:(CGImagePropertyOrientation)orientation {
44 | NSBitmapImageRep *imageRep;
45 | if (orientation != kCGImagePropertyOrientationUp) {
46 | // AppKit design is different from UIKit. Where CGImage based image rep does not respect to any orientation. Only data based image rep which contains the EXIF metadata can automatically detect orientation.
47 | // This should be nonnull, until the memory is exhausted cause `CGBitmapContextCreate` failed.
48 | CGImageRef rotatedCGImage = [SDImageCoderHelper CGImageCreateDecoded:cgImage orientation:orientation];
49 | imageRep = [[NSBitmapImageRep alloc] initWithCGImage:rotatedCGImage];
50 | CGImageRelease(rotatedCGImage);
51 | } else {
52 | imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
53 | }
54 | if (scale < 1) {
55 | scale = 1;
56 | }
57 | CGFloat pixelWidth = imageRep.pixelsWide;
58 | CGFloat pixelHeight = imageRep.pixelsHigh;
59 | NSSize size = NSMakeSize(pixelWidth / scale, pixelHeight / scale);
60 | self = [self initWithSize:size];
61 | if (self) {
62 | imageRep.size = size;
63 | [self addRepresentation:imageRep];
64 | }
65 | return self;
66 | }
67 |
68 | - (instancetype)initWithData:(nonnull NSData *)data scale:(CGFloat)scale {
69 | NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:data];
70 | if (!imageRep) {
71 | return nil;
72 | }
73 | if (scale < 1) {
74 | scale = 1;
75 | }
76 | CGFloat pixelWidth = imageRep.pixelsWide;
77 | CGFloat pixelHeight = imageRep.pixelsHigh;
78 | NSSize size = NSMakeSize(pixelWidth / scale, pixelHeight / scale);
79 | self = [self initWithSize:size];
80 | if (self) {
81 | imageRep.size = size;
82 | [self addRepresentation:imageRep];
83 | }
84 | return self;
85 | }
86 |
87 | @end
88 |
89 | #endif
90 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/电商播报/DemoDianshang.m:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | //
7 | // DemoDianshang.m
8 | // WMZBanner
9 | //
10 | // Created by wmz on 2019/12/19.
11 | // Copyright © 2019 wmz. All rights reserved.
12 | //
13 |
14 | #import "DemoDianshang.h"
15 | #import "WMZBannerView.h"
16 | #import "marqueCell.h"
17 | #import "KuaiBaoCell.h"
18 | @interface DemoDianshang ()
19 |
20 | @end
21 |
22 | @implementation DemoDianshang
23 |
24 | - (void)viewDidLoad {
25 | [super viewDidLoad];
26 |
27 | self.view.backgroundColor = BannerColor(0xeeeeee);
28 |
29 | [self demoTwo];
30 | [self demoThree];
31 |
32 | }
33 |
34 |
35 | - (void)demoTwo{
36 |
37 | NSArray *data = @[
38 | @{@"name":@"五千万人都在玩的天猫农场",@"detail":@"快去领取>>"},
39 | @{@"name":@"主人,你的阳光要被偷啦",@"detail":@"快去领取>>"},
40 | @{@"name":@"免费兑换水果",@"detail":@"立即领取>>"},
41 | @{@"name":@"免费兑换红包",@"detail":@"快去领取>>"},
42 | ];
43 |
44 | WMZBannerParam *param = BannerParam()
45 | .wFrameSet(CGRectMake(10, BannerHeight/4+60, BannerWitdh-20, 50))
46 | .wMyCellClassNamesSet(@"marqueCell")
47 | .wMyCellSet(^UICollectionViewCell *(NSIndexPath *indexPath, UICollectionView *collectionView, id model, UIImageView *bgImageView,NSArray*dataArr) {
48 | //自定义视图
49 | marqueCell *cell = (marqueCell *)[collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([marqueCell class]) forIndexPath:indexPath];
50 | cell.label.text = model[@"name"];
51 | [cell.detailBtn setTitle:model[@"detail"] forState:UIControlStateNormal];
52 | return cell;
53 | })
54 | .wDataSet(data)
55 | //关闭手指滑动
56 | .wCanFingerSlidingSet(NO)
57 | .wHideBannerControlSet(YES)
58 | //开启循环滚动
59 | .wRepeatSet(YES)
60 | //开启自动滚动
61 | .wAutoScrollSet(YES)
62 | .wVerticalSet(YES);
63 | WMZBannerView *viewMarque = [[WMZBannerView alloc]initConfigureWithModel:param];
64 | [self.view addSubview:viewMarque];
65 | }
66 |
67 | - (void)demoThree{
68 | NSArray *data = @[
69 | @{@"name":@"谁说的手动手动手动手动搜得到 手动手动手动",@"detail":@"最新"},
70 | @{@"name":@"麒麟880已经玩脱了,马上属于5g",@"detail":@"热门"},
71 | @{@"name":@"华为年底拼了,p30",@"detail":@"推荐"},
72 | @{@"name":@"画质慢,强大的配置",@"detail":@"HOT"},
73 | ];
74 |
75 | WMZBannerParam *param = BannerParam()
76 | .wFrameSet(CGRectMake(10, BannerHeight/4+140, BannerWitdh-20, 50))
77 | .wMyCellClassNamesSet(@"KuaiBaoCell")
78 | //xib
79 | // .wXibCellClassNamesSet(@"KuaiBaoCell")
80 | .wMyCellSet(^UICollectionViewCell *(NSIndexPath *indexPath, UICollectionView *collectionView, id model, UIImageView *bgImageView,NSArray*dataArr) {
81 | //自定义视图
82 | KuaiBaoCell *cell = (KuaiBaoCell *)[collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([KuaiBaoCell class]) forIndexPath:indexPath];
83 | cell.label.text = model[@"detail"];
84 | cell.detailBtn.text = model[@"name"];
85 | return cell;
86 | })
87 | .wDataSet(data)
88 | //关闭手指滑动
89 | .wCanFingerSlidingSet(NO)
90 | .wHideBannerControlSet(YES)
91 | //开启循环滚动
92 | .wRepeatSet(YES)
93 | //开启自动滚动
94 | .wAutoScrollSet(YES)
95 | .wVerticalSet(YES);
96 | WMZBannerView *viewMarque = [[WMZBannerView alloc]initConfigureWithModel:param];
97 | [self.view addSubview:viewMarque];
98 |
99 |
100 | }
101 | - (void)dealloc{
102 |
103 | }
104 | @end
105 |
--------------------------------------------------------------------------------
/WMZBanner/Demo/天猫样式/DemoTianMao.m:
--------------------------------------------------------------------------------
1 | //
2 | // DemoTianMao.m
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/12/16.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 | #import "DemoTianMao.h"
10 | #import "WMZBannerView.h"
11 | #import "TianMaoCell.h"
12 | @interface DemoTianMao ()
13 | @property(nonatomic,strong)WMZBannerView *bannerView;
14 | @end
15 |
16 | @implementation DemoTianMao
17 |
18 | - (void)viewDidLoad {
19 | [super viewDidLoad];
20 |
21 | self.view.backgroundColor = [UIColor whiteColor];
22 |
23 | WMZBannerParam *param =
24 | BannerParam()
25 | //自定义视图必传
26 | .wMyCellClassNameSet(@"TianMaoCell")
27 | .wMyCellSet(^UICollectionViewCell *(NSIndexPath *indexPath, UICollectionView *collectionView, id model, UIImageView *bgImageView,NSArray*dataArr) {
28 | //自定义视图
29 | TianMaoCell *cell = (TianMaoCell *)[collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([TianMaoCell class]) forIndexPath:indexPath];
30 | cell.titleLa.text = model[@"name"];
31 | cell.topLa.backgroundColor = model[@"color"];
32 | cell.bottomView.backgroundColor = model[@"color"];
33 | [cell.backImage sd_setImageWithURL:[NSURL URLWithString:model[@"icon"]] placeholderImage:nil];
34 | return cell;
35 | })
36 | .wFrameSet(CGRectMake(0, BannerHeight*0.3, BannerWitdh, BannerHeight*0.4))
37 | .wDataSet([self getData])
38 | //关闭pageControl
39 | .wHideBannerControlSet(YES)
40 | .wSelectIndexSet(2)
41 | //开启缩放
42 | .wScaleSet(YES)
43 | //自定义item的大小
44 | .wItemSizeSet(CGSizeMake(BannerWitdh*0.55, BannerHeight*0.4))
45 | //固定移动的距离
46 | .wContentOffsetXSet(0.32)
47 | //循环
48 | .wRepeatSet(YES)
49 | //毛玻璃背景的高度系数
50 | .wEffectHeightSet(0.8)
51 | //自动滚动
52 | .wAutoScrollSet(YES)
53 | //整体左右间距 设置为 (1-0.32)*wItemSize
54 | .wSectionInsetSet(UIEdgeInsetsMake(0,BannerWitdh*0.55*0.68, 0, BannerWitdh*0.55*0.68))
55 | //间距
56 | .wLineSpacingSet(10)
57 | //开启背景毛玻璃
58 | .wEffectSet(YES)
59 |
60 | ;
61 | self.bannerView = [[WMZBannerView alloc]initConfigureWithModel:param];
62 | [self.view addSubview:self.bannerView];
63 | }
64 |
65 | - (NSArray*)getData{
66 | return @[
67 | @{
68 | @"name":@"天猫精灵,每天晚安闹钟1",
69 | @"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576501052339&di=92f3a70f4a5a52a5a3d2038e1442d2b7&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01fd035c626614a801203d2261c846.jpg%401280w_1l_2o_100sh.jpg"
70 | , @"color":BannerColor(0x035eef)
71 | },
72 | @{
73 | @"name":@"天猫精灵,每天晚安闹钟3",
74 | @"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576501052339&di=9b3a0de1a35a502272c5d2c0788a2e55&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10%2F266%2Fw640h426%2F20180321%2F97f6-fyskeue0515269.jpg",
75 | @"color":BannerColor(0x00D762)},
76 | @{
77 | @"name":@"天猫精灵,每天晚安闹钟3",
78 | @"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576501052338&di=9b686119c43280dccc0e523e3533a2b2&imgtype=0&src=http%3A%2F%2Fimg1.gtimg.com%2F19%2F1934%2F193450%2F19345029_1200x1000_0.jpg",
79 | @"color":BannerColor(0xD41B14)},
80 | @{
81 | @"name":@"天猫精灵,每天晚安闹钟4",
82 | @"icon":@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576501052336&di=6c5774392c54591c03ff4f6587c75848&imgtype=0&src=http%3A%2F%2Fimg.265g.com%2Fuserup%2F1111%2F201111071016446505.jpg"
83 | ,@"color":BannerColor(0xF5DE95)
84 | }
85 | ];
86 | }
87 |
88 |
89 | - (void)dealloc{
90 |
91 | }
92 |
93 | @end
94 |
--------------------------------------------------------------------------------
/WMZBanner.xcodeproj/xcuserdata/wmz.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
9 |
16 |
17 |
18 |
20 |
32 |
33 |
34 |
36 |
48 |
49 |
50 |
52 |
64 |
65 |
66 |
68 |
80 |
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerConfig.h:
--------------------------------------------------------------------------------
1 | //
2 | // WMZBannerConfig.h
3 | // WMZBanner
4 | //
5 | // Created by wmz on 2019/9/6.
6 | // Copyright © 2019 wmz. All rights reserved.
7 | //
8 |
9 |
10 |
11 | #ifndef WMZBannerConfig_h
12 | #define WMZBannerConfig_h
13 |
14 | #if __has_include()
15 | #import
16 | #else
17 | #import "UIImageView+WebCache.h"
18 | #endif
19 |
20 | #define BANNERCOUNT 500
21 |
22 | #define BannerWitdh [UIScreen mainScreen].bounds.size.width
23 | #define BannerHeight [UIScreen mainScreen].bounds.size.height
24 |
25 | #define BannerWeakSelf(obj) __weak typeof(obj) weakObject = obj;
26 | #define BannerStrongSelf(obj) __strong typeof(obj) strongObject = weakObject;
27 |
28 | #define BannerColor(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
29 |
30 | #define WMZBannerPropStatementAndPropSetFuncStatement(propertyModifier,className, propertyPointerType, propertyName) \
31 | @property(nonatomic,propertyModifier)propertyPointerType propertyName; \
32 | - (className * (^) (propertyPointerType propertyName)) propertyName##Set;
33 |
34 | #define WMZBannerPropSetFuncImplementation(className, propertyPointerType, propertyName) \
35 | - (className * (^) (propertyPointerType propertyName))propertyName##Set{ \
36 | return ^(propertyPointerType propertyName) { \
37 | self->_##propertyName = propertyName; \
38 | return self; \
39 | }; \
40 | }
41 |
42 |
43 | /*
44 | * cell的block
45 | */
46 | typedef UICollectionViewCell* (^BannerCellCallBlock)(NSIndexPath *indexPath,UICollectionView* collectionView,id model,UIImageView* bgImageView,NSArray*dataArr);
47 |
48 | /*
49 | * 点击
50 | */
51 | typedef void (^BannerClickBlock)(id anyID,NSInteger index);
52 |
53 | /*
54 | * 自定义pageControl
55 | */
56 | typedef void (^BannerPageControl)(UIControl* pageControl);
57 |
58 | /*
59 | * 点击 ,可获取居中cell
60 | */
61 | typedef void (^BannerCenterClickBlock)(id anyID,NSInteger index,BOOL isCenter,UICollectionViewCell* cell);
62 |
63 | /*
64 | * 滚动结束
65 | */
66 | typedef void (^BannerScrollEndBlock)(id anyID,NSInteger index,BOOL isCenter,UICollectionViewCell* cell);
67 |
68 | /*
69 | * 滚动
70 | */
71 | typedef void (^BannerScrollBlock)(CGPoint point);
72 |
73 | /*
74 | * 自定义下划线
75 | */
76 | typedef void (^BannerSpecialLine)(UIView *line);
77 |
78 | /*
79 | *cell动画的位置
80 | */
81 | typedef enum :NSInteger{
82 | BannerCellPositionCenter = 0, //居中 默认
83 | BannerCellPositionBottom = 1, //置底
84 | BannerCellPositionTop = 2, //顶部
85 | }BannerCellPosition;
86 |
87 |
88 | /*
89 | *特殊样式
90 | */
91 | typedef enum :NSInteger{
92 | SpecialStyleLine = 1, //下划线
93 | SpecialStyleFirstScale = 2, //首个变大效果
94 | }SpecialStyle;
95 |
96 | /*
97 | *pageControl的位置
98 | */
99 | typedef enum :NSInteger{
100 | BannerControlCenter = 0, //居中 默认
101 | BannerControlLeft = 1, //左下
102 | BannerControlRight = 2, //右下
103 | }BannerControlPosition;
104 |
105 |
106 |
107 | #endif /* WMZBannerConfig_h */
108 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIImageView+WebCache.h"
10 | #import "objc/runtime.h"
11 | #import "UIView+WebCacheOperation.h"
12 | #import "UIView+WebCache.h"
13 |
14 | @implementation UIImageView (WebCache)
15 |
16 | - (void)sd_setImageWithURL:(nullable NSURL *)url {
17 | [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
18 | }
19 |
20 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder {
21 | [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
22 | }
23 |
24 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options {
25 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil];
26 | }
27 |
28 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context {
29 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options context:context progress:nil completed:nil];
30 | }
31 |
32 | - (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock {
33 | [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock];
34 | }
35 |
36 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock {
37 | [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock];
38 | }
39 |
40 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock {
41 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock];
42 | }
43 |
44 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDImageLoaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock {
45 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options context:nil progress:progressBlock completed:completedBlock];
46 | }
47 |
48 | - (void)sd_setImageWithURL:(nullable NSURL *)url
49 | placeholderImage:(nullable UIImage *)placeholder
50 | options:(SDWebImageOptions)options
51 | context:(nullable SDWebImageContext *)context
52 | progress:(nullable SDImageLoaderProgressBlock)progressBlock
53 | completed:(nullable SDExternalCompletionBlock)completedBlock {
54 | [self sd_internalSetImageWithURL:url
55 | placeholderImage:placeholder
56 | options:options
57 | context:context
58 | setImageBlock:nil
59 | progress:progressBlock
60 | completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
61 | if (completedBlock) {
62 | completedBlock(image, error, cacheType, imageURL);
63 | }
64 | }];
65 | }
66 |
67 | @end
68 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIImageView+HighlightedWebCache.h"
10 |
11 | #if SD_UIKIT
12 |
13 | #import "UIView+WebCacheOperation.h"
14 | #import "UIView+WebCache.h"
15 | #import "SDInternalMacros.h"
16 |
17 | static NSString * const SDHighlightedImageOperationKey = @"UIImageViewImageOperationHighlighted";
18 |
19 | @implementation UIImageView (HighlightedWebCache)
20 |
21 | - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url {
22 | [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil];
23 | }
24 |
25 | - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options {
26 | [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil];
27 | }
28 |
29 | - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context {
30 | [self sd_setHighlightedImageWithURL:url options:options context:context progress:nil completed:nil];
31 | }
32 |
33 | - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock {
34 | [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:completedBlock];
35 | }
36 |
37 | - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock {
38 | [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:completedBlock];
39 | }
40 |
41 | - (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(nullable SDImageLoaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock {
42 | [self sd_setHighlightedImageWithURL:url options:options context:nil progress:progressBlock completed:completedBlock];
43 | }
44 |
45 | - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url
46 | options:(SDWebImageOptions)options
47 | context:(nullable SDWebImageContext *)context
48 | progress:(nullable SDImageLoaderProgressBlock)progressBlock
49 | completed:(nullable SDExternalCompletionBlock)completedBlock {
50 | @weakify(self);
51 | SDWebImageMutableContext *mutableContext;
52 | if (context) {
53 | mutableContext = [context mutableCopy];
54 | } else {
55 | mutableContext = [NSMutableDictionary dictionary];
56 | }
57 | mutableContext[SDWebImageContextSetImageOperationKey] = SDHighlightedImageOperationKey;
58 | [self sd_internalSetImageWithURL:url
59 | placeholderImage:nil
60 | options:options
61 | context:mutableContext
62 | setImageBlock:^(UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
63 | @strongify(self);
64 | self.highlightedImage = image;
65 | }
66 | progress:progressBlock
67 | completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
68 | if (completedBlock) {
69 | completedBlock(image, error, cacheType, imageURL);
70 | }
71 | }];
72 | }
73 |
74 | @end
75 |
76 | #endif
77 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageLoadersManager.h"
10 | #import "SDWebImageDownloader.h"
11 | #import "SDInternalMacros.h"
12 |
13 | @interface SDImageLoadersManager ()
14 |
15 | @property (nonatomic, strong, nonnull) dispatch_semaphore_t loadersLock;
16 |
17 | @end
18 |
19 | @implementation SDImageLoadersManager
20 | {
21 | NSMutableArray>* _imageLoaders;
22 | }
23 |
24 | + (SDImageLoadersManager *)sharedManager {
25 | static dispatch_once_t onceToken;
26 | static SDImageLoadersManager *manager;
27 | dispatch_once(&onceToken, ^{
28 | manager = [[SDImageLoadersManager alloc] init];
29 | });
30 | return manager;
31 | }
32 |
33 | - (instancetype)init {
34 | self = [super init];
35 | if (self) {
36 | // initialize with default image loaders
37 | _imageLoaders = [NSMutableArray arrayWithObject:[SDWebImageDownloader sharedDownloader]];
38 | _loadersLock = dispatch_semaphore_create(1);
39 | }
40 | return self;
41 | }
42 |
43 | - (NSArray> *)loaders {
44 | SD_LOCK(self.loadersLock);
45 | NSArray>* loaders = [_imageLoaders copy];
46 | SD_UNLOCK(self.loadersLock);
47 | return loaders;
48 | }
49 |
50 | - (void)setLoaders:(NSArray> *)loaders {
51 | SD_LOCK(self.loadersLock);
52 | [_imageLoaders removeAllObjects];
53 | if (loaders.count) {
54 | [_imageLoaders addObjectsFromArray:loaders];
55 | }
56 | SD_UNLOCK(self.loadersLock);
57 | }
58 |
59 | #pragma mark - Loader Property
60 |
61 | - (void)addLoader:(id)loader {
62 | if (![loader conformsToProtocol:@protocol(SDImageLoader)]) {
63 | return;
64 | }
65 | SD_LOCK(self.loadersLock);
66 | [_imageLoaders addObject:loader];
67 | SD_UNLOCK(self.loadersLock);
68 | }
69 |
70 | - (void)removeLoader:(id)loader {
71 | if (![loader conformsToProtocol:@protocol(SDImageLoader)]) {
72 | return;
73 | }
74 | SD_LOCK(self.loadersLock);
75 | [_imageLoaders removeObject:loader];
76 | SD_UNLOCK(self.loadersLock);
77 | }
78 |
79 | #pragma mark - SDImageLoader
80 |
81 | - (BOOL)canRequestImageForURL:(nullable NSURL *)url {
82 | NSArray> *loaders = self.loaders;
83 | for (id loader in loaders.reverseObjectEnumerator) {
84 | if ([loader canRequestImageForURL:url]) {
85 | return YES;
86 | }
87 | }
88 | return NO;
89 | }
90 |
91 | - (id)requestImageWithURL:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
92 | if (!url) {
93 | return nil;
94 | }
95 | NSArray> *loaders = self.loaders;
96 | for (id loader in loaders.reverseObjectEnumerator) {
97 | if ([loader canRequestImageForURL:url]) {
98 | return [loader requestImageWithURL:url options:options context:context progress:progressBlock completed:completedBlock];
99 | }
100 | }
101 | return nil;
102 | }
103 |
104 | - (BOOL)shouldBlockFailedURLWithURL:(NSURL *)url error:(NSError *)error {
105 | NSArray> *loaders = self.loaders;
106 | for (id loader in loaders.reverseObjectEnumerator) {
107 | if ([loader canRequestImageForURL:url]) {
108 | return [loader shouldBlockFailedURLWithURL:url error:error];
109 | }
110 | }
111 | return NO;
112 | }
113 |
114 | @end
115 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDAnimatedImageRep.h"
10 |
11 | #if SD_MAC
12 |
13 | #import "SDImageGIFCoderInternal.h"
14 | #import "SDImageAPNGCoderInternal.h"
15 |
16 | @implementation SDAnimatedImageRep {
17 | CGImageSourceRef _imageSource;
18 | }
19 |
20 | - (void)dealloc {
21 | if (_imageSource) {
22 | CFRelease(_imageSource);
23 | _imageSource = NULL;
24 | }
25 | }
26 |
27 | // `NSBitmapImageRep`'s `imageRepWithData:` is not designed initlizer
28 | + (instancetype)imageRepWithData:(NSData *)data {
29 | SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:data];
30 | return imageRep;
31 | }
32 |
33 | // We should override init method for `NSBitmapImageRep` to do initlize about animated image format
34 | - (instancetype)initWithData:(NSData *)data {
35 | self = [super initWithData:data];
36 | if (self) {
37 | CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL);
38 | if (!imageSource) {
39 | return self;
40 | }
41 | _imageSource = imageSource;
42 | NSUInteger frameCount = CGImageSourceGetCount(imageSource);
43 | if (frameCount <= 1) {
44 | return self;
45 | }
46 | CFStringRef type = CGImageSourceGetType(imageSource);
47 | if (!type) {
48 | return self;
49 | }
50 | if (CFStringCompare(type, kUTTypeGIF, 0) == kCFCompareEqualTo) {
51 | // GIF
52 | // Do nothing because NSBitmapImageRep support it
53 | } else if (CFStringCompare(type, kUTTypePNG, 0) == kCFCompareEqualTo) {
54 | // APNG
55 | // Do initilize about frame count, current frame/duration and loop count
56 | [self setProperty:NSImageFrameCount withValue:@(frameCount)];
57 | [self setProperty:NSImageCurrentFrame withValue:@(0)];
58 | NSUInteger loopCount = [[SDImageAPNGCoder sharedCoder] sd_imageLoopCountWithSource:imageSource];
59 | [self setProperty:NSImageLoopCount withValue:@(loopCount)];
60 | }
61 | }
62 | return self;
63 | }
64 |
65 | // `NSBitmapImageRep` will use `kCGImagePropertyGIFDelayTime` whenever you call `setProperty:withValue:` with `NSImageCurrentFrame` to change the current frame. We override it and use the actual `kCGImagePropertyGIFUnclampedDelayTime` if need.
66 | - (void)setProperty:(NSBitmapImageRepPropertyKey)property withValue:(id)value {
67 | [super setProperty:property withValue:value];
68 | if ([property isEqualToString:NSImageCurrentFrame]) {
69 | // Access the image source
70 | CGImageSourceRef imageSource = _imageSource;
71 | if (!imageSource) {
72 | return;
73 | }
74 | // Check format type
75 | CFStringRef type = CGImageSourceGetType(imageSource);
76 | if (!type) {
77 | return;
78 | }
79 | NSUInteger index = [value unsignedIntegerValue];
80 | float frameDuration = 0;
81 | if (CFStringCompare(type, kUTTypeGIF, 0) == kCFCompareEqualTo) {
82 | // GIF
83 | frameDuration = [[SDImageGIFCoder sharedCoder] sd_frameDurationAtIndex:index source:imageSource];
84 | } else if (CFStringCompare(type, kUTTypePNG, 0) == kCFCompareEqualTo) {
85 | // APNG
86 | frameDuration = [[SDImageAPNGCoder sharedCoder] sd_frameDurationAtIndex:index source:imageSource];
87 | }
88 | if (!frameDuration) {
89 | return;
90 | }
91 | // Reset super frame duration with the actual frame duration
92 | [super setProperty:NSImageCurrentFrameDuration withValue:@(frameDuration)];
93 | }
94 | }
95 |
96 | @end
97 |
98 | #endif
99 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | #if SD_UIKIT || SD_MAC
12 |
13 | #import "SDAnimatedImage.h"
14 |
15 | /**
16 | A drop-in replacement for UIImageView/NSImageView, you can use this for animated image rendering.
17 | Call `setImage:` with `UIImage(NSImage)` which conform to `SDAnimatedImage` protocol will start animated image rendering. Call with normal UIImage(NSImage) will back to normal UIImageView(NSImageView) rendering
18 | For UIKit: use `-startAnimating`, `-stopAnimating` to control animating. `isAnimating` to check animation state.
19 | For AppKit: use `-setAnimates:` to control animating, `animates` to check animation state. This view is layer-backed.
20 | */
21 | @interface SDAnimatedImageView : UIImageView
22 |
23 | /**
24 | Current display frame image.
25 | */
26 | @property (nonatomic, strong, readonly, nullable) UIImage *currentFrame;
27 | /**
28 | Current frame index, zero based. This value is KVO Compliance.
29 | */
30 | @property (nonatomic, assign, readonly) NSUInteger currentFrameIndex;
31 | /**
32 | Current loop count since its latest animating. This value is KVO Compliance.
33 | */
34 | @property (nonatomic, assign, readonly) NSUInteger currentLoopCount;
35 | /**
36 | YES to choose `animationRepeatCount` property for animation loop count. No to use animated image's `animatedImageLoopCount` instead.
37 | Default is NO.
38 | */
39 | @property (nonatomic, assign) BOOL shouldCustomLoopCount;
40 | /**
41 | Total loop count for animated image rendering. Default is animated image's loop count.
42 | If you need to set custom loop count, set `shouldCustomLoopCount` to YES and change this value.
43 | This class override UIImageView's `animationRepeatCount` property on iOS, use this property as well.
44 | */
45 | @property (nonatomic, assign) NSInteger animationRepeatCount;
46 | /**
47 | Provide a max buffer size by bytes. This is used to adjust frame buffer count and can be useful when the decoding cost is expensive (such as Animated WebP software decoding). Default is 0.
48 | `0` means automatically adjust by calculating current memory usage.
49 | `1` means without any buffer cache, each of frames will be decoded and then be freed after rendering. (Lowest Memory and Highest CPU)
50 | `NSUIntegerMax` means cache all the buffer. (Lowest CPU and Highest Memory)
51 | */
52 | @property (nonatomic, assign) NSUInteger maxBufferSize;
53 | /**
54 | Whehter or not to enable incremental image load for animated image. This is for the animated image which `sd_isIncremental` is YES (See `UIImage+Metadata.h`). If enable, animated image rendering will stop at the last frame available currently, and continue when another `setImage:` trigger, where the new animated image's `animatedImageData` should be updated from the previous one. If the `sd_isIncremental` is NO. The incremental image load stop.
55 | @note If you are confused about this description, open Chrome browser to view some large GIF images with low network speed to see the animation behavior.
56 | @note The best practice to use incremental load is using `initWithAnimatedCoder:scale:` in `SDAnimatedImage` with animated coder which conform to `SDProgressiveImageCoder` as well. Then call incremental update and incremental decode method to produce the image.
57 | Default is YES. Set to NO to only render the static poster for incremental animated image.
58 | */
59 | @property (nonatomic, assign) BOOL shouldIncrementalLoad;
60 |
61 | #if SD_UIKIT
62 | /**
63 | You can specify a runloop mode to let it rendering.
64 | Default is NSRunLoopCommonModes on multi-core iOS device, NSDefaultRunLoopMode on single-core iOS device
65 | */
66 | @property (nonatomic, copy, nonnull) NSRunLoopMode runLoopMode;
67 | #endif
68 | @end
69 |
70 | #endif
71 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDWebImageCompat.h"
10 |
11 | #if SD_UIKIT || SD_MAC
12 |
13 | /**
14 | A protocol to custom the indicator during the image loading.
15 | All of these methods are called from main queue.
16 | */
17 | @protocol SDWebImageIndicator
18 |
19 | @required
20 | /**
21 | The view associate to the indicator.
22 |
23 | @return The indicator view
24 | */
25 | @property (nonatomic, strong, readonly, nonnull) UIView *indicatorView;
26 |
27 | /**
28 | Start the animating for indicator.
29 | */
30 | - (void)startAnimatingIndicator;
31 |
32 | /**
33 | Stop the animating for indicator.
34 | */
35 | - (void)stopAnimatingIndicator;
36 |
37 | @optional
38 | /**
39 | Update the loading progress (0-1.0) for indicator. Optional
40 |
41 | @param progress The progress, value between 0 and 1.0
42 | */
43 | - (void)updateIndicatorProgress:(double)progress;
44 |
45 | @end
46 |
47 | #pragma mark - Activity Indicator
48 |
49 | /**
50 | Activity indicator class.
51 | for UIKit(macOS), it use a `UIActivityIndicatorView`.
52 | for AppKit(macOS), it use a `NSProgressIndicator` with the spinning style.
53 | */
54 | @interface SDWebImageActivityIndicator : NSObject
55 |
56 | #if SD_UIKIT
57 | @property (nonatomic, strong, readonly, nonnull) UIActivityIndicatorView *indicatorView;
58 | #else
59 | @property (nonatomic, strong, readonly, nonnull) NSProgressIndicator *indicatorView;
60 | #endif
61 |
62 | @end
63 |
64 | /**
65 | Convenience way to use activity indicator.
66 | */
67 | @interface SDWebImageActivityIndicator (Conveniences)
68 |
69 | /// These indicator use the fixed color without dark mode support
70 | /// gray-style activity indicator
71 | @property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *grayIndicator;
72 | /// large gray-style activity indicator
73 | @property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *grayLargeIndicator;
74 | /// white-style activity indicator
75 | @property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *whiteIndicator;
76 | /// large white-style activity indicator
77 | @property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *whiteLargeIndicator;
78 | /// These indicator use the system style, supports dark mode if available (iOS 13+/macOS 10.14+)
79 | /// large activity indicator
80 | @property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *largeIndicator;
81 | /// medium activity indicator
82 | @property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *mediumIndicator;
83 |
84 | @end
85 |
86 | #pragma mark - Progress Indicator
87 |
88 | /**
89 | Progress indicator class.
90 | for UIKit(macOS), it use a `UIProgressView`.
91 | for AppKit(macOS), it use a `NSProgressIndicator` with the bar style.
92 | */
93 | @interface SDWebImageProgressIndicator : NSObject
94 |
95 | #if SD_UIKIT
96 | @property (nonatomic, strong, readonly, nonnull) UIProgressView *indicatorView;
97 | #else
98 | @property (nonatomic, strong, readonly, nonnull) NSProgressIndicator *indicatorView;
99 | #endif
100 |
101 | @end
102 |
103 | /**
104 | Convenience way to create progress indicator. Remember to specify the indicator width or use layout constraint if need.
105 | */
106 | @interface SDWebImageProgressIndicator (Conveniences)
107 |
108 | /// default-style progress indicator
109 | @property (nonatomic, class, nonnull, readonly) SDWebImageProgressIndicator *defaultIndicator;
110 | /// bar-style progress indicator
111 | @property (nonatomic, class, nonnull, readonly) SDWebImageProgressIndicator *barIndicator API_UNAVAILABLE(macos, tvos);
112 |
113 | @end
114 |
115 | #endif
116 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageGraphics.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageGraphics.h"
10 | #import "NSImage+Compatibility.h"
11 | #import "objc/runtime.h"
12 |
13 | #if SD_MAC
14 | static void *kNSGraphicsContextScaleFactorKey;
15 |
16 | static CGContextRef SDCGContextCreateBitmapContext(CGSize size, BOOL opaque, CGFloat scale) {
17 | if (scale == 0) {
18 | // Match `UIGraphicsBeginImageContextWithOptions`, reset to the scale factor of the device’s main screen if scale is 0.
19 | scale = [NSScreen mainScreen].backingScaleFactor;
20 | }
21 | size_t width = ceil(size.width * scale);
22 | size_t height = ceil(size.height * scale);
23 | if (width < 1 || height < 1) return NULL;
24 |
25 | //pre-multiplied BGRA for non-opaque, BGRX for opaque, 8-bits per component, as Apple's doc
26 | CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
27 | CGImageAlphaInfo alphaInfo = kCGBitmapByteOrder32Host | (opaque ? kCGImageAlphaNoneSkipFirst : kCGImageAlphaPremultipliedFirst);
28 | CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, kCGBitmapByteOrderDefault | alphaInfo);
29 | CGColorSpaceRelease(space);
30 | if (!context) {
31 | return NULL;
32 | }
33 | CGContextScaleCTM(context, scale, scale);
34 |
35 | return context;
36 | }
37 | #endif
38 |
39 | CGContextRef SDGraphicsGetCurrentContext(void) {
40 | #if SD_UIKIT || SD_WATCH
41 | return UIGraphicsGetCurrentContext();
42 | #else
43 | return NSGraphicsContext.currentContext.CGContext;
44 | #endif
45 | }
46 |
47 | void SDGraphicsBeginImageContext(CGSize size) {
48 | #if SD_UIKIT || SD_WATCH
49 | UIGraphicsBeginImageContext(size);
50 | #else
51 | SDGraphicsBeginImageContextWithOptions(size, NO, 1.0);
52 | #endif
53 | }
54 |
55 | void SDGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) {
56 | #if SD_UIKIT || SD_WATCH
57 | UIGraphicsBeginImageContextWithOptions(size, opaque, scale);
58 | #else
59 | CGContextRef context = SDCGContextCreateBitmapContext(size, opaque, scale);
60 | if (!context) {
61 | return;
62 | }
63 | NSGraphicsContext *graphicsContext = [NSGraphicsContext graphicsContextWithCGContext:context flipped:NO];
64 | objc_setAssociatedObject(graphicsContext, &kNSGraphicsContextScaleFactorKey, @(scale), OBJC_ASSOCIATION_RETAIN);
65 | CGContextRelease(context);
66 | [NSGraphicsContext saveGraphicsState];
67 | NSGraphicsContext.currentContext = graphicsContext;
68 | #endif
69 | }
70 |
71 | void SDGraphicsEndImageContext(void) {
72 | #if SD_UIKIT || SD_WATCH
73 | UIGraphicsEndImageContext();
74 | #else
75 | [NSGraphicsContext restoreGraphicsState];
76 | #endif
77 | }
78 |
79 | UIImage * SDGraphicsGetImageFromCurrentImageContext(void) {
80 | #if SD_UIKIT || SD_WATCH
81 | return UIGraphicsGetImageFromCurrentImageContext();
82 | #else
83 | NSGraphicsContext *context = NSGraphicsContext.currentContext;
84 | CGContextRef contextRef = context.CGContext;
85 | if (!contextRef) {
86 | return nil;
87 | }
88 | CGImageRef imageRef = CGBitmapContextCreateImage(contextRef);
89 | if (!imageRef) {
90 | return nil;
91 | }
92 | CGFloat scale = 0;
93 | NSNumber *scaleFactor = objc_getAssociatedObject(context, &kNSGraphicsContextScaleFactorKey);
94 | if ([scaleFactor isKindOfClass:[NSNumber class]]) {
95 | scale = scaleFactor.doubleValue;
96 | }
97 | if (!scale) {
98 | // reset to the scale factor of the device’s main screen if scale is 0.
99 | scale = [NSScreen mainScreen].backingScaleFactor;
100 | }
101 | NSImage *image = [[NSImage alloc] initWithCGImage:imageRef scale:scale orientation:kCGImagePropertyOrientationUp];
102 | CGImageRelease(imageRef);
103 | return image;
104 | #endif
105 | }
106 |
--------------------------------------------------------------------------------
/WMZBanner/WMZBanner/WMZBannerFadeLayout.m:
--------------------------------------------------------------------------------
1 |
2 | //
3 | // WMZBannerFadeLayout.m
4 | // WMZBanner
5 | //
6 | // Created by wmz on 2020/6/15.
7 | // Copyright © 2020 wmz. All rights reserved.
8 | //
9 |
10 | #import "WMZBannerFadeLayout.h"
11 | @interface WMZBannerFadeLayout()
12 | @property(nonatomic,assign)CGPoint collectionContenOffset;
13 | @property(nonatomic,assign)CGSize collectionContenSize;
14 | @property(nonatomic,assign)CGFloat last;
15 | @end
16 | @implementation WMZBannerFadeLayout
17 | - (instancetype)initConfigureWithModel:(WMZBannerParam *)param{
18 | if (self = [super init]) {
19 | self.param = param;
20 | }
21 | return self;
22 | }
23 |
24 | - (void)prepareLayout
25 | {
26 | [super prepareLayout];
27 | self.collectionView.bounces = NO;
28 | self.collectionView.pagingEnabled = YES;
29 | self.itemSize = self.param.wItemSize;
30 | self.minimumInteritemSpacing = (self.param.wFrame.size.height-self.param.wItemSize.height)/2;
31 | self.minimumLineSpacing = self.param.wLineSpacing;
32 | self.sectionInset = self.param.wSectionInset;
33 | self.scrollDirection = self.param.wVertical? UICollectionViewScrollDirectionVertical
34 | :UICollectionViewScrollDirectionHorizontal;
35 | }
36 |
37 | - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
38 | return [self cardOverLapTypeInRect:rect];
39 | }
40 |
41 | //卡片重叠
42 | - (NSArray *)cardOverLapTypeInRect:(CGRect)rect{
43 | NSInteger itemsCount = [self.collectionView numberOfItemsInSection:0];
44 | if (itemsCount <= 0) {
45 | return nil;
46 | }
47 | NSMutableArray *mArr = [[NSMutableArray alloc] init];
48 | if (self.param.wVertical) {
49 | if (self.collectionView.contentOffset.y>self.last) {
50 | self.right = YES;
51 | }else if (self.collectionView.contentOffset.yself.last) {
56 | self.right = YES;
57 | }else if (self.collectionView.contentOffset.x
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDAnimatedImageView+WebCache.h"
10 |
11 | #if SD_UIKIT || SD_MAC
12 |
13 | #import "UIView+WebCache.h"
14 | #import "SDAnimatedImage.h"
15 |
16 | @implementation SDAnimatedImageView (WebCache)
17 |
18 | - (void)sd_setImageWithURL:(nullable NSURL *)url {
19 | [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
20 | }
21 |
22 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder {
23 | [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
24 | }
25 |
26 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options {
27 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil];
28 | }
29 |
30 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context {
31 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options context:context progress:nil completed:nil];
32 | }
33 |
34 | - (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock {
35 | [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock];
36 | }
37 |
38 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock {
39 | [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock];
40 | }
41 |
42 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock {
43 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock];
44 | }
45 |
46 | - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDImageLoaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock {
47 | [self sd_setImageWithURL:url placeholderImage:placeholder options:options context:nil progress:progressBlock completed:completedBlock];
48 | }
49 |
50 | - (void)sd_setImageWithURL:(nullable NSURL *)url
51 | placeholderImage:(nullable UIImage *)placeholder
52 | options:(SDWebImageOptions)options
53 | context:(nullable SDWebImageContext *)context
54 | progress:(nullable SDImageLoaderProgressBlock)progressBlock
55 | completed:(nullable SDExternalCompletionBlock)completedBlock {
56 | Class animatedImageClass = [SDAnimatedImage class];
57 | SDWebImageMutableContext *mutableContext;
58 | if (context) {
59 | mutableContext = [context mutableCopy];
60 | } else {
61 | mutableContext = [NSMutableDictionary dictionary];
62 | }
63 | mutableContext[SDWebImageContextAnimatedImageClass] = animatedImageClass;
64 | [self sd_internalSetImageWithURL:url
65 | placeholderImage:placeholder
66 | options:options
67 | context:mutableContext
68 | setImageBlock:nil
69 | progress:progressBlock
70 | completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
71 | if (completedBlock) {
72 | completedBlock(image, error, cacheType, imageURL);
73 | }
74 | }];
75 | }
76 |
77 | @end
78 |
79 | #endif
80 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import
10 | #import "SDWebImageCompat.h"
11 |
12 | /// Operation execution order
13 | typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
14 | /**
15 | * Default value. All download operations will execute in queue style (first-in-first-out).
16 | */
17 | SDWebImageDownloaderFIFOExecutionOrder,
18 |
19 | /**
20 | * All download operations will execute in stack style (last-in-first-out).
21 | */
22 | SDWebImageDownloaderLIFOExecutionOrder
23 | };
24 |
25 | /**
26 | The class contains all the config for image downloader
27 | @note This class conform to NSCopying, make sure to add the property in `copyWithZone:` as well.
28 | */
29 | @interface SDWebImageDownloaderConfig : NSObject
30 |
31 | /**
32 | Gets the default downloader config used for shared instance or initialization when it does not provide any downloader config. Such as `SDWebImageDownloader.sharedDownloader`.
33 | @note You can modify the property on default downloader config, which can be used for later created downloader instance. The already created downloader instance does not get affected.
34 | */
35 | @property (nonatomic, class, readonly, nonnull) SDWebImageDownloaderConfig *defaultDownloaderConfig;
36 |
37 | /**
38 | * The maximum number of concurrent downloads.
39 | * Defaults to 6.
40 | */
41 | @property (nonatomic, assign) NSInteger maxConcurrentDownloads;
42 |
43 | /**
44 | * The timeout value (in seconds) for each download operation.
45 | * Defaults to 15.0.
46 | */
47 | @property (nonatomic, assign) NSTimeInterval downloadTimeout;
48 |
49 | /**
50 | * The minimum interval about progress percent during network downloading. Which means the next progress callback and current progress callback's progress percent difference should be larger or equal to this value. However, the final finish download progress callback does not get effected.
51 | * The value should be 0.0-1.0.
52 | * @note If you're using progressive decoding feature, this will also effect the image refresh rate.
53 | * @note This value may enhance the performance if you don't want progress callback too frequently.
54 | * Defaults to 0, which means each time we receive the new data from URLSession, we callback the progressBlock immediately.
55 | */
56 | @property (nonatomic, assign) double minimumProgressInterval;
57 |
58 | /**
59 | * The custom session configuration in use by NSURLSession. If you don't provide one, we will use `defaultSessionConfiguration` instead.
60 | * Defatuls to nil.
61 | * @note This property does not support dynamic changes, means it's immutable after the downloader instance initialized.
62 | */
63 | @property (nonatomic, strong, nullable) NSURLSessionConfiguration *sessionConfiguration;
64 |
65 | /**
66 | * Gets/Sets a subclass of `SDWebImageDownloaderOperation` as the default
67 | * `NSOperation` to be used each time SDWebImage constructs a request
68 | * operation to download an image.
69 | * Defaults to nil.
70 | * @note Passing `NSOperation` to set as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`.
71 | */
72 | @property (nonatomic, assign, nullable) Class operationClass;
73 |
74 | /**
75 | * Changes download operations execution order.
76 | * Defaults to `SDWebImageDownloaderFIFOExecutionOrder`.
77 | */
78 | @property (nonatomic, assign) SDWebImageDownloaderExecutionOrder executionOrder;
79 |
80 | /**
81 | * Set the default URL credential to be set for request operations.
82 | * Defaults to nil.
83 | */
84 | @property (nonatomic, copy, nullable) NSURLCredential *urlCredential;
85 |
86 | /**
87 | * Set username using for HTTP Basic authentication.
88 | * Defaults to nil.
89 | */
90 | @property (nonatomic, copy, nullable) NSString *username;
91 |
92 | /**
93 | * Set password using for HTTP Basic authentication.
94 | * Defautls to nil.
95 | */
96 | @property (nonatomic, copy, nullable) NSString *password;
97 |
98 | @end
99 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/SDImageCodersManager.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "SDImageCodersManager.h"
10 | #import "SDImageIOCoder.h"
11 | #import "SDImageGIFCoder.h"
12 | #import "SDImageAPNGCoder.h"
13 | #import "SDInternalMacros.h"
14 |
15 | @interface SDImageCodersManager ()
16 |
17 | @property (nonatomic, strong, nonnull) dispatch_semaphore_t codersLock;
18 |
19 | @end
20 |
21 | @implementation SDImageCodersManager
22 | {
23 | NSMutableArray> *_imageCoders;
24 | }
25 |
26 | + (nonnull instancetype)sharedManager {
27 | static dispatch_once_t once;
28 | static id instance;
29 | dispatch_once(&once, ^{
30 | instance = [self new];
31 | });
32 | return instance;
33 | }
34 |
35 | - (instancetype)init {
36 | if (self = [super init]) {
37 | // initialize with default coders
38 | _imageCoders = [NSMutableArray arrayWithArray:@[[SDImageIOCoder sharedCoder], [SDImageGIFCoder sharedCoder], [SDImageAPNGCoder sharedCoder]]];
39 | _codersLock = dispatch_semaphore_create(1);
40 | }
41 | return self;
42 | }
43 |
44 | - (NSArray> *)coders
45 | {
46 | SD_LOCK(self.codersLock);
47 | NSArray> *coders = [_imageCoders copy];
48 | SD_UNLOCK(self.codersLock);
49 | return coders;
50 | }
51 |
52 | - (void)setCoders:(NSArray> *)coders
53 | {
54 | SD_LOCK(self.codersLock);
55 | [_imageCoders removeAllObjects];
56 | if (coders.count) {
57 | [_imageCoders addObjectsFromArray:coders];
58 | }
59 | SD_UNLOCK(self.codersLock);
60 | }
61 |
62 | #pragma mark - Coder IO operations
63 |
64 | - (void)addCoder:(nonnull id)coder {
65 | if (![coder conformsToProtocol:@protocol(SDImageCoder)]) {
66 | return;
67 | }
68 | SD_LOCK(self.codersLock);
69 | [_imageCoders addObject:coder];
70 | SD_UNLOCK(self.codersLock);
71 | }
72 |
73 | - (void)removeCoder:(nonnull id)coder {
74 | if (![coder conformsToProtocol:@protocol(SDImageCoder)]) {
75 | return;
76 | }
77 | SD_LOCK(self.codersLock);
78 | [_imageCoders removeObject:coder];
79 | SD_UNLOCK(self.codersLock);
80 | }
81 |
82 | #pragma mark - SDImageCoder
83 | - (BOOL)canDecodeFromData:(NSData *)data {
84 | NSArray> *coders = self.coders;
85 | for (id coder in coders.reverseObjectEnumerator) {
86 | if ([coder canDecodeFromData:data]) {
87 | return YES;
88 | }
89 | }
90 | return NO;
91 | }
92 |
93 | - (BOOL)canEncodeToFormat:(SDImageFormat)format {
94 | NSArray> *coders = self.coders;
95 | for (id coder in coders.reverseObjectEnumerator) {
96 | if ([coder canEncodeToFormat:format]) {
97 | return YES;
98 | }
99 | }
100 | return NO;
101 | }
102 |
103 | - (UIImage *)decodedImageWithData:(NSData *)data options:(nullable SDImageCoderOptions *)options {
104 | if (!data) {
105 | return nil;
106 | }
107 | UIImage *image;
108 | NSArray> *coders = self.coders;
109 | for (id coder in coders.reverseObjectEnumerator) {
110 | if ([coder canDecodeFromData:data]) {
111 | image = [coder decodedImageWithData:data options:options];
112 | break;
113 | }
114 | }
115 |
116 | return image;
117 | }
118 |
119 | - (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format options:(nullable SDImageCoderOptions *)options {
120 | if (!image) {
121 | return nil;
122 | }
123 | NSArray> *coders = self.coders;
124 | for (id coder in coders.reverseObjectEnumerator) {
125 | if ([coder canEncodeToFormat:format]) {
126 | return [coder encodedDataWithImage:image format:format options:options];
127 | }
128 | }
129 | return nil;
130 | }
131 |
132 | @end
133 |
--------------------------------------------------------------------------------
/WMZBanner/SDWebImage/SDWebImage/Core/UIImage+Metadata.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | *
5 | * For the full copyright and license information, please view the LICENSE
6 | * file that was distributed with this source code.
7 | */
8 |
9 | #import "UIImage+Metadata.h"
10 | #import "NSImage+Compatibility.h"
11 | #import "objc/runtime.h"
12 |
13 | @implementation UIImage (Metadata)
14 |
15 | #if SD_UIKIT || SD_WATCH
16 |
17 | - (NSUInteger)sd_imageLoopCount {
18 | NSUInteger imageLoopCount = 0;
19 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_imageLoopCount));
20 | if ([value isKindOfClass:[NSNumber class]]) {
21 | imageLoopCount = value.unsignedIntegerValue;
22 | }
23 | return imageLoopCount;
24 | }
25 |
26 | - (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount {
27 | NSNumber *value = @(sd_imageLoopCount);
28 | objc_setAssociatedObject(self, @selector(sd_imageLoopCount), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
29 | }
30 |
31 | - (BOOL)sd_isAnimated {
32 | return (self.images != nil);
33 | }
34 |
35 | #else
36 |
37 | - (NSUInteger)sd_imageLoopCount {
38 | NSUInteger imageLoopCount = 0;
39 | NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
40 | NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
41 | NSBitmapImageRep *bitmapImageRep;
42 | if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
43 | bitmapImageRep = (NSBitmapImageRep *)imageRep;
44 | }
45 | if (bitmapImageRep) {
46 | imageLoopCount = [[bitmapImageRep valueForProperty:NSImageLoopCount] unsignedIntegerValue];
47 | }
48 | return imageLoopCount;
49 | }
50 |
51 | - (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount {
52 | NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
53 | NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
54 | NSBitmapImageRep *bitmapImageRep;
55 | if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
56 | bitmapImageRep = (NSBitmapImageRep *)imageRep;
57 | }
58 | if (bitmapImageRep) {
59 | [bitmapImageRep setProperty:NSImageLoopCount withValue:@(sd_imageLoopCount)];
60 | }
61 | }
62 |
63 | - (BOOL)sd_isAnimated {
64 | BOOL isGIF = NO;
65 | NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
66 | NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
67 | NSBitmapImageRep *bitmapImageRep;
68 | if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
69 | bitmapImageRep = (NSBitmapImageRep *)imageRep;
70 | }
71 | if (bitmapImageRep) {
72 | NSUInteger frameCount = [[bitmapImageRep valueForProperty:NSImageFrameCount] unsignedIntegerValue];
73 | isGIF = frameCount > 1 ? YES : NO;
74 | }
75 | return isGIF;
76 | }
77 |
78 | #endif
79 |
80 | - (SDImageFormat)sd_imageFormat {
81 | SDImageFormat imageFormat = SDImageFormatUndefined;
82 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_imageFormat));
83 | if ([value isKindOfClass:[NSNumber class]]) {
84 | imageFormat = value.integerValue;
85 | return imageFormat;
86 | }
87 | // Check CGImage's UTType, may return nil for non-Image/IO based image
88 | if (@available(iOS 9.0, tvOS 9.0, macOS 10.11, watchOS 2.0, *)) {
89 | CFStringRef uttype = CGImageGetUTType(self.CGImage);
90 | imageFormat = [NSData sd_imageFormatFromUTType:uttype];
91 | }
92 | return imageFormat;
93 | }
94 |
95 | - (void)setSd_imageFormat:(SDImageFormat)sd_imageFormat {
96 | objc_setAssociatedObject(self, @selector(sd_imageFormat), @(sd_imageFormat), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
97 | }
98 |
99 | - (void)setSd_isIncremental:(BOOL)sd_isIncremental {
100 | objc_setAssociatedObject(self, @selector(sd_isIncremental), @(sd_isIncremental), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
101 | }
102 |
103 | - (BOOL)sd_isIncremental {
104 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_isIncremental));
105 | return value.boolValue;
106 | }
107 |
108 | @end
109 |
--------------------------------------------------------------------------------