From 5eb1648c6410b1a440e510e60004474b5548b6ea Mon Sep 17 00:00:00 2001 From: Carles Roig Date: Fri, 29 Mar 2019 15:35:33 +0100 Subject: [PATCH 1/4] Convert DKCarouselView to Framework --- .../DKCarousel.xcodeproj/project.pbxproj | 400 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + DKCarousel/DKCarousel/DKCarousel.h | 16 + DKCarousel/DKCarousel/Info.plist | 22 + .../DKCarouselView}/DKCarouselView.h | 0 .../DKCarouselView}/DKCarouselView.m | 0 DKCarousel/Podfile | 7 + DKCarousel/Podfile.lock | 22 + .../FLAnimatedImage/FLAnimatedImage.h | 0 .../FLAnimatedImage/FLAnimatedImage.m | 0 .../FLAnimatedImage/FLAnimatedImageView.h | 0 .../FLAnimatedImage/FLAnimatedImageView.m | 0 .../Pods}/FLAnimatedImage/LICENSE | 0 .../Pods}/FLAnimatedImage/README.md | 0 DKCarousel/Pods/Manifest.lock | 22 + .../Pods/Pods.xcodeproj/project.pbxproj | 1078 +++++++++++++++++ .../Pods}/SDWebImage/LICENSE | 2 +- .../Pods}/SDWebImage/README.md | 128 +- .../FLAnimatedImageView+WebCache.h | 44 +- .../FLAnimatedImageView+WebCache.m | 215 ++++ .../SDWebImage/SDWebImage/NSButton+WebCache.h | 259 ++++ .../SDWebImage/SDWebImage/NSButton+WebCache.m | 147 +++ .../SDWebImage/NSData+ImageContentType.h | 20 +- .../SDWebImage/NSData+ImageContentType.m | 130 ++ .../SDWebImage/SDWebImage/NSImage+WebCache.h | 0 .../SDWebImage/SDWebImage/NSImage+WebCache.m | 11 +- .../SDWebImage/SDAnimatedImageRep.h | 20 + .../SDWebImage/SDAnimatedImageRep.m | 66 + .../SDWebImage/SDWebImage/SDImageCache.h | 49 +- .../SDWebImage/SDWebImage/SDImageCache.m | 406 +++++-- .../SDWebImage/SDImageCacheConfig.h | 79 ++ .../SDWebImage/SDImageCacheConfig.m | 30 + .../SDWebImage/SDWebImage/SDWebImageCoder.h | 119 ++ .../SDWebImage/SDWebImage/SDWebImageCoder.m | 31 + .../SDWebImage/SDWebImageCoderHelper.h | 52 + .../SDWebImage/SDWebImageCoderHelper.m | 258 ++++ .../SDWebImage/SDWebImageCodersManager.h | 58 + .../SDWebImage/SDWebImageCodersManager.m | 148 +++ .../SDWebImage/SDWebImage/SDWebImageCompat.h | 38 +- .../SDWebImage/SDWebImage/SDWebImageCompat.m | 28 +- .../SDWebImage/SDWebImageDownloader.h | 63 +- .../SDWebImage/SDWebImageDownloader.m | 434 +++++++ .../SDWebImageDownloaderOperation.h | 24 +- .../SDWebImageDownloaderOperation.m | 432 +++---- .../SDWebImage/SDWebImage/SDWebImageFrame.h | 34 + .../SDWebImage/SDWebImage/SDWebImageFrame.m | 28 + .../SDWebImage/SDWebImageGIFCoder.h | 23 + .../SDWebImage/SDWebImageGIFCoder.m | 184 +++ .../SDWebImage/SDWebImageImageIOCoder.h | 30 + .../SDWebImage/SDWebImageImageIOCoder.m | 536 ++++++++ .../SDWebImage/SDWebImage/SDWebImageManager.h | 63 +- .../SDWebImage/SDWebImage/SDWebImageManager.m | 220 ++-- .../SDWebImage/SDWebImageOperation.h | 0 .../SDWebImage/SDWebImagePrefetcher.h | 2 +- .../SDWebImage/SDWebImagePrefetcher.m | 36 +- .../SDWebImage/SDWebImageTransition.h | 98 ++ .../SDWebImage/SDWebImageTransition.m | 137 +++ .../SDWebImage/SDWebImage/UIButton+WebCache.h | 34 +- .../SDWebImage/SDWebImage/UIButton+WebCache.m | 78 +- .../SDWebImage/UIImage+ForceDecode.h | 2 - .../SDWebImage/UIImage+ForceDecode.m | 30 + .../Pods}/SDWebImage/SDWebImage/UIImage+GIF.h | 5 +- .../Pods/SDWebImage/SDWebImage/UIImage+GIF.m | 27 + .../SDWebImage/UIImage+MemoryCacheCost.h | 23 + .../SDWebImage/UIImage+MemoryCacheCost.m | 38 + .../SDWebImage/UIImage+MultiFormat.h | 37 + .../SDWebImage/UIImage+MultiFormat.m | 95 ++ .../UIImageView+HighlightedWebCache.h | 6 +- .../UIImageView+HighlightedWebCache.m | 0 .../SDWebImage/UIImageView+WebCache.h | 23 +- .../SDWebImage/UIImageView+WebCache.m | 65 +- .../SDWebImage/SDWebImage/UIView+WebCache.h | 140 +++ .../SDWebImage/SDWebImage/UIView+WebCache.m | 385 ++++++ .../SDWebImage/UIView+WebCacheOperation.h | 13 +- .../SDWebImage/UIView+WebCacheOperation.m | 73 ++ .../FLAnimatedImage/FLAnimatedImage-dummy.m | 5 + .../FLAnimatedImage-prefix.pch | 12 + .../FLAnimatedImage-umbrella.h | 18 + .../FLAnimatedImage/FLAnimatedImage.modulemap | 6 + .../FLAnimatedImage/FLAnimatedImage.xcconfig | 9 + .../FLAnimatedImage/Info.plist | 26 + .../Pods-DKCarousel/Info.plist | 26 + .../Pods-DKCarousel-acknowledgements.markdown | 52 + .../Pods-DKCarousel-acknowledgements.plist | 90 ++ .../Pods-DKCarousel/Pods-DKCarousel-dummy.m | 5 + .../Pods-DKCarousel-resources.sh | 118 ++ .../Pods-DKCarousel-umbrella.h | 16 + .../Pods-DKCarousel.debug.xcconfig | 9 + .../Pods-DKCarousel/Pods-DKCarousel.modulemap | 6 + .../Pods-DKCarousel.release.xcconfig | 9 + .../SDWebImage/Info.plist | 26 + .../SDWebImage/SDWebImage-dummy.m | 5 + .../SDWebImage/SDWebImage-prefix.pch | 12 + .../SDWebImage/SDWebImage-umbrella.h | 45 + .../SDWebImage/SDWebImage.modulemap | 6 + .../SDWebImage/SDWebImage.xcconfig | 10 + DKCarouselView.podspec | 2 +- 100 files changed, 7188 insertions(+), 681 deletions(-) create mode 100644 DKCarousel/DKCarousel.xcodeproj/project.pbxproj create mode 100644 DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata create mode 100644 DKCarousel/DKCarousel.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DKCarousel/DKCarousel/DKCarousel.h create mode 100644 DKCarousel/DKCarousel/Info.plist rename {DKCarouselView => DKCarousel/DKCarouselView}/DKCarouselView.h (100%) rename {DKCarouselView => DKCarousel/DKCarouselView}/DKCarouselView.m (100%) create mode 100644 DKCarousel/Podfile create mode 100644 DKCarousel/Podfile.lock rename {DKCarouselViewDemo => DKCarousel/Pods}/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/FLAnimatedImage/LICENSE (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/FLAnimatedImage/README.md (100%) create mode 100644 DKCarousel/Pods/Manifest.lock create mode 100644 DKCarousel/Pods/Pods.xcodeproj/project.pbxproj rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/LICENSE (94%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/README.md (57%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h (74%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/NSData+ImageContentType.h (60%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/NSImage+WebCache.h (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/NSImage+WebCache.m (59%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDImageCache.h (81%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDImageCache.m (59%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageCompat.h (67%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageCompat.m (63%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageDownloader.h (76%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h (82%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m (50%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageManager.h (74%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageManager.m (54%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImageOperation.h (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImagePrefetcher.h (98%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/SDWebImagePrefetcher.m (81%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIButton+WebCache.h (92%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIButton+WebCache.m (70%) rename DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.h => DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h (85%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIImage+GIF.h (69%) mode change 100755 => 100644 create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h (96%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m (100%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIImageView+WebCache.h (86%) rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIImageView+WebCache.m (62%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.h create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.m rename {DKCarouselViewDemo => DKCarousel/Pods}/SDWebImage/SDWebImage/UIView+WebCacheOperation.h (61%) create mode 100644 DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m create mode 100644 DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m create mode 100644 DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch create mode 100644 DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h create mode 100644 DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap create mode 100644 DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig create mode 100644 DKCarousel/Pods/Target Support Files/FLAnimatedImage/Info.plist create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Info.plist create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m create mode 100755 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap create mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig create mode 100644 DKCarousel/Pods/Target Support Files/SDWebImage/Info.plist create mode 100644 DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m create mode 100644 DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch create mode 100644 DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h create mode 100644 DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap create mode 100644 DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig diff --git a/DKCarousel/DKCarousel.xcodeproj/project.pbxproj b/DKCarousel/DKCarousel.xcodeproj/project.pbxproj new file mode 100644 index 0000000..343f41b --- /dev/null +++ b/DKCarousel/DKCarousel.xcodeproj/project.pbxproj @@ -0,0 +1,400 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D3379755224E5CD800FECA2C /* DKCarousel.h in Headers */ = {isa = PBXBuildFile; fileRef = D3379753224E5CD800FECA2C /* DKCarousel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D3379762224E5D0700FECA2C /* DKCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = D337975C224E5D0700FECA2C /* DKCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D3379763224E5D0700FECA2C /* DKCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3379761224E5D0700FECA2C /* DKCarouselView.m */; }; + FA81D53C02A5AA1E494B8181 /* Pods_DKCarousel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E43D9031CEB4F7602ECC92D9 /* Pods_DKCarousel.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5DE2A3C3BA628E7F48AB2F3E /* Pods-DKCarousel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarousel.release.xcconfig"; path = "Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig"; sourceTree = ""; }; + D3379750224E5CD800FECA2C /* DKCarousel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DKCarousel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D3379753224E5CD800FECA2C /* DKCarousel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DKCarousel.h; sourceTree = ""; }; + D3379754224E5CD800FECA2C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D337975C224E5D0700FECA2C /* DKCarouselView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKCarouselView.h; sourceTree = ""; }; + D3379761224E5D0700FECA2C /* DKCarouselView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKCarouselView.m; sourceTree = ""; }; + E43D9031CEB4F7602ECC92D9 /* Pods_DKCarousel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DKCarousel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F24E7895BE32CF0D478F6B34 /* Pods-DKCarousel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarousel.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D337974D224E5CD800FECA2C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FA81D53C02A5AA1E494B8181 /* Pods_DKCarousel.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 59CF3ADD6889341DB6CA468C /* Pods */ = { + isa = PBXGroup; + children = ( + F24E7895BE32CF0D478F6B34 /* Pods-DKCarousel.debug.xcconfig */, + 5DE2A3C3BA628E7F48AB2F3E /* Pods-DKCarousel.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + D3379746224E5CD800FECA2C = { + isa = PBXGroup; + children = ( + D3379752224E5CD800FECA2C /* DKCarousel */, + D337975B224E5D0700FECA2C /* DKCarouselView */, + D3379751224E5CD800FECA2C /* Products */, + 59CF3ADD6889341DB6CA468C /* Pods */, + DE995186006EE044F8482CB3 /* Frameworks */, + ); + sourceTree = ""; + }; + D3379751224E5CD800FECA2C /* Products */ = { + isa = PBXGroup; + children = ( + D3379750224E5CD800FECA2C /* DKCarousel.framework */, + ); + name = Products; + sourceTree = ""; + }; + D3379752224E5CD800FECA2C /* DKCarousel */ = { + isa = PBXGroup; + children = ( + D3379753224E5CD800FECA2C /* DKCarousel.h */, + D3379754224E5CD800FECA2C /* Info.plist */, + ); + path = DKCarousel; + sourceTree = ""; + }; + D337975B224E5D0700FECA2C /* DKCarouselView */ = { + isa = PBXGroup; + children = ( + D337975C224E5D0700FECA2C /* DKCarouselView.h */, + D3379761224E5D0700FECA2C /* DKCarouselView.m */, + ); + path = DKCarouselView; + sourceTree = ""; + }; + DE995186006EE044F8482CB3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E43D9031CEB4F7602ECC92D9 /* Pods_DKCarousel.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D337974B224E5CD800FECA2C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D3379762224E5D0700FECA2C /* DKCarouselView.h in Headers */, + D3379755224E5CD800FECA2C /* DKCarousel.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D337974F224E5CD800FECA2C /* DKCarousel */ = { + isa = PBXNativeTarget; + buildConfigurationList = D3379758224E5CD800FECA2C /* Build configuration list for PBXNativeTarget "DKCarousel" */; + buildPhases = ( + 204F6BBB6484E608995B25E4 /* [CP] Check Pods Manifest.lock */, + D337974B224E5CD800FECA2C /* Headers */, + D337974C224E5CD800FECA2C /* Sources */, + D337974D224E5CD800FECA2C /* Frameworks */, + D337974E224E5CD800FECA2C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DKCarousel; + productName = DKCarousel; + productReference = D3379750224E5CD800FECA2C /* DKCarousel.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D3379747224E5CD800FECA2C /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + TargetAttributes = { + D337974F224E5CD800FECA2C = { + CreatedOnToolsVersion = 10.2; + }; + }; + }; + buildConfigurationList = D337974A224E5CD800FECA2C /* Build configuration list for PBXProject "DKCarousel" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D3379746224E5CD800FECA2C; + productRefGroup = D3379751224E5CD800FECA2C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D337974F224E5CD800FECA2C /* DKCarousel */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D337974E224E5CD800FECA2C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 204F6BBB6484E608995B25E4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-DKCarousel-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D337974C224E5CD800FECA2C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3379763224E5D0700FECA2C /* DKCarouselView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D3379756224E5CD800FECA2C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D3379757224E5CD800FECA2C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + D3379759224E5CD800FECA2C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F24E7895BE32CF0D478F6B34 /* Pods-DKCarousel.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = DKCarousel/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.zhangao0086.DKCarousel; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + D337975A224E5CD800FECA2C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5DE2A3C3BA628E7F48AB2F3E /* Pods-DKCarousel.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = DKCarousel/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.zhangao0086.DKCarousel; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D337974A224E5CD800FECA2C /* Build configuration list for PBXProject "DKCarousel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D3379756224E5CD800FECA2C /* Debug */, + D3379757224E5CD800FECA2C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D3379758224E5CD800FECA2C /* Build configuration list for PBXNativeTarget "DKCarousel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D3379759224E5CD800FECA2C /* Debug */, + D337975A224E5CD800FECA2C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D3379747224E5CD800FECA2C /* Project object */; +} diff --git a/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..bddd22e --- /dev/null +++ b/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata b/DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6cc7385 --- /dev/null +++ b/DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/DKCarousel/DKCarousel.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DKCarousel/DKCarousel.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DKCarousel/DKCarousel.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DKCarousel/DKCarousel/DKCarousel.h b/DKCarousel/DKCarousel/DKCarousel.h new file mode 100644 index 0000000..9ec27cd --- /dev/null +++ b/DKCarousel/DKCarousel/DKCarousel.h @@ -0,0 +1,16 @@ +// +// DKCarousel.h +// DKCarousel +// +// Created by Carles Roig on 29/03/2019. +// + +#import + +//! Project version number for DKCarousel. +FOUNDATION_EXPORT double DKCarouselVersionNumber; + +//! Project version string for DKCarousel. +FOUNDATION_EXPORT const unsigned char DKCarouselVersionString[]; + +#import "DKCarouselView.h" diff --git a/DKCarousel/DKCarousel/Info.plist b/DKCarousel/DKCarousel/Info.plist new file mode 100644 index 0000000..e1fe4cf --- /dev/null +++ b/DKCarousel/DKCarousel/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/DKCarouselView/DKCarouselView.h b/DKCarousel/DKCarouselView/DKCarouselView.h similarity index 100% rename from DKCarouselView/DKCarouselView.h rename to DKCarousel/DKCarouselView/DKCarouselView.h diff --git a/DKCarouselView/DKCarouselView.m b/DKCarousel/DKCarouselView/DKCarouselView.m similarity index 100% rename from DKCarouselView/DKCarouselView.m rename to DKCarousel/DKCarouselView/DKCarouselView.m diff --git a/DKCarousel/Podfile b/DKCarousel/Podfile new file mode 100644 index 0000000..2cb0831 --- /dev/null +++ b/DKCarousel/Podfile @@ -0,0 +1,7 @@ +platform :ios, '10.0' + +target 'DKCarousel' do + use_frameworks! + + pod 'SDWebImage/GIF', '~> 4.4.6' +end diff --git a/DKCarousel/Podfile.lock b/DKCarousel/Podfile.lock new file mode 100644 index 0000000..fb76916 --- /dev/null +++ b/DKCarousel/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - FLAnimatedImage (1.0.12) + - SDWebImage/Core (4.4.6) + - SDWebImage/GIF (4.4.6): + - FLAnimatedImage (~> 1.0) + - SDWebImage/Core + +DEPENDENCIES: + - SDWebImage/GIF (~> 4.4.6) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - FLAnimatedImage + - SDWebImage + +SPEC CHECKSUMS: + FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 + SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8 + +PODFILE CHECKSUM: 9ffa18d50389a68e01dcafffe4901cf8ed7bfbfc + +COCOAPODS: 1.5.3 diff --git a/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h b/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h similarity index 100% rename from DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h rename to DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h diff --git a/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m b/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m similarity index 100% rename from DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m rename to DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m diff --git a/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h b/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h similarity index 100% rename from DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h rename to DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h diff --git a/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m b/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m similarity index 100% rename from DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m rename to DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m diff --git a/DKCarouselViewDemo/FLAnimatedImage/LICENSE b/DKCarousel/Pods/FLAnimatedImage/LICENSE similarity index 100% rename from DKCarouselViewDemo/FLAnimatedImage/LICENSE rename to DKCarousel/Pods/FLAnimatedImage/LICENSE diff --git a/DKCarouselViewDemo/FLAnimatedImage/README.md b/DKCarousel/Pods/FLAnimatedImage/README.md similarity index 100% rename from DKCarouselViewDemo/FLAnimatedImage/README.md rename to DKCarousel/Pods/FLAnimatedImage/README.md diff --git a/DKCarousel/Pods/Manifest.lock b/DKCarousel/Pods/Manifest.lock new file mode 100644 index 0000000..fb76916 --- /dev/null +++ b/DKCarousel/Pods/Manifest.lock @@ -0,0 +1,22 @@ +PODS: + - FLAnimatedImage (1.0.12) + - SDWebImage/Core (4.4.6) + - SDWebImage/GIF (4.4.6): + - FLAnimatedImage (~> 1.0) + - SDWebImage/Core + +DEPENDENCIES: + - SDWebImage/GIF (~> 4.4.6) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - FLAnimatedImage + - SDWebImage + +SPEC CHECKSUMS: + FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 + SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8 + +PODFILE CHECKSUM: 9ffa18d50389a68e01dcafffe4901cf8ed7bfbfc + +COCOAPODS: 1.5.3 diff --git a/DKCarousel/Pods/Pods.xcodeproj/project.pbxproj b/DKCarousel/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8dfaaed --- /dev/null +++ b/DKCarousel/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1078 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 00BF318007F3FDE4503CFEC6E6B2E801 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 4231531A9137F4E79E78BB2C2C76898A /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01694DCABA19FDA7C6DD921AE868963D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 371B238ADFC370BC40FD190FD5870536 /* UIView+WebCache.m */; }; + 0B0EDBF59FA39518C1CC02008B1F84ED /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = AE85BDDE5F734A2AE28C4A6130D92547 /* SDWebImagePrefetcher.m */; }; + 0B941CA235E004C81CD56E890A7A8171 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 409464D2B2B4EFA2622321607A6F5DA8 /* SDWebImageDownloaderOperation.m */; }; + 12595EF47FC1C733100BC2C0B88C9093 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F29FC38F6A36312246531CD851FA59A /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FBFB43EC7DA59FB18CDBA03408AB86E /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D599E1002F580DF9738F7FC6CE4F5885 /* FLAnimatedImageView.m */; }; + 2E288437A6F67FD4FF8215C987E54F88 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4153D1BE7FCB88E74F62BE3556D33C42 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 346BE6511A6E1868CAA684B80785D8F9 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 9374B87CB47A98A05B607DD8B111B6B0 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37683685A8F221EF5AEBF5E1FC11528A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + 40FFA995F90ADA0185C698A957719D35 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 05DABF84567A3F4B1A54A850BB7A7A0E /* FLAnimatedImageView+WebCache.m */; }; + 4317EE9D0C8B3FBF99538A0B8F08AA1D /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 08F2F73420BB03711A9455FF322DB239 /* SDWebImage-dummy.m */; }; + 488A11D9DEF80B0E1532D703A55879A0 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B13079EB7D56F3081F4F1EBF76B29700 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4CB4D92809B2AA5F1456CB4DF7E8BD05 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C515DD4C015DD03CF907F7109E0AE379 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F4431724A6BE7921E909B76B30622AD /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 544A231727ED681481C3308656285A40 /* SDAnimatedImageRep.m */; }; + 5102533DDA86BE8A790574ACE7726ADD /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0299C4447BBCFCFD1EEF516F6E0C51 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52AD8BCF52689C95FEEAF2968B6EABCA /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 59CBAAA5DCCE9CD1C2E2A31EC4ADBA21 /* NSButton+WebCache.m */; }; + 58368E2EACFD57926C10CAB844D42079 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C5D7D0D29CEBDF3629A43287BEAD7EF8 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 599408CC9A5C972DAA581163B5CCD474 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C80C7169485C78A8FB3774B6C3011A66 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5A25550CE5C78941F415582C30570F1E /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = BBC4C3DE2D01959CBD2C3C2AED3192C0 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5DF3480D9AEF5BF93EF11586B8D0CCF2 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EF1487F1FA034DC88C85EC4E2588656 /* FLAnimatedImage.m */; }; + 5F8FCC2A45C88021CC5AD07AFA61393E /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 94BE1B4027CED8E1A96D01DE4E34190B /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 608ABF2A50DB814CD4053DFCD3612294 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 671984BE5CBC2FC15120C58F765C3BF7 /* SDWebImageCompat.m */; }; + 60C3A6815BF3333C0B1864C92494FD5B /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 37E7087EB455FD0BE6EC709E394E3843 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 60DA3E7437BCD83DFCAE883D2B6AD01C /* Pods-DKCarousel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A07E691D79AA3CA8A53BFEC1402C053E /* Pods-DKCarousel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6108DC38584D05DDBF0F414EF2F96332 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8172349406BF607864DCA508A0C2CD81 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 65BB7B9FAC4B30DE8F2D145C49DB0A64 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */; }; + 680598B16E9326432052824B043EDE70 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B154A47491EE184BBD622216D9667D63 /* SDWebImageCoder.m */; }; + 68067E1C56B32A872D4032DCDE402648 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC9A6170571E46E470C31C3F81972F6 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6ABBC58BC116248D3CCB700B7F5517EC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */; }; + 6F3AB91C5C8DAFC1414AE74D29B05284 /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D330C3455B2AA45353146EBADC7B3D /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75181D45237495C4546863D55B20F423 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 03BCD4F7412D29C790D875518EB9BDB0 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 767378DDDC904F25183FF796033C41B8 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E3CCF92515ED79162F7669787ACF37D /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7FF0EA413B8290ECC767EAFD5F2246C4 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0362B729AD32373CE39059538D257466 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 839E45F1E5351F89ED6E55B7944C324E /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F8349097D9A5679FC40FAE1FC68658EA /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85C82D82ED8E0DB1FA47F2EF548F5EE6 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 457CA61DEBD817929AFDB1551DFE02E2 /* UIImageView+HighlightedWebCache.m */; }; + 895EBCDB3CA408FE058207AABA69F469 /* FLAnimatedImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */; }; + 8B399633E4730A9DB94007B451B472DB /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DD5F836DA6E634D9F5FE666C9F8E2A9A /* FLAnimatedImage-dummy.m */; }; + 917B055DED8553A042FFB8270AF6ECD7 /* FLAnimatedImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 41F1E15197F35D063D69CE9F8F3CED2E /* FLAnimatedImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 927DFB5AE39B748421280C2DB0A7E691 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + 979358C6AB3E7B079FA0911D8A6DF935 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E07F455A6B1BA1FC716A7B4A43FE3377 /* SDImageCache.m */; }; + 985BAAD0E3A2E8F6DAB14861D7BCF563 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = B2A9C76F159ED9103E688088E58420F6 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 988BEAF9FCFD9005783CFC20E346DEDA /* Pods-DKCarousel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 53619EBE68F92C93A4EEBEDF664AB584 /* Pods-DKCarousel-dummy.m */; }; + 9FA89DD2AC8FF13040B62C92663CD03E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + A017BB3F34B335A09931AF5DB6D7A0B4 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 773555182E21D8A3679C7C90E1EF3563 /* UIView+WebCacheOperation.m */; }; + A2EEDC55A2ADD551065D93ED1D383209 /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 58D4057F422BE99BCCF1EE0D9CDDD9E6 /* SDWebImageFrame.m */; }; + A36DBDC77CBFE146D24B895983A87D23 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F22EE02A6DB47765BF2A823EA615D4BA /* NSImage+WebCache.m */; }; + A6F325C78AFD5E791D0EFE5AE158619B /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = FEE00317BE36521F1867804BAAB8A63C /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9BCDA06A9BDDCE320C3473945142669 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 090A869784A3882A851A3C12A79E408F /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ADCB25DC5E0441F1C6083A0FFDA58C05 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = EA39C992BBCA42674FE200F05756DC3A /* SDImageCacheConfig.m */; }; + AEA088F547F7127B8444535947E41266 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 20C15A9443A34949E898C18CB82A62B1 /* UIImageView+WebCache.m */; }; + AF6046114A754E87B8B73F6B29F2300B /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 62D03A2FF95D2EA892A264D0797A9F5A /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1B886593479D51C41D68CE92E573165 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AA6C66FEA57DFA256BD74C2B34528A30 /* SDWebImageManager.m */; }; + B4685B0685F92653D65D0711422588B9 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */; }; + B9A7B3D46ED64E027200D8F4BED1DB47 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B2BDCD5C7C9EE08EDFB4A0D02CD9DED /* SDWebImageCoderHelper.m */; }; + B9A9297D4E466BC7A26561D489CCCB18 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = ED02DC4347DC467E2C93818DAF343B1C /* UIImage+ForceDecode.m */; }; + BA9D44A4F8505B811FD1BEF2353F34FF /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F7B369FFCECB5FFC6236792625985B3 /* SDWebImageTransition.m */; }; + BCB4449748E8412BDD41B224F623E2F8 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FC3DD24F2A1B822F96A8826F674A9BE /* SDWebImageDownloader.m */; }; + BFE1C3249FECD36570D6886F3758F439 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 905B702AEF7D6C52AB581D823172944A /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C21177D72EA8AAC9539B0354FF31D507 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */; }; + C387AED040D8F26D154E009E2B5D5B3F /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 920952FCA400C8B538F77E60A5AE6DB0 /* SDWebImageImageIOCoder.m */; }; + C59DB52176A6F9AAB659A35317CB5063 /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 23BF51CF91104CA0B747171BEB3FA674 /* SDWebImageGIFCoder.m */; }; + C80F8E2DB0D91A307A9D3E00314E9B7C /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A221F26E740E35F1E0D363A6F8174C0 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CADFAC55CB1A7D7610EEB90885F7B819 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D26AC1F8E21C1B23BE805CD4C1F616E5 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CB1AECF2685F098CC6909D2DD1E4EDB3 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E542B3187E6DE1B0FB002029D6CB710 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D549BF6578C94E97F71A11AFB030FC28 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F4B987EE891198285C5A0B8B611DB92 /* SDWebImageCodersManager.m */; }; + D627C609086BE54E816CD890D088EF1F /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 90ADD45194ED509B2A5B344949B1327C /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D7E6480375C2331805C4A26BF974C634 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D44BF7B4354373018A4C0402645D0D /* UIImage+MultiFormat.m */; }; + DB65D31C5E1593210A6E37984CC6E631 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */; }; + E0EC5605A5759836E76694734CF8ADC3 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = C65D4968684ABF36D18C281BB3D43F42 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA4F6C84A1B56BB82CE64DB663C6C3D9 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 308AD6A1D6A227339B722EFE3D53DCDB /* UIImage+MemoryCacheCost.m */; }; + F397EC1A46A485148C625D6FA7FB48EC /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7BFBE8559B59D91856B14439A87C62 /* UIButton+WebCache.m */; }; + F5D4C755FE134BEE4A75259FAD6FB4F7 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = AB89D3C579D0CD39F4E06F4805D7C5E3 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F8535EACB0181489EA345B730B0D5700 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = C87E9B431210720964D06632F9BAC5D0 /* NSData+ImageContentType.m */; }; + F8FA1D3BDAF9B51135B4D06EADCE2512 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EEF994C89F18E41A3421A46F6FD0696 /* UIImage+GIF.m */; }; + F983D42E75EE2A3C377938A2C601351B /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BDE467BECA3E353E924DC4462C03A87C /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FE95088D0F3289DFF3A6CC9810A3190C /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 07F8A486A30DEA9143A7BA38AB5E815E /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + A28112AA74905695BE5C135878CD0179 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; + remoteInfo = FLAnimatedImage; + }; + D5555B4336EB0478D8F982DF77E982A8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; + remoteInfo = FLAnimatedImage; + }; + DFDB804C521FB0E7B735F5A44C2BFA21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = FDACDAA5A280970DEB90D48EFF8F3CE4; + remoteInfo = SDWebImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0362B729AD32373CE39059538D257466 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = ""; }; + 03BCD4F7412D29C790D875518EB9BDB0 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; + 05DABF84567A3F4B1A54A850BB7A7A0E /* FLAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FLAnimatedImageView+WebCache.m"; path = "SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m"; sourceTree = ""; }; + 07F8A486A30DEA9143A7BA38AB5E815E /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; + 08F2F73420BB03711A9455FF322DB239 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + 090A869784A3882A851A3C12A79E408F /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; + 134249D719D81F64E7B58ADD6308FE68 /* FLAnimatedImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FLAnimatedImage.framework; path = FLAnimatedImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 16AEB5580179917F06830AA96141A76A /* Pods-DKCarousel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarousel.release.xcconfig"; sourceTree = ""; }; + 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 1E8D97F07DB5C3CD4D129AC82B8C67F0 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; + 20C15A9443A34949E898C18CB82A62B1 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + 23BF51CF91104CA0B747171BEB3FA674 /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = ""; }; + 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 2A221F26E740E35F1E0D363A6F8174C0 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = ""; }; + 2D055FC7D9743DFB69367C3C69E37C8B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E3CCF92515ED79162F7669787ACF37D /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; + 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; + 2EF1487F1FA034DC88C85EC4E2588656 /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = FLAnimatedImage/FLAnimatedImage.m; sourceTree = ""; }; + 2F7B369FFCECB5FFC6236792625985B3 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = ""; }; + 308AD6A1D6A227339B722EFE3D53DCDB /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; + 34D44BF7B4354373018A4C0402645D0D /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; + 371B238ADFC370BC40FD190FD5870536 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; + 37E7087EB455FD0BE6EC709E394E3843 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; + 3B0299C4447BBCFCFD1EEF516F6E0C51 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = ""; }; + 407D61E55487DF7879D4517B07430646 /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; + 409464D2B2B4EFA2622321607A6F5DA8 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + 40B991E2AFD43CC265D73AFA788CED97 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 4153D1BE7FCB88E74F62BE3556D33C42 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; + 41F1E15197F35D063D69CE9F8F3CED2E /* FLAnimatedImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-umbrella.h"; sourceTree = ""; }; + 4231531A9137F4E79E78BB2C2C76898A /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; + 457CA61DEBD817929AFDB1551DFE02E2 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + 50E48431B8800CECB8187F64DEE14AA1 /* Pods-DKCarousel-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-DKCarousel-acknowledgements.plist"; sourceTree = ""; }; + 53619EBE68F92C93A4EEBEDF664AB584 /* Pods-DKCarousel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-DKCarousel-dummy.m"; sourceTree = ""; }; + 544A231727ED681481C3308656285A40 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = ""; }; + 55758D04877F6AF242496736E30F2CA3 /* Pods-DKCarousel-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-DKCarousel-acknowledgements.markdown"; sourceTree = ""; }; + 58543F2AE0107973ABF307F099BAE243 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 58D4057F422BE99BCCF1EE0D9CDDD9E6 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = ""; }; + 59CBAAA5DCCE9CD1C2E2A31EC4ADBA21 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = ""; }; + 5B2BDCD5C7C9EE08EDFB4A0D02CD9DED /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; + 5CF87D2050EDC9D97CDB653AD3CEFA8F /* Pods-DKCarousel-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-DKCarousel-resources.sh"; sourceTree = ""; }; + 5F29FC38F6A36312246531CD851FA59A /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = FLAnimatedImage/FLAnimatedImageView.h; sourceTree = ""; }; + 62D03A2FF95D2EA892A264D0797A9F5A /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = ""; }; + 667E22D82B0714C0153726872D0EDC75 /* FLAnimatedImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FLAnimatedImage.modulemap; sourceTree = ""; }; + 671984BE5CBC2FC15120C58F765C3BF7 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; + 6FC3DD24F2A1B822F96A8826F674A9BE /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; + 773555182E21D8A3679C7C90E1EF3563 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; + 7CC9A6170571E46E470C31C3F81972F6 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; + 7E542B3187E6DE1B0FB002029D6CB710 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + 7F4B987EE891198285C5A0B8B611DB92 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = ""; }; + 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + 8172349406BF607864DCA508A0C2CD81 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 82CFD8E7BE9A7A34D69E6F2DADFC0FCB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8EEF994C89F18E41A3421A46F6FD0696 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; + 905B702AEF7D6C52AB581D823172944A /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; + 90ADD45194ED509B2A5B344949B1327C /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; + 90D99221153313D696DAE515B1743122 /* Pods_DKCarousel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_DKCarousel.framework; path = "Pods-DKCarousel.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 920952FCA400C8B538F77E60A5AE6DB0 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = ""; }; + 9374B87CB47A98A05B607DD8B111B6B0 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 94BE1B4027CED8E1A96D01DE4E34190B /* FLAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FLAnimatedImageView+WebCache.h"; path = "SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h"; sourceTree = ""; }; + A07E691D79AA3CA8A53BFEC1402C053E /* Pods-DKCarousel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-DKCarousel-umbrella.h"; sourceTree = ""; }; + A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FLAnimatedImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AA6C66FEA57DFA256BD74C2B34528A30 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; + AB89D3C579D0CD39F4E06F4805D7C5E3 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; + AE85BDDE5F734A2AE28C4A6130D92547 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; + AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + B13079EB7D56F3081F4F1EBF76B29700 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; + B154A47491EE184BBD622216D9667D63 /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = ""; }; + B2A9C76F159ED9103E688088E58420F6 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; + BBC4C3DE2D01959CBD2C3C2AED3192C0 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; + BDE467BECA3E353E924DC4462C03A87C /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; + C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; + C515DD4C015DD03CF907F7109E0AE379 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; + C5D7D0D29CEBDF3629A43287BEAD7EF8 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + C65D4968684ABF36D18C281BB3D43F42 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = ""; }; + C80C7169485C78A8FB3774B6C3011A66 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; + C87E9B431210720964D06632F9BAC5D0 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; + C9D330C3455B2AA45353146EBADC7B3D /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = ""; }; + CA7BFBE8559B59D91856B14439A87C62 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; + D26AC1F8E21C1B23BE805CD4C1F616E5 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; + D599E1002F580DF9738F7FC6CE4F5885 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = FLAnimatedImage/FLAnimatedImageView.m; sourceTree = ""; }; + DD5F836DA6E634D9F5FE666C9F8E2A9A /* FLAnimatedImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImage-dummy.m"; sourceTree = ""; }; + E07F455A6B1BA1FC716A7B4A43FE3377 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; + E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FLAnimatedImage.xcconfig; sourceTree = ""; }; + EA39C992BBCA42674FE200F05756DC3A /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; + ED02DC4347DC467E2C93818DAF343B1C /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = ""; }; + F0CB75D04B39C940232FAE1695C00D93 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F22EE02A6DB47765BF2A823EA615D4BA /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; + F266CFB241C8F84152F4C18CA5E9C0A2 /* Pods-DKCarousel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarousel.debug.xcconfig"; sourceTree = ""; }; + F8349097D9A5679FC40FAE1FC68658EA /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = ""; }; + FC58BBCA470D1BD56CA08BB74258875A /* Pods-DKCarousel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-DKCarousel.modulemap"; sourceTree = ""; }; + FEE00317BE36521F1867804BAAB8A63C /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = FLAnimatedImage/FLAnimatedImage.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B65FC58BCB37CC2E7BDA74ABE175C140 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 895EBCDB3CA408FE058207AABA69F469 /* FLAnimatedImage.framework in Frameworks */, + 927DFB5AE39B748421280C2DB0A7E691 /* Foundation.framework in Frameworks */, + B4685B0685F92653D65D0711422588B9 /* ImageIO.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E3E8AABE9277C746E87843CF848268D6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6ABBC58BC116248D3CCB700B7F5517EC /* CoreGraphics.framework in Frameworks */, + 37683685A8F221EF5AEBF5E1FC11528A /* Foundation.framework in Frameworks */, + 65BB7B9FAC4B30DE8F2D145C49DB0A64 /* ImageIO.framework in Frameworks */, + DB65D31C5E1593210A6E37984CC6E631 /* MobileCoreServices.framework in Frameworks */, + C21177D72EA8AAC9539B0354FF31D507 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E7FC25EC16625ED9CC67405659ECEDB6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FA89DD2AC8FF13040B62C92663CD03E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 228564F9635395E16BF9C2000D47B257 /* Products */ = { + isa = PBXGroup; + children = ( + 134249D719D81F64E7B58ADD6308FE68 /* FLAnimatedImage.framework */, + 90D99221153313D696DAE515B1743122 /* Pods_DKCarousel.framework */, + F0CB75D04B39C940232FAE1695C00D93 /* SDWebImage.framework */, + ); + name = Products; + sourceTree = ""; + }; + 2BC98F924C9DD4EAE6E190C639F3512A /* Core */ = { + isa = PBXGroup; + children = ( + C515DD4C015DD03CF907F7109E0AE379 /* NSButton+WebCache.h */, + 59CBAAA5DCCE9CD1C2E2A31EC4ADBA21 /* NSButton+WebCache.m */, + 37E7087EB455FD0BE6EC709E394E3843 /* NSData+ImageContentType.h */, + C87E9B431210720964D06632F9BAC5D0 /* NSData+ImageContentType.m */, + 90ADD45194ED509B2A5B344949B1327C /* NSImage+WebCache.h */, + F22EE02A6DB47765BF2A823EA615D4BA /* NSImage+WebCache.m */, + 2A221F26E740E35F1E0D363A6F8174C0 /* SDAnimatedImageRep.h */, + 544A231727ED681481C3308656285A40 /* SDAnimatedImageRep.m */, + 07F8A486A30DEA9143A7BA38AB5E815E /* SDImageCache.h */, + E07F455A6B1BA1FC716A7B4A43FE3377 /* SDImageCache.m */, + AB89D3C579D0CD39F4E06F4805D7C5E3 /* SDImageCacheConfig.h */, + EA39C992BBCA42674FE200F05756DC3A /* SDImageCacheConfig.m */, + F8349097D9A5679FC40FAE1FC68658EA /* SDWebImageCoder.h */, + B154A47491EE184BBD622216D9667D63 /* SDWebImageCoder.m */, + BBC4C3DE2D01959CBD2C3C2AED3192C0 /* SDWebImageCoderHelper.h */, + 5B2BDCD5C7C9EE08EDFB4A0D02CD9DED /* SDWebImageCoderHelper.m */, + 0362B729AD32373CE39059538D257466 /* SDWebImageCodersManager.h */, + 7F4B987EE891198285C5A0B8B611DB92 /* SDWebImageCodersManager.m */, + 4231531A9137F4E79E78BB2C2C76898A /* SDWebImageCompat.h */, + 671984BE5CBC2FC15120C58F765C3BF7 /* SDWebImageCompat.m */, + 4153D1BE7FCB88E74F62BE3556D33C42 /* SDWebImageDownloader.h */, + 6FC3DD24F2A1B822F96A8826F674A9BE /* SDWebImageDownloader.m */, + 7E542B3187E6DE1B0FB002029D6CB710 /* SDWebImageDownloaderOperation.h */, + 409464D2B2B4EFA2622321607A6F5DA8 /* SDWebImageDownloaderOperation.m */, + 62D03A2FF95D2EA892A264D0797A9F5A /* SDWebImageFrame.h */, + 58D4057F422BE99BCCF1EE0D9CDDD9E6 /* SDWebImageFrame.m */, + 3B0299C4447BBCFCFD1EEF516F6E0C51 /* SDWebImageGIFCoder.h */, + 23BF51CF91104CA0B747171BEB3FA674 /* SDWebImageGIFCoder.m */, + C9D330C3455B2AA45353146EBADC7B3D /* SDWebImageImageIOCoder.h */, + 920952FCA400C8B538F77E60A5AE6DB0 /* SDWebImageImageIOCoder.m */, + BDE467BECA3E353E924DC4462C03A87C /* SDWebImageManager.h */, + AA6C66FEA57DFA256BD74C2B34528A30 /* SDWebImageManager.m */, + 7CC9A6170571E46E470C31C3F81972F6 /* SDWebImageOperation.h */, + 03BCD4F7412D29C790D875518EB9BDB0 /* SDWebImagePrefetcher.h */, + AE85BDDE5F734A2AE28C4A6130D92547 /* SDWebImagePrefetcher.m */, + 9374B87CB47A98A05B607DD8B111B6B0 /* SDWebImageTransition.h */, + 2F7B369FFCECB5FFC6236792625985B3 /* SDWebImageTransition.m */, + 905B702AEF7D6C52AB581D823172944A /* UIButton+WebCache.h */, + CA7BFBE8559B59D91856B14439A87C62 /* UIButton+WebCache.m */, + C65D4968684ABF36D18C281BB3D43F42 /* UIImage+ForceDecode.h */, + ED02DC4347DC467E2C93818DAF343B1C /* UIImage+ForceDecode.m */, + B2A9C76F159ED9103E688088E58420F6 /* UIImage+GIF.h */, + 8EEF994C89F18E41A3421A46F6FD0696 /* UIImage+GIF.m */, + 2E3CCF92515ED79162F7669787ACF37D /* UIImage+MemoryCacheCost.h */, + 308AD6A1D6A227339B722EFE3D53DCDB /* UIImage+MemoryCacheCost.m */, + 090A869784A3882A851A3C12A79E408F /* UIImage+MultiFormat.h */, + 34D44BF7B4354373018A4C0402645D0D /* UIImage+MultiFormat.m */, + 8172349406BF607864DCA508A0C2CD81 /* UIImageView+HighlightedWebCache.h */, + 457CA61DEBD817929AFDB1551DFE02E2 /* UIImageView+HighlightedWebCache.m */, + C80C7169485C78A8FB3774B6C3011A66 /* UIImageView+WebCache.h */, + 20C15A9443A34949E898C18CB82A62B1 /* UIImageView+WebCache.m */, + D26AC1F8E21C1B23BE805CD4C1F616E5 /* UIView+WebCache.h */, + 371B238ADFC370BC40FD190FD5870536 /* UIView+WebCache.m */, + B13079EB7D56F3081F4F1EBF76B29700 /* UIView+WebCacheOperation.h */, + 773555182E21D8A3679C7C90E1EF3563 /* UIView+WebCacheOperation.m */, + ); + name = Core; + sourceTree = ""; + }; + 4A45998E6329B695CE49FEE17FA4455E /* iOS */ = { + isa = PBXGroup; + children = ( + 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */, + 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */, + C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */, + AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */, + 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 53F2E7074946C3D4042EA7FF1FCC34C5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */, + 4A45998E6329B695CE49FEE17FA4455E /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 731CF02C49A3D1852FA89710E5E9AF0D /* Support Files */ = { + isa = PBXGroup; + children = ( + 667E22D82B0714C0153726872D0EDC75 /* FLAnimatedImage.modulemap */, + E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */, + DD5F836DA6E634D9F5FE666C9F8E2A9A /* FLAnimatedImage-dummy.m */, + 407D61E55487DF7879D4517B07430646 /* FLAnimatedImage-prefix.pch */, + 41F1E15197F35D063D69CE9F8F3CED2E /* FLAnimatedImage-umbrella.h */, + 2D055FC7D9743DFB69367C3C69E37C8B /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FLAnimatedImage"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 53F2E7074946C3D4042EA7FF1FCC34C5 /* Frameworks */, + 83A775CC6468D2E99CE0107CA02D076C /* Pods */, + 228564F9635395E16BF9C2000D47B257 /* Products */, + 7E0FBE6377098D444A8E1F89428B5B19 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 7E0FBE6377098D444A8E1F89428B5B19 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + F6AFBA8AF3C1BC2D02BF5F08EE6B5883 /* Pods-DKCarousel */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 83A775CC6468D2E99CE0107CA02D076C /* Pods */ = { + isa = PBXGroup; + children = ( + 90BD147E9543DA6D2770A6D6CFA6A8CD /* FLAnimatedImage */, + F33AF4030906C8597A44E730B5B59C56 /* SDWebImage */, + ); + name = Pods; + sourceTree = ""; + }; + 90BD147E9543DA6D2770A6D6CFA6A8CD /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + FEE00317BE36521F1867804BAAB8A63C /* FLAnimatedImage.h */, + 2EF1487F1FA034DC88C85EC4E2588656 /* FLAnimatedImage.m */, + 5F29FC38F6A36312246531CD851FA59A /* FLAnimatedImageView.h */, + D599E1002F580DF9738F7FC6CE4F5885 /* FLAnimatedImageView.m */, + 731CF02C49A3D1852FA89710E5E9AF0D /* Support Files */, + ); + name = FLAnimatedImage; + path = FLAnimatedImage; + sourceTree = ""; + }; + F33AF4030906C8597A44E730B5B59C56 /* SDWebImage */ = { + isa = PBXGroup; + children = ( + 2BC98F924C9DD4EAE6E190C639F3512A /* Core */, + FB64E2111E105AB2BB3A5C42ED205C10 /* GIF */, + F8539DEE76243EA00F78F01297530D4E /* Support Files */, + ); + name = SDWebImage; + path = SDWebImage; + sourceTree = ""; + }; + F6AFBA8AF3C1BC2D02BF5F08EE6B5883 /* Pods-DKCarousel */ = { + isa = PBXGroup; + children = ( + 58543F2AE0107973ABF307F099BAE243 /* Info.plist */, + FC58BBCA470D1BD56CA08BB74258875A /* Pods-DKCarousel.modulemap */, + 55758D04877F6AF242496736E30F2CA3 /* Pods-DKCarousel-acknowledgements.markdown */, + 50E48431B8800CECB8187F64DEE14AA1 /* Pods-DKCarousel-acknowledgements.plist */, + 53619EBE68F92C93A4EEBEDF664AB584 /* Pods-DKCarousel-dummy.m */, + 5CF87D2050EDC9D97CDB653AD3CEFA8F /* Pods-DKCarousel-resources.sh */, + A07E691D79AA3CA8A53BFEC1402C053E /* Pods-DKCarousel-umbrella.h */, + F266CFB241C8F84152F4C18CA5E9C0A2 /* Pods-DKCarousel.debug.xcconfig */, + 16AEB5580179917F06830AA96141A76A /* Pods-DKCarousel.release.xcconfig */, + ); + name = "Pods-DKCarousel"; + path = "Target Support Files/Pods-DKCarousel"; + sourceTree = ""; + }; + F8539DEE76243EA00F78F01297530D4E /* Support Files */ = { + isa = PBXGroup; + children = ( + 82CFD8E7BE9A7A34D69E6F2DADFC0FCB /* Info.plist */, + 1E8D97F07DB5C3CD4D129AC82B8C67F0 /* SDWebImage.modulemap */, + 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */, + 08F2F73420BB03711A9455FF322DB239 /* SDWebImage-dummy.m */, + 40B991E2AFD43CC265D73AFA788CED97 /* SDWebImage-prefix.pch */, + C5D7D0D29CEBDF3629A43287BEAD7EF8 /* SDWebImage-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; + sourceTree = ""; + }; + FB64E2111E105AB2BB3A5C42ED205C10 /* GIF */ = { + isa = PBXGroup; + children = ( + 94BE1B4027CED8E1A96D01DE4E34190B /* FLAnimatedImageView+WebCache.h */, + 05DABF84567A3F4B1A54A850BB7A7A0E /* FLAnimatedImageView+WebCache.m */, + ); + name = GIF; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + AE4A388285280643929986BBD32FF3FC /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 60DA3E7437BCD83DFCAE883D2B6AD01C /* Pods-DKCarousel-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EA45B052E5F343E83C5AB425CA5E1475 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 5F8FCC2A45C88021CC5AD07AFA61393E /* FLAnimatedImageView+WebCache.h in Headers */, + 4CB4D92809B2AA5F1456CB4DF7E8BD05 /* NSButton+WebCache.h in Headers */, + 60C3A6815BF3333C0B1864C92494FD5B /* NSData+ImageContentType.h in Headers */, + D627C609086BE54E816CD890D088EF1F /* NSImage+WebCache.h in Headers */, + C80F8E2DB0D91A307A9D3E00314E9B7C /* SDAnimatedImageRep.h in Headers */, + FE95088D0F3289DFF3A6CC9810A3190C /* SDImageCache.h in Headers */, + F5D4C755FE134BEE4A75259FAD6FB4F7 /* SDImageCacheConfig.h in Headers */, + 58368E2EACFD57926C10CAB844D42079 /* SDWebImage-umbrella.h in Headers */, + 839E45F1E5351F89ED6E55B7944C324E /* SDWebImageCoder.h in Headers */, + 5A25550CE5C78941F415582C30570F1E /* SDWebImageCoderHelper.h in Headers */, + 7FF0EA413B8290ECC767EAFD5F2246C4 /* SDWebImageCodersManager.h in Headers */, + 00BF318007F3FDE4503CFEC6E6B2E801 /* SDWebImageCompat.h in Headers */, + 2E288437A6F67FD4FF8215C987E54F88 /* SDWebImageDownloader.h in Headers */, + CB1AECF2685F098CC6909D2DD1E4EDB3 /* SDWebImageDownloaderOperation.h in Headers */, + AF6046114A754E87B8B73F6B29F2300B /* SDWebImageFrame.h in Headers */, + 5102533DDA86BE8A790574ACE7726ADD /* SDWebImageGIFCoder.h in Headers */, + 6F3AB91C5C8DAFC1414AE74D29B05284 /* SDWebImageImageIOCoder.h in Headers */, + F983D42E75EE2A3C377938A2C601351B /* SDWebImageManager.h in Headers */, + 68067E1C56B32A872D4032DCDE402648 /* SDWebImageOperation.h in Headers */, + 75181D45237495C4546863D55B20F423 /* SDWebImagePrefetcher.h in Headers */, + 346BE6511A6E1868CAA684B80785D8F9 /* SDWebImageTransition.h in Headers */, + BFE1C3249FECD36570D6886F3758F439 /* UIButton+WebCache.h in Headers */, + E0EC5605A5759836E76694734CF8ADC3 /* UIImage+ForceDecode.h in Headers */, + 985BAAD0E3A2E8F6DAB14861D7BCF563 /* UIImage+GIF.h in Headers */, + 767378DDDC904F25183FF796033C41B8 /* UIImage+MemoryCacheCost.h in Headers */, + A9BCDA06A9BDDCE320C3473945142669 /* UIImage+MultiFormat.h in Headers */, + 6108DC38584D05DDBF0F414EF2F96332 /* UIImageView+HighlightedWebCache.h in Headers */, + 599408CC9A5C972DAA581163B5CCD474 /* UIImageView+WebCache.h in Headers */, + CADFAC55CB1A7D7610EEB90885F7B819 /* UIView+WebCache.h in Headers */, + 488A11D9DEF80B0E1532D703A55879A0 /* UIView+WebCacheOperation.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F88CF70F4B003F3D138F3C8B26BA08B6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 917B055DED8553A042FFB8270AF6ECD7 /* FLAnimatedImage-umbrella.h in Headers */, + A6F325C78AFD5E791D0EFE5AE158619B /* FLAnimatedImage.h in Headers */, + 12595EF47FC1C733100BC2C0B88C9093 /* FLAnimatedImageView.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 01FB2A7EB38E581715F8A49DEDB51A26 /* Pods-DKCarousel */ = { + isa = PBXNativeTarget; + buildConfigurationList = 44011EE3382DC7E009BB11E3B9A96219 /* Build configuration list for PBXNativeTarget "Pods-DKCarousel" */; + buildPhases = ( + AE4A388285280643929986BBD32FF3FC /* Headers */, + E7F983F5D76DCDD4C7DD116674916661 /* Sources */, + E7FC25EC16625ED9CC67405659ECEDB6 /* Frameworks */, + F5C3DA06FE23185A4C97F0127FA53474 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2F81E815D12B38E059763934F60EEF55 /* PBXTargetDependency */, + A934CB6C91FFF8FD44CCFF9C283C461B /* PBXTargetDependency */, + ); + name = "Pods-DKCarousel"; + productName = "Pods-DKCarousel"; + productReference = 90D99221153313D696DAE515B1743122 /* Pods_DKCarousel.framework */; + productType = "com.apple.product-type.framework"; + }; + 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = E8D6D562BB609396B62E386B9203F207 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */; + buildPhases = ( + F88CF70F4B003F3D138F3C8B26BA08B6 /* Headers */, + B462C08BC2B9EBB5DD37366BDB220EB2 /* Sources */, + E3E8AABE9277C746E87843CF848268D6 /* Frameworks */, + 83192590C22D6F86D62DB7E00D6473B4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FLAnimatedImage; + productName = FLAnimatedImage; + productReference = 134249D719D81F64E7B58ADD6308FE68 /* FLAnimatedImage.framework */; + productType = "com.apple.product-type.framework"; + }; + FDACDAA5A280970DEB90D48EFF8F3CE4 /* SDWebImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5BD073F9B20C95685CEB2F39DB688E72 /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildPhases = ( + EA45B052E5F343E83C5AB425CA5E1475 /* Headers */, + 702615D4BF3E6D1CD06DEBD6AA03FBA8 /* Sources */, + B65FC58BCB37CC2E7BDA74ABE175C140 /* Frameworks */, + 646E79583F5DC980B936986D7C5ABD65 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4E3EC88C6DC78A69D1D61465173B3206 /* PBXTargetDependency */, + ); + name = SDWebImage; + productName = SDWebImage; + productReference = F0CB75D04B39C940232FAE1695C00D93 /* SDWebImage.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 228564F9635395E16BF9C2000D47B257 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */, + 01FB2A7EB38E581715F8A49DEDB51A26 /* Pods-DKCarousel */, + FDACDAA5A280970DEB90D48EFF8F3CE4 /* SDWebImage */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 646E79583F5DC980B936986D7C5ABD65 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 83192590C22D6F86D62DB7E00D6473B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F5C3DA06FE23185A4C97F0127FA53474 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 702615D4BF3E6D1CD06DEBD6AA03FBA8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40FFA995F90ADA0185C698A957719D35 /* FLAnimatedImageView+WebCache.m in Sources */, + 52AD8BCF52689C95FEEAF2968B6EABCA /* NSButton+WebCache.m in Sources */, + F8535EACB0181489EA345B730B0D5700 /* NSData+ImageContentType.m in Sources */, + A36DBDC77CBFE146D24B895983A87D23 /* NSImage+WebCache.m in Sources */, + 4F4431724A6BE7921E909B76B30622AD /* SDAnimatedImageRep.m in Sources */, + 979358C6AB3E7B079FA0911D8A6DF935 /* SDImageCache.m in Sources */, + ADCB25DC5E0441F1C6083A0FFDA58C05 /* SDImageCacheConfig.m in Sources */, + 4317EE9D0C8B3FBF99538A0B8F08AA1D /* SDWebImage-dummy.m in Sources */, + 680598B16E9326432052824B043EDE70 /* SDWebImageCoder.m in Sources */, + B9A7B3D46ED64E027200D8F4BED1DB47 /* SDWebImageCoderHelper.m in Sources */, + D549BF6578C94E97F71A11AFB030FC28 /* SDWebImageCodersManager.m in Sources */, + 608ABF2A50DB814CD4053DFCD3612294 /* SDWebImageCompat.m in Sources */, + BCB4449748E8412BDD41B224F623E2F8 /* SDWebImageDownloader.m in Sources */, + 0B941CA235E004C81CD56E890A7A8171 /* SDWebImageDownloaderOperation.m in Sources */, + A2EEDC55A2ADD551065D93ED1D383209 /* SDWebImageFrame.m in Sources */, + C59DB52176A6F9AAB659A35317CB5063 /* SDWebImageGIFCoder.m in Sources */, + C387AED040D8F26D154E009E2B5D5B3F /* SDWebImageImageIOCoder.m in Sources */, + B1B886593479D51C41D68CE92E573165 /* SDWebImageManager.m in Sources */, + 0B0EDBF59FA39518C1CC02008B1F84ED /* SDWebImagePrefetcher.m in Sources */, + BA9D44A4F8505B811FD1BEF2353F34FF /* SDWebImageTransition.m in Sources */, + F397EC1A46A485148C625D6FA7FB48EC /* UIButton+WebCache.m in Sources */, + B9A9297D4E466BC7A26561D489CCCB18 /* UIImage+ForceDecode.m in Sources */, + F8FA1D3BDAF9B51135B4D06EADCE2512 /* UIImage+GIF.m in Sources */, + EA4F6C84A1B56BB82CE64DB663C6C3D9 /* UIImage+MemoryCacheCost.m in Sources */, + D7E6480375C2331805C4A26BF974C634 /* UIImage+MultiFormat.m in Sources */, + 85C82D82ED8E0DB1FA47F2EF548F5EE6 /* UIImageView+HighlightedWebCache.m in Sources */, + AEA088F547F7127B8444535947E41266 /* UIImageView+WebCache.m in Sources */, + 01694DCABA19FDA7C6DD921AE868963D /* UIView+WebCache.m in Sources */, + A017BB3F34B335A09931AF5DB6D7A0B4 /* UIView+WebCacheOperation.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B462C08BC2B9EBB5DD37366BDB220EB2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B399633E4730A9DB94007B451B472DB /* FLAnimatedImage-dummy.m in Sources */, + 5DF3480D9AEF5BF93EF11586B8D0CCF2 /* FLAnimatedImage.m in Sources */, + 1FBFB43EC7DA59FB18CDBA03408AB86E /* FLAnimatedImageView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E7F983F5D76DCDD4C7DD116674916661 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 988BEAF9FCFD9005783CFC20E346DEDA /* Pods-DKCarousel-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2F81E815D12B38E059763934F60EEF55 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FLAnimatedImage; + target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; + targetProxy = D5555B4336EB0478D8F982DF77E982A8 /* PBXContainerItemProxy */; + }; + 4E3EC88C6DC78A69D1D61465173B3206 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FLAnimatedImage; + target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; + targetProxy = A28112AA74905695BE5C135878CD0179 /* PBXContainerItemProxy */; + }; + A934CB6C91FFF8FD44CCFF9C283C461B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = FDACDAA5A280970DEB90D48EFF8F3CE4 /* SDWebImage */; + targetProxy = DFDB804C521FB0E7B735F5A44C2BFA21 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 04C9EF523A8424E548450DD3386A6878 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 6F3E26A41B304A061BD9CBB706CD4FF7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FLAnimatedImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap"; + PRODUCT_MODULE_NAME = FLAnimatedImage; + PRODUCT_NAME = FLAnimatedImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 8DDFA5FA8D4131BFD96E5E26F3672644 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + B786DD3F087DCFD4FB65A6F5A4ABB75C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F266CFB241C8F84152F4C18CA5E9C0A2 /* Pods-DKCarousel.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-DKCarousel/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BAC6BF0742FF41F5E14D36666616C21F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CC596AE083F27CF33C8D676970ABED96 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 16AEB5580179917F06830AA96141A76A /* Pods-DKCarousel.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-DKCarousel/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + D5F759C82752B2EB010DB3CD3D69707C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + F871B6326C8F63EA427875B0840AAD42 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FLAnimatedImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap"; + PRODUCT_MODULE_NAME = FLAnimatedImage; + PRODUCT_NAME = FLAnimatedImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8DDFA5FA8D4131BFD96E5E26F3672644 /* Debug */, + D5F759C82752B2EB010DB3CD3D69707C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 44011EE3382DC7E009BB11E3B9A96219 /* Build configuration list for PBXNativeTarget "Pods-DKCarousel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B786DD3F087DCFD4FB65A6F5A4ABB75C /* Debug */, + CC596AE083F27CF33C8D676970ABED96 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5BD073F9B20C95685CEB2F39DB688E72 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BAC6BF0742FF41F5E14D36666616C21F /* Debug */, + 04C9EF523A8424E548450DD3386A6878 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E8D6D562BB609396B62E386B9203F207 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F871B6326C8F63EA427875B0840AAD42 /* Debug */, + 6F3E26A41B304A061BD9CBB706CD4FF7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/DKCarouselViewDemo/SDWebImage/LICENSE b/DKCarousel/Pods/SDWebImage/LICENSE similarity index 94% rename from DKCarouselViewDemo/SDWebImage/LICENSE rename to DKCarousel/Pods/SDWebImage/LICENSE index 810cf88..92a252a 100644 --- a/DKCarouselViewDemo/SDWebImage/LICENSE +++ b/DKCarousel/Pods/SDWebImage/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2016 Olivier Poitrey rs@dailymotion.com +Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/DKCarouselViewDemo/SDWebImage/README.md b/DKCarousel/Pods/SDWebImage/README.md similarity index 57% rename from DKCarouselViewDemo/SDWebImage/README.md rename to DKCarousel/Pods/SDWebImage/README.md index e621454..3328f5d 100644 --- a/DKCarouselViewDemo/SDWebImage/README.md +++ b/DKCarousel/Pods/SDWebImage/README.md @@ -1,16 +1,14 @@ -

+

-[![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) +[![Build Status](http://img.shields.io/travis/SDWebImage/SDWebImage/master.svg?style=flat)](https://travis-ci.org/SDWebImage/SDWebImage) [![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage) -[![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) -[![codecov](https://codecov.io/gh/rs/SDWebImage/branch/master/graph/badge.svg)](https://codecov.io/gh/rs/SDWebImage) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/SDWebImage/SDWebImage) +[![codecov](https://codecov.io/gh/SDWebImage/SDWebImage/branch/master/graph/badge.svg)](https://codecov.io/gh/SDWebImage/SDWebImage) This library provides an async image downloader with cache support. For convenience, we added categories for UI elements like `UIImageView`, `UIButton`, `MKAnnotationView`. @@ -30,32 +28,40 @@ This library provides an async image downloader with cache support. For convenie - Image formats supported by UIImage (JPEG, PNG, ...), including GIF - WebP format, including animated WebP (use the `WebP` subspec) +- Support extendable coder plugins for new image formats. Like APNG, BPG, HFIF, SVG, etc. See all the list in [Image coder plugin List](https://github.com/SDWebImage/SDWebImage/wiki/Coder-Plugin-List) + +## Beta version + +SDWebImage's 5.0 version is nearing completion. Which introduce many new features like Animated ImageView and Transformer. We also provide a more modularized design used for advanced user customization. + +You can check the latest [5.x branch](https://github.com/SDWebImage/SDWebImage/tree/5.x) to know about the current status. We'd love you to have a try with the beta version and provide any feedback. If you'd love, check [SDWebImage 5.0 Migration Guide](https://github.com/SDWebImage/SDWebImage/wiki/5.0-Migration-guide) and prepare for the migration. ## Requirements - iOS 7.0 or later - tvOS 9.0 or later - watchOS 2.0 or later -- OS X 10.8 or later +- macOS 10.9 or later - Xcode 7.3 or later #### Backwards compatibility -- For iOS 5 and 6, use [any 3.x version up to 3.7.6](https://github.com/rs/SDWebImage/tree/3.7.6) -- For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). +- For iOS 5 and 6, use [any 3.x version up to 3.7.6](https://github.com/SDWebImage/SDWebImage/tree/3.7.6) +- For iOS < 5.0, please use the last [2.0 version](https://github.com/SDWebImage/SDWebImage/tree/2.0-compat). ## Getting Started - Read this Readme doc -- Read the [How to use section](https://github.com/rs/SDWebImage#how-to-use) -- Read the [documentation @ CocoaDocs](http://cocoadocs.org/docsets/SDWebImage/) -- Read [How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) +- Read the [How to use section](https://github.com/SDWebImage/SDWebImage#how-to-use) +- Read the [Documentation @ CocoaDocs](http://cocoadocs.org/docsets/SDWebImage/) - Try the example by downloading the project from Github or even easier using CocoaPods try `pod try SDWebImage` -- Get to the [installation steps](https://github.com/rs/SDWebImage#installation) +- Read the [Installation Guide](https://github.com/SDWebImage/SDWebImage/wiki/Installation-Guide) - Read the [SDWebImage 4.0 Migration Guide](Docs/SDWebImage-4.0-Migration-guide.md) to get an idea of the changes from 3.x to 4.x +- Read the [Common Problems](https://github.com/SDWebImage/SDWebImage/wiki/Common-Problems) to find the solution for common problems +- Go to the [Wiki Page](https://github.com/SDWebImage/SDWebImage/wiki) for more information such as [Advanced Usage](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage) ## Who Uses It -- Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. +- Find out [who uses SDWebImage](https://github.com/SDWebImage/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. ## Communication @@ -65,23 +71,21 @@ This library provides an async image downloader with cache support. For convenie - If you **have a feature request**, open an issue. - If you **want to contribute**, submit a pull request. -## Installation - ## How To Use -```objective-c -Objective-C: +* Objective-C +```objective-c #import ... [imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; ``` -```swift -Swift: +* Swift -@import SDWebImage +```swift +import SDWebImage imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png")) ``` @@ -91,50 +95,12 @@ imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg ## Animated Images (GIF) support - Starting with the 4.0 version, we rely on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. +- If you use cocoapods, add `pod 'SDWebImage/GIF'` to your podfile. - To use it, simply make sure you use `FLAnimatedImageView` instead of `UIImageView`. -- **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. -- **Important**: FLAnimatedImage only works on the iOS platform, so for all the other platforms (OS X, tvOS, watchOS) we will fallback to the backwards compatibility feature described above - -Common Problems ---------------- - -### Using dynamic image size with UITableViewCell - -UITableView determines the size of the image by the first image set for a cell. If your remote images -don't have the same size as your placeholder image, you may experience strange anamorphic scaling issue. -The following article gives a way to workaround this issue: - -[http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/](http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/) - - -### Handle image refresh - -SDWebImage does very aggressive caching by default. It ignores all kind of caching control header returned by the HTTP server and cache the returned images with no time restriction. It implies your images URLs are static URLs pointing to images that never change. If the pointed image happen to change, some parts of the URL should change accordingly. - -If you don't control the image server you're using, you may not be able to change the URL when its content is updated. This is the case for Facebook avatar URLs for instance. In such case, you may use the `SDWebImageRefreshCached` flag. This will slightly degrade the performance but will respect the HTTP caching control headers: - -``` objective-c -[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] - placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] - options:SDWebImageRefreshCached]; -``` +- **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image by default. However, you can enable the full GIF support by using the built-in GIF coder. See [GIF coder](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#gif-coder) +- **Important**: FLAnimatedImage only works on the iOS platform. For macOS, use `NSImageView` with `animates` set to `YES` to show the entire animated images and `NO` to only show the 1st frame. For all the other platforms (tvOS, watchOS) we will fallback to the backwards compatibility feature described above -### Add a progress indicator - -Add these before you call ```sd_setImageWithURL``` - -``` objective-c -[imageView setShowActivityIndicatorView:YES]; -[imageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; -``` - -``` swift -imageView.setShowActivityIndicatorView(true) -imageView.setIndicatorStyle(.Gray) -``` - -Installation ------------- +## Installation There are three ways to use SDWebImage in your project: - using CocoaPods @@ -148,18 +114,35 @@ There are three ways to use SDWebImage in your project: #### Podfile ``` platform :ios, '7.0' -pod 'SDWebImage', '~>3.8' +pod 'SDWebImage', '~> 4.0' +``` + +##### Swift and static framework + +Swift project previously have to use `use_frameworks!` to make all Pods into dynamic framework to let CocoaPods works. + +However, start with `CocoaPods 1.5.0+` (with `Xcode 9+`), which supports to build both Objective-C && Swift code into static framework. You can use modular headers to use SDWebImage as static framework, without the need of `use_frameworks!`: + +``` +platform :ios, '8.0' +# Uncomment the next line when you want all Pods as static framework +# use_modular_headers! +pod 'SDWebImage', :modular_headers => true ``` -If you are using Swift, be sure to add `use_frameworks!` and set your target to iOS 8+: +See more on [CocoaPods 1.5.0 — Swift Static Libraries](http://blog.cocoapods.org/CocoaPods-1.5.0/) + +If not, you still need to add `use_frameworks!` to use SDWebImage as dynamic framework: + ``` platform :ios, '8.0' use_frameworks! +pod 'SDWebImage' ``` #### Subspecs -There are 3 subspecs available now: `Core`, `MapKit` and `WebP` (this means you can install only some of the SDWebImage modules. By default, you get just `Core`, so if you need `WebP`, you need to specify it). +There are 4 subspecs available now: `Core`, `MapKit`, `GIF` and `WebP` (this means you can install only some of the SDWebImage modules. By default, you get just `Core`, so if you need `WebP`, you need to specify it). Podfile example: ``` @@ -174,7 +157,7 @@ To install with carthage, follow the instruction on [Carthage](https://github.co #### Cartfile ``` -github "rs/SDWebImage" +github "SDWebImage/SDWebImage" ``` ### Installation by cloning the repository @@ -199,17 +182,22 @@ community can help you solve it. ## Collaborators - [Konstantinos K.](https://github.com/mythodeia) - [Bogdan Poplauschi](https://github.com/bpoplauschi) +- [Chester Liu](https://github.com/skyline75489) +- [DreamPiggy](https://github.com/dreampiggy) +- [Wu Zhong](https://github.com/zhongwuzw) ## Licenses -All source code is licensed under the [MIT License](https://raw.github.com/rs/SDWebImage/master/LICENSE). +All source code is licensed under the [MIT License](https://raw.github.com/SDWebImage/SDWebImage/master/LICENSE). ## Architecture -

+

-

+

+ + diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h similarity index 74% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index f77c0ed..1a0d55b 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -13,11 +13,24 @@ #if __has_include() #import #else -#import "FLAnimatedImageView.h" +#import "FLAnimatedImage.h" #endif #import "SDWebImageManager.h" +/** + * FLAnimatedImage is not a subclass of UIImage, so it's not possible to store it into the memory cache currently. However, for performance issue and cell reuse on FLAnimatedImageView, we use associate object to bind a FLAnimatedImage into UIImage when an animated GIF image load. For most cases, you don't need to touch this. + */ +@interface UIImage (FLAnimatedImage) + +/** + * The FLAnimatedImage associated to the UIImage instance when an animated GIF image load. + * For most cases this is read-only and you should avoid manually setting this value. Util some cases like using placeholder with a `FLAnimatedImage`. + */ +@property (nonatomic, strong, nullable) FLAnimatedImage *sd_FLAnimatedImage; + +@end + /** * A category for the FLAnimatedImage imageView class that hooks it to the SDWebImage system. @@ -25,13 +38,34 @@ */ @interface FLAnimatedImageView (WebCache) +/** + * Optimal frame cache size of FLAnimatedImage during initializer. (1.0.11 version later) + * This value will help you set `optimalFrameCacheSize` arg of FLAnimatedImage initializer after image load. + * Defaults to 0. + */ +@property (nonatomic, assign) NSUInteger sd_optimalFrameCacheSize; + +/** + * Predrawing control of FLAnimatedImage during initializer. (1.0.11 version later) + * This value will help you set `predrawingEnabled` arg of FLAnimatedImage initializer after image load. + * Defaults to YES. + */ +@property (nonatomic, assign) BOOL sd_predrawingEnabled; + +/** + * Cache control for associated FLAnimatedImage object for memory cache. When enabled, we will bind created FLAnimatedImage instance to UIImage, and store it into memory cache to avoid create this instance cause decoding performance. See `UIImage+FLAnimatedImage`. + * When enabled, this may consume more memory, if you are facing memory issue, disable it and let FLAnimatedImage been created just in time and dealloced as it not been used. However, when disabled, this may impact performance since we need query disk cache, create FLAnimatedImage and decoding even when the current GIF url is cached. + * Defatuls to YES; + */ +@property (nonatomic, assign) BOOL sd_cacheFLAnimatedImage; + /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images * The download is asynchronous and cached. * * @param url The url for the image. */ -- (void)sd_setImageWithURL:(nullable NSURL *)url; +- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -42,7 +76,7 @@ * @param placeholder The image to be set initially, until the image request finishes. */ - (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder; + placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -55,7 +89,7 @@ */ - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options; + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -86,7 +120,7 @@ */ - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock; + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m new file mode 100644 index 0000000..71bd988 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -0,0 +1,215 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "FLAnimatedImageView+WebCache.h" + +#if SD_UIKIT +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" +#import "UIView+WebCache.h" +#import "NSData+ImageContentType.h" +#import "UIImageView+WebCache.h" +#import "UIImage+MultiFormat.h" +#import "UIImage+MemoryCacheCost.h" + +@interface UIView (PrivateWebCache) + +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + internalSetImageBlock:(nullable SDInternalSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock + context:(nullable NSDictionary *)context; + +@end + +static inline FLAnimatedImage * SDWebImageCreateFLAnimatedImage(FLAnimatedImageView *imageView, NSData *imageData) { + if ([NSData sd_imageFormatForImageData:imageData] != SDImageFormatGIF) { + return nil; + } + FLAnimatedImage *animatedImage; + // Compatibility in 4.x for lower version FLAnimatedImage. + if ([FLAnimatedImage instancesRespondToSelector:@selector(initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:)]) { + animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:imageData optimalFrameCacheSize:imageView.sd_optimalFrameCacheSize predrawingEnabled:imageView.sd_predrawingEnabled]; + } else { + animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:imageData]; + } + return animatedImage; +} + +static inline NSUInteger SDWebImageMemoryCostFLAnimatedImage(FLAnimatedImage *animatedImage, UIImage *image) { + NSUInteger frameCacheSizeCurrent = animatedImage.frameCacheSizeCurrent; // [1...frame count], more suitable than raw frame count because FLAnimatedImage internal actually store a buffer size but not full frames (they called `window`) + NSUInteger pixelsPerFrame = animatedImage.size.width * animatedImage.size.height; // FLAnimatedImage does not support scale factor + NSUInteger animatedImageCost = frameCacheSizeCurrent * pixelsPerFrame; + + NSUInteger imageCost = image.size.height * image.size.width * image.scale * image.scale; // Same as normal cost calculation + imageCost = image.images ? (imageCost * image.images.count) : imageCost; + + return animatedImageCost + imageCost; +} + +@implementation UIImage (FLAnimatedImage) + +- (FLAnimatedImage *)sd_FLAnimatedImage { + return objc_getAssociatedObject(self, @selector(sd_FLAnimatedImage)); +} + +- (void)setSd_FLAnimatedImage:(FLAnimatedImage *)sd_FLAnimatedImage { + objc_setAssociatedObject(self, @selector(sd_FLAnimatedImage), sd_FLAnimatedImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +@implementation FLAnimatedImageView (WebCache) + +// These property based options will moved to `SDWebImageContext` in 5.x, to allow per-image-request level options instead of per-imageView-level options +- (NSUInteger)sd_optimalFrameCacheSize { + NSUInteger optimalFrameCacheSize = 0; + NSNumber *value = objc_getAssociatedObject(self, @selector(sd_optimalFrameCacheSize)); + if ([value isKindOfClass:[NSNumber class]]) { + optimalFrameCacheSize = value.unsignedShortValue; + } + return optimalFrameCacheSize; +} + +- (void)setSd_optimalFrameCacheSize:(NSUInteger)sd_optimalFrameCacheSize { + objc_setAssociatedObject(self, @selector(sd_optimalFrameCacheSize), @(sd_optimalFrameCacheSize), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)sd_predrawingEnabled { + BOOL predrawingEnabled = YES; + NSNumber *value = objc_getAssociatedObject(self, @selector(sd_predrawingEnabled)); + if ([value isKindOfClass:[NSNumber class]]) { + predrawingEnabled = value.boolValue; + } + return predrawingEnabled; +} + +- (void)setSd_predrawingEnabled:(BOOL)sd_predrawingEnabled { + objc_setAssociatedObject(self, @selector(sd_predrawingEnabled), @(sd_predrawingEnabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)sd_cacheFLAnimatedImage { + BOOL cacheFLAnimatedImage = YES; + NSNumber *value = objc_getAssociatedObject(self, @selector(sd_cacheFLAnimatedImage)); + if ([value isKindOfClass:[NSNumber class]]) { + cacheFLAnimatedImage = value.boolValue; + } + return cacheFLAnimatedImage; +} + +- (void)setSd_cacheFLAnimatedImage:(BOOL)sd_cacheFLAnimatedImage { + objc_setAssociatedObject(self, @selector(sd_cacheFLAnimatedImage), @(sd_cacheFLAnimatedImage), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + dispatch_group_t group = dispatch_group_create(); + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:nil + internalSetImageBlock:^(UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + __strong typeof(weakSelf)strongSelf = weakSelf; + if (!strongSelf) { + dispatch_group_leave(group); + return; + } + // Step 1. Check memory cache (associate object) + FLAnimatedImage *associatedAnimatedImage = image.sd_FLAnimatedImage; + if (associatedAnimatedImage) { + // Asscociated animated image exist + // FLAnimatedImage framework contains a bug that cause GIF been rotated if previous rendered image orientation is not Up. We have to call `setImage:` with non-nil image to reset the state. See `https://github.com/SDWebImage/SDWebImage/issues/2402` + strongSelf.image = associatedAnimatedImage.posterImage; + strongSelf.animatedImage = associatedAnimatedImage; + dispatch_group_leave(group); + return; + } + // Step 2. Check if original compressed image data is "GIF" + BOOL isGIF = (image.sd_imageFormat == SDImageFormatGIF || [NSData sd_imageFormatForImageData:imageData] == SDImageFormatGIF); + // Check if placeholder, which does not trigger a backup disk cache query + BOOL isPlaceholder = !imageData && image && cacheType == SDImageCacheTypeNone; + if (!isGIF || isPlaceholder) { + strongSelf.image = image; + strongSelf.animatedImage = nil; + dispatch_group_leave(group); + return; + } + __weak typeof(strongSelf) wweakSelf = strongSelf; + // Hack, mark we need should use dispatch group notify for completedBlock + objc_setAssociatedObject(group, &SDWebImageInternalSetImageGroupKey, @(YES), OBJC_ASSOCIATION_RETAIN_NONATOMIC); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + __strong typeof(wweakSelf) sstrongSelf = wweakSelf; + if (!sstrongSelf || ![url isEqual:sstrongSelf.sd_imageURL]) { return ; } + // Step 3. Check if data exist or query disk cache + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; + __block NSData *gifData = imageData; + if (!gifData) { + gifData = [[SDImageCache sharedImageCache] diskImageDataForKey:key]; + } + // Step 4. Create FLAnimatedImage + FLAnimatedImage *animatedImage = SDWebImageCreateFLAnimatedImage(sstrongSelf, gifData); + dispatch_async(dispatch_get_main_queue(), ^{ + if (![url isEqual:sstrongSelf.sd_imageURL]) { return ; } + // Step 5. Set animatedImage or normal image + if (animatedImage) { + if (sstrongSelf.sd_cacheFLAnimatedImage && SDImageCache.sharedImageCache.config.shouldCacheImagesInMemory) { + image.sd_FLAnimatedImage = animatedImage; + image.sd_memoryCost = SDWebImageMemoryCostFLAnimatedImage(animatedImage, image); + // Update the memory cache + [SDImageCache.sharedImageCache removeImageForKey:key fromDisk:NO withCompletion:nil]; + [SDImageCache.sharedImageCache storeImage:image forKey:key toDisk:NO completion:nil]; + } + sstrongSelf.image = animatedImage.posterImage; + sstrongSelf.animatedImage = animatedImage; + } else { + sstrongSelf.image = image; + sstrongSelf.animatedImage = nil; + } + dispatch_group_leave(group); + }); + }); + } + progress:progressBlock + completed:completedBlock + context:@{SDWebImageInternalSetImageGroupKey: group}]; +} + +@end + +#endif diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h new file mode 100644 index 0000000..57f7115 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h @@ -0,0 +1,259 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" + +#if SD_MAC + +#import "SDWebImageManager.h" + +@interface NSButton (WebCache) + +#pragma mark - Image + +/** + * Get the current image URL. + */ +- (nullable NSURL *)sd_currentImageURL; + +/** + * Set the button `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; + +/** + * Set the button `image` with an `url` and a placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @see sd_setImageWithURL:placeholderImage:options: + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; + +/** + * Set the button `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; + +/** + * Set the button `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Set the button `image` with an `url`, placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; + +/** + * Set the button `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Set the button `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; + +#pragma mark - Alternate Image + +/** + * Get the current alternateImage URL. + */ +- (nullable NSURL *)sd_currentAlternateImageURL; + +/** + * Set the button `alternateImage` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; + +/** + * Set the button `alternateImage` with an `url` and a placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. + * @see sd_setAlternateImageWithURL:placeholderImage:options: + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; + +/** + * Set the button `alternateImage` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. + * @param options The options to use when downloading the alternateImage. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; + +/** + * Set the button `alternateImage` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the alternateImage was retrieved from the local cache or from the network. + * The fourth parameter is the original alternateImage url. + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Set the button `alternateImage` with an `url`, placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the alternateImage was retrieved from the local cache or from the network. + * The fourth parameter is the original alternateImage url. + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; + +/** + * Set the button `alternateImage` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. + * @param options The options to use when downloading the alternateImage. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the alternateImage was retrieved from the local cache or from the network. + * The fourth parameter is the original alternateImage url. + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Set the button `alternateImage` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the alternateImage. + * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. + * @param options The options to use when downloading the alternateImage. @see SDWebImageOptions for the possible values. + * @param progressBlock A block called while alternateImage is downloading + * @note the progress block is executed on a background queue + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the alternateImage was retrieved from the local cache or from the network. + * The fourth parameter is the original alternateImage url. + */ +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; + +#pragma mark - Cancel + +/** + * Cancel the current image download + */ +- (void)sd_cancelCurrentImageLoad; + +/** + * Cancel the current alternateImage download + */ +- (void)sd_cancelCurrentAlternateImageLoad; + +@end + +#endif diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m new file mode 100644 index 0000000..3ca080f --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m @@ -0,0 +1,147 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "NSButton+WebCache.h" + +#if SD_MAC + +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" +#import "UIView+WebCache.h" + +static inline NSString * imageOperationKey() { + return @"NSButtonImageOperation"; +} + +static inline NSString * alternateImageOperationKey() { + return @"NSButtonAlternateImageOperation"; +} + +@implementation NSButton (WebCache) + +#pragma mark - Image + +- (void)sd_setImageWithURL:(nullable NSURL *)url { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + self.sd_currentImageURL = url; + + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:imageOperationKey() + setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData) { + weakSelf.image = image; + } + progress:progressBlock + completed:completedBlock]; +} + +#pragma mark - Alternate Image + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url { + [self sd_setAlternateImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +} + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { + [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +} + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +} + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setAlternateImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; +} + +- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + self.sd_currentAlternateImageURL = url; + + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:alternateImageOperationKey() + setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData) { + weakSelf.alternateImage = image; + } + progress:progressBlock + completed:completedBlock]; +} + +#pragma mark - Cancel + +- (void)sd_cancelCurrentImageLoad { + [self sd_cancelImageLoadOperationWithKey:imageOperationKey()]; +} + +- (void)sd_cancelCurrentAlternateImageLoad { + [self sd_cancelImageLoadOperationWithKey:alternateImageOperationKey()]; +} + +#pragma mar - Private + +- (NSURL *)sd_currentImageURL { + return objc_getAssociatedObject(self, @selector(sd_currentImageURL)); +} + +- (void)setSd_currentImageURL:(NSURL *)sd_currentImageURL { + objc_setAssociatedObject(self, @selector(sd_currentImageURL), sd_currentImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSURL *)sd_currentAlternateImageURL { + return objc_getAssociatedObject(self, @selector(sd_currentAlternateImageURL)); +} + +- (void)setSd_currentAlternateImageURL:(NSURL *)sd_currentAlternateImageURL { + objc_setAssociatedObject(self, @selector(sd_currentAlternateImageURL), sd_currentAlternateImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.h b/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h similarity index 60% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h index b23b0bd..d29bbad 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h @@ -16,7 +16,9 @@ typedef NS_ENUM(NSInteger, SDImageFormat) { SDImageFormatPNG, SDImageFormatGIF, SDImageFormatTIFF, - SDImageFormatWebP + SDImageFormatWebP, + SDImageFormatHEIC, + SDImageFormatHEIF }; @interface NSData (ImageContentType) @@ -30,4 +32,20 @@ typedef NS_ENUM(NSInteger, SDImageFormat) { */ + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data; +/** + * Convert SDImageFormat to UTType + * + * @param format Format as SDImageFormat + * @return The UTType as CFStringRef + */ ++ (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format; + +/** + * Convert UTTyppe to SDImageFormat + * + * @param uttype The UTType as CFStringRef + * @return The Format as SDImageFormat + */ ++ (SDImageFormat)sd_imageFormatFromUTType:(nonnull CFStringRef)uttype; + @end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m b/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m new file mode 100644 index 0000000..927330c --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m @@ -0,0 +1,130 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Fabrice Aneche + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "NSData+ImageContentType.h" +#if SD_MAC +#import +#else +#import +#endif + +// Currently Image/IO does not support WebP +#define kSDUTTypeWebP ((__bridge CFStringRef)@"public.webp") +// AVFileTypeHEIC/AVFileTypeHEIF is defined in AVFoundation via iOS 11, we use this without import AVFoundation +#define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic") +#define kSDUTTypeHEIF ((__bridge CFStringRef)@"public.heif") + +@implementation NSData (ImageContentType) + ++ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data { + if (!data) { + return SDImageFormatUndefined; + } + + // File signatures table: http://www.garykessler.net/library/file_sigs.html + uint8_t c; + [data getBytes:&c length:1]; + switch (c) { + case 0xFF: + return SDImageFormatJPEG; + case 0x89: + return SDImageFormatPNG; + case 0x47: + return SDImageFormatGIF; + case 0x49: + case 0x4D: + return SDImageFormatTIFF; + case 0x52: { + if (data.length >= 12) { + //RIFF....WEBP + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; + if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { + return SDImageFormatWebP; + } + } + break; + } + case 0x00: { + if (data.length >= 12) { + //....ftypheic ....ftypheix ....ftyphevc ....ftyphevx + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(4, 8)] encoding:NSASCIIStringEncoding]; + if ([testString isEqualToString:@"ftypheic"] + || [testString isEqualToString:@"ftypheix"] + || [testString isEqualToString:@"ftyphevc"] + || [testString isEqualToString:@"ftyphevx"]) { + return SDImageFormatHEIC; + } + if ([testString isEqualToString:@"ftypmif1"] || [testString isEqualToString:@"ftypmsf1"]) { + return SDImageFormatHEIF; + } + } + break; + } + } + return SDImageFormatUndefined; +} + ++ (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format { + CFStringRef UTType; + switch (format) { + case SDImageFormatJPEG: + UTType = kUTTypeJPEG; + break; + case SDImageFormatPNG: + UTType = kUTTypePNG; + break; + case SDImageFormatGIF: + UTType = kUTTypeGIF; + break; + case SDImageFormatTIFF: + UTType = kUTTypeTIFF; + break; + case SDImageFormatWebP: + UTType = kSDUTTypeWebP; + break; + case SDImageFormatHEIC: + UTType = kSDUTTypeHEIC; + break; + case SDImageFormatHEIF: + UTType = kSDUTTypeHEIF; + break; + default: + // default is kUTTypePNG + UTType = kUTTypePNG; + break; + } + return UTType; +} + ++ (SDImageFormat)sd_imageFormatFromUTType:(CFStringRef)uttype { + if (!uttype) { + return SDImageFormatUndefined; + } + SDImageFormat imageFormat; + if (CFStringCompare(uttype, kUTTypeJPEG, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatJPEG; + } else if (CFStringCompare(uttype, kUTTypePNG, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatPNG; + } else if (CFStringCompare(uttype, kUTTypeGIF, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatGIF; + } else if (CFStringCompare(uttype, kUTTypeTIFF, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatTIFF; + } else if (CFStringCompare(uttype, kSDUTTypeWebP, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatWebP; + } else if (CFStringCompare(uttype, kSDUTTypeHEIC, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatHEIC; + } else if (CFStringCompare(uttype, kSDUTTypeHEIF, 0) == kCFCompareEqualTo) { + imageFormat = SDImageFormatHEIF; + } else { + imageFormat = SDImageFormatUndefined; + } + return imageFormat; +} + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSImage+WebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h similarity index 100% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/NSImage+WebCache.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSImage+WebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m similarity index 59% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/NSImage+WebCache.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m index 518b498..140ed6c 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSImage+WebCache.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m @@ -23,7 +23,16 @@ - (CGImageRef)CGImage { } - (BOOL)isGIF { - return NO; + BOOL isGIF = NO; + for (NSImageRep *rep in self.representations) { + if ([rep isKindOfClass:[NSBitmapImageRep class]]) { + NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)rep; + NSUInteger frameCount = [[bitmapRep valueForProperty:NSImageFrameCount] unsignedIntegerValue]; + isGIF = frameCount > 1 ? YES : NO; + break; + } + } + return isGIF; } @end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h new file mode 100644 index 0000000..c794c4b --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h @@ -0,0 +1,20 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" + +#if SD_MAC + +// A subclass of `NSBitmapImageRep` to fix that GIF loop count issue because `NSBitmapImageRep` will reset `NSImageCurrentFrameDuration` by using `kCGImagePropertyGIFDelayTime` but not `kCGImagePropertyGIFUnclampedDelayTime`. +// Built in GIF coder use this instead of `NSBitmapImageRep` for better GIF rendering. If you do not want this, only enable `SDWebImageImageIOCoder`, which just call `NSImage` API and actually use `NSBitmapImageRep` for GIF image. + +@interface SDAnimatedImageRep : NSBitmapImageRep + +@end + +#endif diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m new file mode 100644 index 0000000..f0907d5 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m @@ -0,0 +1,66 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDAnimatedImageRep.h" + +#if SD_MAC + +#import "SDWebImageGIFCoder.h" + +@interface SDWebImageGIFCoder () + +- (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source; + +@end + +@interface SDAnimatedImageRep () + +@property (nonatomic, assign, readonly, nullable) CGImageSourceRef imageSource; + +@end + +@implementation SDAnimatedImageRep + +// `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. +- (void)setProperty:(NSBitmapImageRepPropertyKey)property withValue:(id)value { + [super setProperty:property withValue:value]; + if ([property isEqualToString:NSImageCurrentFrame]) { + // Access the image source + CGImageSourceRef imageSource = self.imageSource; + if (!imageSource) { + return; + } + // Check format type + CFStringRef type = CGImageSourceGetType(imageSource); + if (!type) { + return; + } + NSUInteger index = [value unsignedIntegerValue]; + float frameDuration = 0; + // Through we currently process GIF only, in the 5.x we support APNG so we keep the extensibility + if (CFStringCompare(type, kUTTypeGIF, 0) == kCFCompareEqualTo) { + frameDuration = [[SDWebImageGIFCoder sharedCoder] sd_frameDurationAtIndex:index source:imageSource]; + } + if (!frameDuration) { + return; + } + // Reset super frame duration with the actual frame duration + [super setProperty:NSImageCurrentFrameDuration withValue:@(frameDuration)]; + } +} + +- (CGImageSourceRef)imageSource { + if (_tiffData) { + return (__bridge CGImageSourceRef)(_tiffData); + } + return NULL; +} + +@end + +#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.h similarity index 81% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCache.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.h index 9ae2eb4..ce25989 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCache.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.h @@ -8,8 +8,7 @@ #import #import "SDWebImageCompat.h" - -@class SDImageCacheConfig; +#import "SDImageCacheConfig.h" typedef NS_ENUM(NSInteger, SDImageCacheType) { /** @@ -26,6 +25,22 @@ typedef NS_ENUM(NSInteger, SDImageCacheType) { SDImageCacheTypeMemory }; +typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) { + /** + * By default, we do not query disk data when the image is cached in memory. This mask can force to query disk data at the same time. + */ + SDImageCacheQueryDataWhenInMemory = 1 << 0, + /** + * By default, we query the memory cache synchronously, disk cache asynchronously. This mask can force to query disk cache synchronously. + */ + SDImageCacheQueryDiskSync = 1 << 1, + /** + * By default, images are decoded respecting their original size. On iOS, this flag will scale down the + * images to a size compatible with the constrained memory of devices. + */ + SDImageCacheScaleDownLargeImages = 1 << 2 +}; + typedef void(^SDCacheQueryCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType); typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); @@ -139,7 +154,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Synchronously store image NSData into disk cache at the given key. * - * @warning This method is synchronous, make sure to call it from the ioQueue * * @param imageData The image data to store * @param key The unique image cache key, usually it's image absolute URL @@ -157,6 +171,21 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; +/** + * Sync check if image data exists in disk cache already (does not load the image) + * + * @param key the key describing the url + */ +- (BOOL)diskImageDataExistsWithKey:(nullable NSString *)key; + +/** + * Query the image data for the given key synchronously. + * + * @param key The unique key used to store the wanted image + * @return The image data for the given key, or nil if not found. + */ +- (nullable NSData *)diskImageDataForKey:(nullable NSString *)key; + /** * Operation that queries the cache asynchronously and call the completion when done. * @@ -167,10 +196,22 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock; +/** + * Operation that queries the cache asynchronously and call the completion when done. + * + * @param key The unique key used to store the wanted image + * @param options A mask to specify options to use for this cache query + * @param doneBlock The completion block. Will not get called if the operation is cancelled + * + * @return a NSOperation instance containing the cache op + */ +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options done:(nullable SDCacheQueryCompletedBlock)doneBlock; + /** * Query the memory cache synchronously. * * @param key The unique key used to store the image + * @return The image for the given key, or nil if not found. */ - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key; @@ -178,6 +219,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * Query the disk cache synchronously. * * @param key The unique key used to store the image + * @return The image for the given key, or nil if not found. */ - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key; @@ -185,6 +227,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * Query the cache (memory and or disk) synchronously after checking the memory cache. * * @param key The unique key used to store the image + * @return The image for the given key, or nil if not found. */ - (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key; diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.m similarity index 59% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCache.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.m index acd5ee6..015f6ac 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCache.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.m @@ -7,61 +7,151 @@ */ #import "SDImageCache.h" -#import "SDWebImageDecoder.h" -#import "UIImage+MultiFormat.h" #import -#import "UIImage+GIF.h" -#import "NSData+ImageContentType.h" #import "NSImage+WebCache.h" -#import "SDImageCacheConfig.h" +#import "UIImage+MemoryCacheCost.h" +#import "SDWebImageCodersManager.h" + +#define SD_MAX_FILE_EXTENSION_LENGTH (NAME_MAX - CC_MD5_DIGEST_LENGTH * 2 - 1) + +#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); +#define UNLOCK(lock) dispatch_semaphore_signal(lock); + +// A memory cache which auto purge the cache on memory warning and support weak cache. +@interface SDMemoryCache : NSCache -// See https://github.com/rs/SDWebImage/pull/1141 for discussion -@interface AutoPurgeCache : NSCache @end -@implementation AutoPurgeCache +// Private +@interface SDMemoryCache () + +@property (nonatomic, strong, nonnull) SDImageCacheConfig *config; +@property (nonatomic, strong, nonnull) NSMapTable *weakCache; // strong-weak cache +@property (nonatomic, strong, nonnull) dispatch_semaphore_t weakCacheLock; // a lock to keep the access to `weakCache` thread-safe + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithConfig:(nonnull SDImageCacheConfig *)config; -- (nonnull instancetype)init { +@end + +@implementation SDMemoryCache + +// Current this seems no use on macOS (macOS use virtual memory and do not clear cache when memory warning). So we only override on iOS/tvOS platform. +// But in the future there may be more options and features for this subclass. +#if SD_UIKIT + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +} + +- (instancetype)initWithConfig:(SDImageCacheConfig *)config { self = [super init]; if (self) { -#if SD_UIKIT - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; -#endif + // Use a strong-weak maptable storing the secondary cache. Follow the doc that NSCache does not copy keys + // This is useful when the memory warning, the cache was purged. However, the image instance can be retained by other instance such as imageViews and alive. + // At this case, we can sync weak cache back and do not need to load from disk cache + self.weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0]; + self.weakCacheLock = dispatch_semaphore_create(1); + self.config = config; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didReceiveMemoryWarning:) + name:UIApplicationDidReceiveMemoryWarningNotification + object:nil]; } return self; } -- (void)dealloc { -#if SD_UIKIT - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; -#endif +- (void)didReceiveMemoryWarning:(NSNotification *)notification { + // Only remove cache, but keep weak cache + [super removeAllObjects]; } -@end +// `setObject:forKey:` just call this with 0 cost. Override this is enough +- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g { + [super setObject:obj forKey:key cost:g]; + if (!self.config.shouldUseWeakMemoryCache) { + return; + } + if (key && obj) { + // Store weak cache + LOCK(self.weakCacheLock); + // Do the real copy of the key and only let NSMapTable manage the key's lifetime + // Fixes issue #2507 https://github.com/SDWebImage/SDWebImage/issues/2507 + [self.weakCache setObject:obj forKey:[[key mutableCopy] copy]]; + UNLOCK(self.weakCacheLock); + } +} +- (id)objectForKey:(id)key { + id obj = [super objectForKey:key]; + if (!self.config.shouldUseWeakMemoryCache) { + return obj; + } + if (key && !obj) { + // Check weak cache + LOCK(self.weakCacheLock); + obj = [self.weakCache objectForKey:key]; + UNLOCK(self.weakCacheLock); + if (obj) { + // Sync cache + NSUInteger cost = 0; + if ([obj isKindOfClass:[UIImage class]]) { + cost = [(UIImage *)obj sd_memoryCost]; + } + [super setObject:obj forKey:key cost:cost]; + } + } + return obj; +} -FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { -#if SD_MAC - return image.size.height * image.size.width; -#elif SD_UIKIT || SD_WATCH - return image.size.height * image.size.width * image.scale * image.scale; -#endif +- (void)removeObjectForKey:(id)key { + [super removeObjectForKey:key]; + if (!self.config.shouldUseWeakMemoryCache) { + return; + } + if (key) { + // Remove weak cache + LOCK(self.weakCacheLock); + [self.weakCache removeObjectForKey:key]; + UNLOCK(self.weakCacheLock); + } } +- (void)removeAllObjects { + [super removeAllObjects]; + if (!self.config.shouldUseWeakMemoryCache) { + return; + } + // Manually remove should also remove weak cache + LOCK(self.weakCacheLock); + [self.weakCache removeAllObjects]; + UNLOCK(self.weakCacheLock); +} + +#else + +- (instancetype)initWithConfig:(SDImageCacheConfig *)config { + self = [super init]; + return self; +} + +#endif + +@end + @interface SDImageCache () #pragma mark - Properties -@property (strong, nonatomic, nonnull) NSCache *memCache; +@property (strong, nonatomic, nonnull) SDMemoryCache *memCache; @property (strong, nonatomic, nonnull) NSString *diskCachePath; @property (strong, nonatomic, nullable) NSMutableArray *customPaths; -@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t ioQueue; +@property (strong, nonatomic, nullable) dispatch_queue_t ioQueue; +@property (strong, nonatomic, nonnull) NSFileManager *fileManager; @end -@implementation SDImageCache { - NSFileManager *_fileManager; -} +@implementation SDImageCache #pragma mark - Singleton, init, dealloc @@ -94,7 +184,7 @@ - (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns _config = [[SDImageCacheConfig alloc] init]; // Init the memory cache - _memCache = [[AutoPurgeCache alloc] init]; + _memCache = [[SDMemoryCache alloc] initWithConfig:_config]; _memCache.name = fullNamespace; // Init the disk cache @@ -106,16 +196,11 @@ - (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns } dispatch_sync(_ioQueue, ^{ - _fileManager = [NSFileManager new]; + self.fileManager = [NSFileManager new]; }); #if SD_UIKIT // Subscribe to app events - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(clearMemory) - name:UIApplicationDidReceiveMemoryWarningNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deleteOldFiles) name:UIApplicationWillTerminateNotification @@ -133,15 +218,6 @@ - (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; - SDDispatchQueueRelease(_ioQueue); -} - -- (void)checkIfQueueIsIOQueue { - const char *currentQueueLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); - const char *ioQueueLabel = dispatch_queue_get_label(self.ioQueue); - if (strcmp(currentQueueLabel, ioQueueLabel) != 0) { - NSLog(@"This method should be called from the ioQueue"); - } } #pragma mark - Cache paths @@ -172,10 +248,15 @@ - (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key { } unsigned char r[CC_MD5_DIGEST_LENGTH]; CC_MD5(str, (CC_LONG)strlen(str), r); + NSURL *keyURL = [NSURL URLWithString:key]; + NSString *ext = keyURL ? keyURL.pathExtension : key.pathExtension; + // File system has file name length limit, we need to check if ext is too long, we don't add it to the filename + if (ext.length > SD_MAX_FILE_EXTENSION_LENGTH) { + ext = nil; + } NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%@", r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], - r[11], r[12], r[13], r[14], r[15], [key.pathExtension isEqualToString:@""] ? @"" : [NSString stringWithFormat:@".%@", key.pathExtension]]; - + r[11], r[12], r[13], r[14], r[15], ext.length == 0 ? @"" : [NSString stringWithFormat:@".%@", ext]]; return filename; } @@ -212,20 +293,27 @@ - (void)storeImage:(nullable UIImage *)image } // if memory cache is enabled if (self.config.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(image); + NSUInteger cost = image.sd_memoryCost; [self.memCache setObject:image forKey:key cost:cost]; } if (toDisk) { dispatch_async(self.ioQueue, ^{ - NSData *data = imageData; - - if (!data && image) { - SDImageFormat imageFormatFromData = [NSData sd_imageFormatForImageData:data]; - data = [image sd_imageDataAsFormat:imageFormatFromData]; + @autoreleasepool { + NSData *data = imageData; + if (!data && image) { + // If we do not have any data to detect image format, check whether it contains alpha channel to use PNG or JPEG format + SDImageFormat format; + if (SDCGImageRefContainsAlpha(image.CGImage)) { + format = SDImageFormatPNG; + } else { + format = SDImageFormatJPEG; + } + data = [[SDWebImageCodersManager sharedInstance] encodedDataWithImage:image format:format]; + } + [self _storeImageDataToDisk:data forKey:key]; } - [self storeImageDataToDisk:data forKey:key]; if (completionBlock) { dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(); @@ -243,11 +331,19 @@ - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSStr if (!imageData || !key) { return; } + dispatch_sync(self.ioQueue, ^{ + [self _storeImageDataToDisk:imageData forKey:key]; + }); +} + +// Make sure to call form io queue by caller +- (void)_storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { + if (!imageData || !key) { + return; + } - [self checkIfQueueIsIOQueue]; - - if (![_fileManager fileExistsAtPath:_diskCachePath]) { - [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; + if (![self.fileManager fileExistsAtPath:_diskCachePath]) { + [self.fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; } // get cache Path for image key @@ -255,7 +351,7 @@ - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSStr // transform to NSUrl NSURL *fileURL = [NSURL fileURLWithPath:cachePathForKey]; - [_fileManager createFileAtPath:cachePathForKey contents:imageData attributes:nil]; + [imageData writeToURL:fileURL options:self.config.diskCacheWritingOptions error:nil]; // disable iCloud backup if (self.config.shouldDisableiCloud) { @@ -266,15 +362,8 @@ - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSStr #pragma mark - Query and Retrieve Ops - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { - dispatch_async(_ioQueue, ^{ - BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; - - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name - // checking the key with and without the extension - if (!exists) { - exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; - } - + dispatch_async(self.ioQueue, ^{ + BOOL exists = [self _diskImageDataExistsWithKey:key]; if (completionBlock) { dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(exists); @@ -283,6 +372,46 @@ - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDW }); } +- (BOOL)diskImageDataExistsWithKey:(nullable NSString *)key { + if (!key) { + return NO; + } + __block BOOL exists = NO; + dispatch_sync(self.ioQueue, ^{ + exists = [self _diskImageDataExistsWithKey:key]; + }); + + return exists; +} + +// Make sure to call form io queue by caller +- (BOOL)_diskImageDataExistsWithKey:(nullable NSString *)key { + if (!key) { + return NO; + } + BOOL exists = [self.fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; + + // fallback because of https://github.com/SDWebImage/SDWebImage/pull/976 that added the extension to the disk file name + // checking the key with and without the extension + if (!exists) { + exists = [self.fileManager fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; + } + + return exists; +} + +- (nullable NSData *)diskImageDataForKey:(nullable NSString *)key { + if (!key) { + return nil; + } + __block NSData *imageData = nil; + dispatch_sync(self.ioQueue, ^{ + imageData = [self diskImageDataBySearchingAllPathsForKey:key]; + }); + + return imageData; +} + - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { return [self.memCache objectForKey:key]; } @@ -290,7 +419,7 @@ - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key { UIImage *diskImage = [self diskImageForKey:key]; if (diskImage && self.config.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(diskImage); + NSUInteger cost = diskImage.sd_memoryCost; [self.memCache setObject:diskImage forKey:key cost:cost]; } @@ -311,14 +440,14 @@ - (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key { - (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString *)key { NSString *defaultPath = [self defaultCachePathForKey:key]; - NSData *data = [NSData dataWithContentsOfFile:defaultPath]; + NSData *data = [NSData dataWithContentsOfFile:defaultPath options:self.config.diskCacheReadingOptions error:nil]; if (data) { return data; } - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name + // fallback because of https://github.com/SDWebImage/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension - data = [NSData dataWithContentsOfFile:defaultPath.stringByDeletingPathExtension]; + data = [NSData dataWithContentsOfFile:defaultPath.stringByDeletingPathExtension options:self.config.diskCacheReadingOptions error:nil]; if (data) { return data; } @@ -326,14 +455,14 @@ - (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString * NSArray *customPaths = [self.customPaths copy]; for (NSString *path in customPaths) { NSString *filePath = [self cachePathForKey:key inPath:path]; - NSData *imageData = [NSData dataWithContentsOfFile:filePath]; + NSData *imageData = [NSData dataWithContentsOfFile:filePath options:self.config.diskCacheReadingOptions error:nil]; if (imageData) { return imageData; } - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name + // fallback because of https://github.com/SDWebImage/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension - imageData = [NSData dataWithContentsOfFile:filePath.stringByDeletingPathExtension]; + imageData = [NSData dataWithContentsOfFile:filePath.stringByDeletingPathExtension options:self.config.diskCacheReadingOptions error:nil]; if (imageData) { return imageData; } @@ -343,16 +472,24 @@ - (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString * } - (nullable UIImage *)diskImageForKey:(nullable NSString *)key { - NSData *data = [self diskImageDataBySearchingAllPathsForKey:key]; + NSData *data = [self diskImageDataForKey:key]; + return [self diskImageForKey:key data:data]; +} + +- (nullable UIImage *)diskImageForKey:(nullable NSString *)key data:(nullable NSData *)data { + return [self diskImageForKey:key data:data options:0]; +} + +- (nullable UIImage *)diskImageForKey:(nullable NSString *)key data:(nullable NSData *)data options:(SDImageCacheOptions)options { if (data) { - UIImage *image = [UIImage sd_imageWithData:data]; + UIImage *image = [[SDWebImageCodersManager sharedInstance] decodedImageWithData:data]; image = [self scaledImageForKey:key image:image]; if (self.config.shouldDecompressImages) { - image = [UIImage decodedImageWithImage:image]; + BOOL shouldScaleDown = options & SDImageCacheScaleDownLargeImages; + image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&data options:@{SDWebImageCoderScaleDownLargeImagesKey: @(shouldScaleDown)}]; } return image; - } - else { + } else { return nil; } } @@ -361,50 +498,71 @@ - (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable return SDScaledImageForKey(key, image); } -- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock { +- (NSOperation *)queryCacheOperationForKey:(NSString *)key done:(SDCacheQueryCompletedBlock)doneBlock { + return [self queryCacheOperationForKey:key options:0 done:doneBlock]; +} + +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options done:(nullable SDCacheQueryCompletedBlock)doneBlock { if (!key) { if (doneBlock) { doneBlock(nil, nil, SDImageCacheTypeNone); } return nil; } - + // First check the in-memory cache... UIImage *image = [self imageFromMemoryCacheForKey:key]; - if (image) { - NSData *diskData = nil; - if ([image isGIF]) { - diskData = [self diskImageDataBySearchingAllPathsForKey:key]; - } + BOOL shouldQueryMemoryOnly = (image && !(options & SDImageCacheQueryDataWhenInMemory)); + if (shouldQueryMemoryOnly) { if (doneBlock) { - doneBlock(image, diskData, SDImageCacheTypeMemory); + doneBlock(image, nil, SDImageCacheTypeMemory); } return nil; } - + NSOperation *operation = [NSOperation new]; - dispatch_async(self.ioQueue, ^{ + void(^queryDiskBlock)(void) = ^{ if (operation.isCancelled) { // do not call the completion if cancelled return; } - + @autoreleasepool { NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key]; - UIImage *diskImage = [self diskImageForKey:key]; - if (diskImage && self.config.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(diskImage); - [self.memCache setObject:diskImage forKey:key cost:cost]; + UIImage *diskImage; + SDImageCacheType cacheType = SDImageCacheTypeNone; + if (image) { + // the image is from in-memory cache + diskImage = image; + cacheType = SDImageCacheTypeMemory; + } else if (diskData) { + cacheType = SDImageCacheTypeDisk; + // decode image data only if in-memory cache missed + diskImage = [self diskImageForKey:key data:diskData options:options]; + if (diskImage && self.config.shouldCacheImagesInMemory) { + NSUInteger cost = diskImage.sd_memoryCost; + [self.memCache setObject:diskImage forKey:key cost:cost]; + } } - + if (doneBlock) { - dispatch_async(dispatch_get_main_queue(), ^{ - doneBlock(diskImage, diskData, SDImageCacheTypeDisk); - }); + if (options & SDImageCacheQueryDiskSync) { + doneBlock(diskImage, diskData, cacheType); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + doneBlock(diskImage, diskData, cacheType); + }); + } } } - }); - + }; + + if (options & SDImageCacheQueryDiskSync) { + queryDiskBlock(); + } else { + dispatch_async(self.ioQueue, queryDiskBlock); + } + return operation; } @@ -425,7 +583,7 @@ - (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withC if (fromDisk) { dispatch_async(self.ioQueue, ^{ - [_fileManager removeItemAtPath:[self defaultCachePathForKey:key] error:nil]; + [self.fileManager removeItemAtPath:[self defaultCachePathForKey:key] error:nil]; if (completion) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -465,8 +623,8 @@ - (void)clearMemory { - (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion { dispatch_async(self.ioQueue, ^{ - [_fileManager removeItemAtPath:self.diskCachePath error:nil]; - [_fileManager createDirectoryAtPath:self.diskCachePath + [self.fileManager removeItemAtPath:self.diskCachePath error:nil]; + [self.fileManager createDirectoryAtPath:self.diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; @@ -486,10 +644,26 @@ - (void)deleteOldFiles { - (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock { dispatch_async(self.ioQueue, ^{ NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; - NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; + + // Compute content date key to be used for tests + NSURLResourceKey cacheContentDateKey = NSURLContentModificationDateKey; + switch (self.config.diskCacheExpireType) { + case SDImageCacheConfigExpireTypeAccessDate: + cacheContentDateKey = NSURLContentAccessDateKey; + break; + + case SDImageCacheConfigExpireTypeModificationDate: + cacheContentDateKey = NSURLContentModificationDateKey; + break; + + default: + break; + } + + NSArray *resourceKeys = @[NSURLIsDirectoryKey, cacheContentDateKey, NSURLTotalFileAllocatedSizeKey]; // This enumerator prefetches useful properties for our cache files. - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL + NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL includingPropertiesForKeys:resourceKeys options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:NULL]; @@ -513,12 +687,12 @@ - (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)comp } // Remove files that are older than the expiration date; - NSDate *modificationDate = resourceValues[NSURLContentModificationDateKey]; - if ([[modificationDate laterDate:expirationDate] isEqualToDate:expirationDate]) { + NSDate *modifiedDate = resourceValues[cacheContentDateKey]; + if ([[modifiedDate laterDate:expirationDate] isEqualToDate:expirationDate]) { [urlsToDelete addObject:fileURL]; continue; } - + // Store a reference to this file and account for its total size. NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; currentCacheSize += totalAllocatedSize.unsignedIntegerValue; @@ -526,7 +700,7 @@ - (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)comp } for (NSURL *fileURL in urlsToDelete) { - [_fileManager removeItemAtURL:fileURL error:nil]; + [self.fileManager removeItemAtURL:fileURL error:nil]; } // If our remaining disk cache exceeds a configured maximum size, perform a second @@ -535,15 +709,15 @@ - (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)comp // Target half of our maximum cache size for this cleanup pass. const NSUInteger desiredCacheSize = self.config.maxCacheSize / 2; - // Sort the remaining cache files by their last modification time (oldest first). + // Sort the remaining cache files by their last modification time or last access time (oldest first). NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(id obj1, id obj2) { - return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; + return [obj1[cacheContentDateKey] compare:obj2[cacheContentDateKey]]; }]; // Delete files until we fall below our desired cache size. for (NSURL *fileURL in sortedFiles) { - if ([_fileManager removeItemAtURL:fileURL error:nil]) { + if ([self.fileManager removeItemAtURL:fileURL error:nil]) { NSDictionary *resourceValues = cacheFiles[fileURL]; NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; currentCacheSize -= totalAllocatedSize.unsignedIntegerValue; @@ -589,10 +763,10 @@ - (void)backgroundDeleteOldFiles { - (NSUInteger)getSize { __block NSUInteger size = 0; dispatch_sync(self.ioQueue, ^{ - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; + NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtPath:self.diskCachePath]; for (NSString *fileName in fileEnumerator) { NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; - NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; + NSDictionary *attrs = [self.fileManager attributesOfItemAtPath:filePath error:nil]; size += [attrs fileSize]; } }); @@ -602,7 +776,7 @@ - (NSUInteger)getSize { - (NSUInteger)getDiskCount { __block NSUInteger count = 0; dispatch_sync(self.ioQueue, ^{ - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; + NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtPath:self.diskCachePath]; count = fileEnumerator.allObjects.count; }); return count; @@ -615,7 +789,7 @@ - (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock) NSUInteger fileCount = 0; NSUInteger totalSize = 0; - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL + NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL includingPropertiesForKeys:@[NSFileSize] options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:NULL]; diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h new file mode 100644 index 0000000..c0de688 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h @@ -0,0 +1,79 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" + +typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) { + /** + * When the image is accessed it will update this value + */ + SDImageCacheConfigExpireTypeAccessDate, + /** + * The image was obtained from the disk cache (Default) + */ + SDImageCacheConfigExpireTypeModificationDate +}; + +@interface SDImageCacheConfig : NSObject + +/** + * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. + * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. + */ +@property (assign, nonatomic) BOOL shouldDecompressImages; + +/** + * Whether or not to disable iCloud backup + * Defaults to YES. + */ +@property (assign, nonatomic) BOOL shouldDisableiCloud; + +/** + * Whether or not to use memory cache + * @note When the memory cache is disabled, the weak memory cache will also be disabled. + * Defaults to YES. + */ +@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; + +/** + * The option to control weak memory cache for images. When enable, `SDImageCache`'s memory cache will use a weak maptable to store the image at the same time when it stored to memory, and get removed at the same time. + * However when memory warning is triggered, since the weak maptable does not hold a strong reference to image instacnce, even when the memory cache itself is purged, some images which are held strongly by UIImageViews or other live instances can be recovered again, to avoid later re-query from disk cache or network. This may be helpful for the case, for example, when app enter background and memory is purged, cause cell flashing after re-enter foreground. + * Defautls to YES. You can change this option dynamically. + */ +@property (assign, nonatomic) BOOL shouldUseWeakMemoryCache; + +/** + * The reading options while reading cache from disk. + * Defaults to 0. You can set this to `NSDataReadingMappedIfSafe` to improve performance. + */ +@property (assign, nonatomic) NSDataReadingOptions diskCacheReadingOptions; + +/** + * The writing options while writing cache to disk. + * Defaults to `NSDataWritingAtomic`. You can set this to `NSDataWritingWithoutOverwriting` to prevent overwriting an existing file. + */ +@property (assign, nonatomic) NSDataWritingOptions diskCacheWritingOptions; + +/** + * The maximum length of time to keep an image in the cache, in seconds. + */ +@property (assign, nonatomic) NSInteger maxCacheAge; + +/** + * The maximum size of the cache, in bytes. + */ +@property (assign, nonatomic) NSUInteger maxCacheSize; + +/** + * The attribute which the clear cache will be checked against when clearing the disk cache + * Default is Modified Date + */ +@property (assign, nonatomic) SDImageCacheConfigExpireType diskCacheExpireType; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m new file mode 100644 index 0000000..d4f4dd2 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m @@ -0,0 +1,30 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDImageCacheConfig.h" + +static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week + +@implementation SDImageCacheConfig + +- (instancetype)init { + if (self = [super init]) { + _shouldDecompressImages = YES; + _shouldDisableiCloud = YES; + _shouldCacheImagesInMemory = YES; + _shouldUseWeakMemoryCache = YES; + _diskCacheReadingOptions = 0; + _diskCacheWritingOptions = NSDataWritingAtomic; + _maxCacheAge = kDefaultCacheMaxCacheAge; + _maxCacheSize = 0; + _diskCacheExpireType = SDImageCacheConfigExpireTypeModificationDate; + } + return self; +} + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h new file mode 100644 index 0000000..7c0a63f --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h @@ -0,0 +1,119 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" +#import "NSData+ImageContentType.h" + +/** + A Boolean value indicating whether to scale down large images during decompressing. (NSNumber) + */ +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageCoderScaleDownLargeImagesKey; + +/** + Return the shared device-dependent RGB color space created with CGColorSpaceCreateDeviceRGB. + + @return The device-dependent RGB color space + */ +CG_EXTERN CGColorSpaceRef _Nonnull SDCGColorSpaceGetDeviceRGB(void); + +/** + Check whether CGImageRef contains alpha channel. + + @param imageRef The CGImageRef + @return Return YES if CGImageRef contains alpha channel, otherwise return NO + */ +CG_EXTERN BOOL SDCGImageRefContainsAlpha(_Nullable CGImageRef imageRef); + + +/** + This is the image coder protocol to provide custom image decoding/encoding. + These methods are all required to implement. + @note Pay attention that these methods are not called from main queue. + */ +@protocol SDWebImageCoder + +@required +#pragma mark - Decoding +/** + Returns YES if this coder can decode some data. Otherwise, the data should be passed to another coder. + + @param data The image data so we can look at it + @return YES if this coder can decode the data, NO otherwise + */ +- (BOOL)canDecodeFromData:(nullable NSData *)data; + +/** + Decode the image data to image. + + @param data The image data to be decoded + @return The decoded image from data + */ +- (nullable UIImage *)decodedImageWithData:(nullable NSData *)data; + +/** + Decompress the image with original image and image data. + + @param image The original image to be decompressed + @param data The pointer to original image data. The pointer itself is nonnull but image data can be null. This data will set to cache if needed. If you do not need to modify data at the sametime, ignore this param. + @param optionsDict A dictionary containing any decompressing options. Pass {SDWebImageCoderScaleDownLargeImagesKey: @(YES)} to scale down large images + @return The decompressed image + */ +- (nullable UIImage *)decompressedImageWithImage:(nullable UIImage *)image + data:(NSData * _Nullable * _Nonnull)data + options:(nullable NSDictionary*)optionsDict; + +#pragma mark - Encoding + +/** + Returns YES if this coder can encode some image. Otherwise, it should be passed to another coder. + + @param format The image format + @return YES if this coder can encode the image, NO otherwise + */ +- (BOOL)canEncodeToFormat:(SDImageFormat)format; + +/** + Encode the image to image data. + + @param image The image to be encoded + @param format The image format to encode, you should note `SDImageFormatUndefined` format is also possible + @return The encoded image data + */ +- (nullable NSData *)encodedDataWithImage:(nullable UIImage *)image format:(SDImageFormat)format; + +@end + + +/** + This is the image coder protocol to provide custom progressive image decoding. + These methods are all required to implement. + @note Pay attention that these methods are not called from main queue. + */ +@protocol SDWebImageProgressiveCoder + +@required +/** + Returns YES if this coder can incremental decode some data. Otherwise, it should be passed to another coder. + + @param data The image data so we can look at it + @return YES if this coder can decode the data, NO otherwise + */ +- (BOOL)canIncrementallyDecodeFromData:(nullable NSData *)data; + +/** + Incremental decode the image data to image. + + @param data The image data has been downloaded so far + @param finished Whether the download has finished + @warning because incremental decoding need to keep the decoded context, we will alloc a new instance with the same class for each download operation to avoid conflicts + @return The decoded image from data + */ +- (nullable UIImage *)incrementallyDecodedImageWithData:(nullable NSData *)data finished:(BOOL)finished; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m new file mode 100644 index 0000000..9357fe5 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m @@ -0,0 +1,31 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCoder.h" + +NSString * const SDWebImageCoderScaleDownLargeImagesKey = @"scaleDownLargeImages"; + +CGColorSpaceRef SDCGColorSpaceGetDeviceRGB(void) { + static CGColorSpaceRef colorSpace; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + colorSpace = CGColorSpaceCreateDeviceRGB(); + }); + return colorSpace; +} + +BOOL SDCGImageRefContainsAlpha(CGImageRef imageRef) { + if (!imageRef) { + return NO; + } + CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef); + BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || + alphaInfo == kCGImageAlphaNoneSkipFirst || + alphaInfo == kCGImageAlphaNoneSkipLast); + return hasAlpha; +} diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h new file mode 100644 index 0000000..ad2fe85 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h @@ -0,0 +1,52 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" +#import "SDWebImageFrame.h" + +@interface SDWebImageCoderHelper : NSObject + +/** + Return an animated image with frames array. + For UIKit, this will apply the patch and then create animated UIImage. The patch is because that `+[UIImage animatedImageWithImages:duration:]` just use the average of duration for each image. So it will not work if different frame has different duration. Therefore we repeat the specify frame for specify times to let it work. + For AppKit, NSImage does not support animates other than GIF. This will try to encode the frames to GIF format and then create an animated NSImage for rendering. Attention the animated image may loss some detail if the input frames contain full alpha channel because GIF only supports 1 bit alpha channel. (For 1 pixel, either transparent or not) + + @param frames The frames array. If no frames or frames is empty, return nil + @return A animated image for rendering on UIImageView(UIKit) or NSImageView(AppKit) + */ ++ (UIImage * _Nullable)animatedImageWithFrames:(NSArray * _Nullable)frames; + +/** + Return frames array from an animated image. + For UIKit, this will unapply the patch for the description above and then create frames array. This will also work for normal animated UIImage. + For AppKit, NSImage does not support animates other than GIF. This will try to decode the GIF imageRep and then create frames array. + + @param animatedImage A animated image. If it's not animated, return nil + @return The frames array + */ ++ (NSArray * _Nullable)framesFromAnimatedImage:(UIImage * _Nullable)animatedImage; + +#if SD_UIKIT || SD_WATCH +/** + Convert an EXIF image orientation to an iOS one. + + @param exifOrientation EXIF orientation + @return iOS orientation + */ ++ (UIImageOrientation)imageOrientationFromEXIFOrientation:(NSInteger)exifOrientation; +/** + Convert an iOS orientation to an EXIF image orientation. + + @param imageOrientation iOS orientation + @return EXIF orientation + */ ++ (NSInteger)exifOrientationFromImageOrientation:(UIImageOrientation)imageOrientation; +#endif + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m new file mode 100644 index 0000000..ea1dae1 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m @@ -0,0 +1,258 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCoderHelper.h" +#import "SDWebImageFrame.h" +#import "UIImage+MultiFormat.h" +#import "NSImage+WebCache.h" +#import +#import "SDAnimatedImageRep.h" + +@implementation SDWebImageCoderHelper + ++ (UIImage *)animatedImageWithFrames:(NSArray *)frames { + NSUInteger frameCount = frames.count; + if (frameCount == 0) { + return nil; + } + + UIImage *animatedImage; + +#if SD_UIKIT || SD_WATCH + NSUInteger durations[frameCount]; + for (size_t i = 0; i < frameCount; i++) { + durations[i] = frames[i].duration * 1000; + } + NSUInteger const gcd = gcdArray(frameCount, durations); + __block NSUInteger totalDuration = 0; + NSMutableArray *animatedImages = [NSMutableArray arrayWithCapacity:frameCount]; + [frames enumerateObjectsUsingBlock:^(SDWebImageFrame * _Nonnull frame, NSUInteger idx, BOOL * _Nonnull stop) { + UIImage *image = frame.image; + NSUInteger duration = frame.duration * 1000; + totalDuration += duration; + NSUInteger repeatCount; + if (gcd) { + repeatCount = duration / gcd; + } else { + repeatCount = 1; + } + for (size_t i = 0; i < repeatCount; ++i) { + [animatedImages addObject:image]; + } + }]; + + animatedImage = [UIImage animatedImageWithImages:animatedImages duration:totalDuration / 1000.f]; + +#else + + NSMutableData *imageData = [NSMutableData data]; + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatGIF]; + // Create an image destination. GIF does not support EXIF image orientation + CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, frameCount, NULL); + if (!imageDestination) { + // Handle failure. + return nil; + } + + for (size_t i = 0; i < frameCount; i++) { + @autoreleasepool { + SDWebImageFrame *frame = frames[i]; + float frameDuration = frame.duration; + CGImageRef frameImageRef = frame.image.CGImage; + NSDictionary *frameProperties = @{(__bridge NSString *)kCGImagePropertyGIFDictionary : @{(__bridge NSString *)kCGImagePropertyGIFDelayTime : @(frameDuration)}}; + CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)frameProperties); + } + } + // Finalize the destination. + if (CGImageDestinationFinalize(imageDestination) == NO) { + // Handle failure. + CFRelease(imageDestination); + return nil; + } + CFRelease(imageDestination); + SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:imageData]; + animatedImage = [[NSImage alloc] initWithSize:imageRep.size]; + [animatedImage addRepresentation:imageRep]; +#endif + + return animatedImage; +} + ++ (NSArray *)framesFromAnimatedImage:(UIImage *)animatedImage { + if (!animatedImage) { + return nil; + } + + NSMutableArray *frames = [NSMutableArray array]; + NSUInteger frameCount = 0; + +#if SD_UIKIT || SD_WATCH + NSArray *animatedImages = animatedImage.images; + frameCount = animatedImages.count; + if (frameCount == 0) { + return nil; + } + + NSTimeInterval avgDuration = animatedImage.duration / frameCount; + if (avgDuration == 0) { + avgDuration = 0.1; // if it's a animated image but no duration, set it to default 100ms (this do not have that 10ms limit like GIF or WebP to allow custom coder provide the limit) + } + + __block NSUInteger index = 0; + __block NSUInteger repeatCount = 1; + __block UIImage *previousImage = animatedImages.firstObject; + [animatedImages enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) { + // ignore first + if (idx == 0) { + return; + } + if ([image isEqual:previousImage]) { + repeatCount++; + } else { + SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:previousImage duration:avgDuration * repeatCount]; + [frames addObject:frame]; + repeatCount = 1; + index++; + } + previousImage = image; + // last one + if (idx == frameCount - 1) { + SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:previousImage duration:avgDuration * repeatCount]; + [frames addObject:frame]; + } + }]; + +#else + + NSBitmapImageRep *bitmapRep; + for (NSImageRep *imageRep in animatedImage.representations) { + if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) { + bitmapRep = (NSBitmapImageRep *)imageRep; + break; + } + } + if (bitmapRep) { + frameCount = [[bitmapRep valueForProperty:NSImageFrameCount] unsignedIntegerValue]; + } + + if (frameCount == 0) { + return nil; + } + + for (size_t i = 0; i < frameCount; i++) { + @autoreleasepool { + // NSBitmapImageRep need to manually change frame. "Good taste" API + [bitmapRep setProperty:NSImageCurrentFrame withValue:@(i)]; + float frameDuration = [[bitmapRep valueForProperty:NSImageCurrentFrameDuration] floatValue]; + NSImage *frameImage = [[NSImage alloc] initWithCGImage:bitmapRep.CGImage size:CGSizeZero]; + SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:frameImage duration:frameDuration]; + [frames addObject:frame]; + } + } +#endif + + return frames; +} + +#if SD_UIKIT || SD_WATCH +// Convert an EXIF image orientation to an iOS one. ++ (UIImageOrientation)imageOrientationFromEXIFOrientation:(NSInteger)exifOrientation { + // CGImagePropertyOrientation is available on iOS 8 above. Currently kept for compatibility + UIImageOrientation imageOrientation = UIImageOrientationUp; + switch (exifOrientation) { + case 1: + imageOrientation = UIImageOrientationUp; + break; + case 3: + imageOrientation = UIImageOrientationDown; + break; + case 8: + imageOrientation = UIImageOrientationLeft; + break; + case 6: + imageOrientation = UIImageOrientationRight; + break; + case 2: + imageOrientation = UIImageOrientationUpMirrored; + break; + case 4: + imageOrientation = UIImageOrientationDownMirrored; + break; + case 5: + imageOrientation = UIImageOrientationLeftMirrored; + break; + case 7: + imageOrientation = UIImageOrientationRightMirrored; + break; + default: + break; + } + return imageOrientation; +} + +// Convert an iOS orientation to an EXIF image orientation. ++ (NSInteger)exifOrientationFromImageOrientation:(UIImageOrientation)imageOrientation { + // CGImagePropertyOrientation is available on iOS 8 above. Currently kept for compatibility + NSInteger exifOrientation = 1; + switch (imageOrientation) { + case UIImageOrientationUp: + exifOrientation = 1; + break; + case UIImageOrientationDown: + exifOrientation = 3; + break; + case UIImageOrientationLeft: + exifOrientation = 8; + break; + case UIImageOrientationRight: + exifOrientation = 6; + break; + case UIImageOrientationUpMirrored: + exifOrientation = 2; + break; + case UIImageOrientationDownMirrored: + exifOrientation = 4; + break; + case UIImageOrientationLeftMirrored: + exifOrientation = 5; + break; + case UIImageOrientationRightMirrored: + exifOrientation = 7; + break; + default: + break; + } + return exifOrientation; +} +#endif + +#pragma mark - Helper Fuction +#if SD_UIKIT || SD_WATCH +static NSUInteger gcd(NSUInteger a, NSUInteger b) { + NSUInteger c; + while (a != 0) { + c = a; + a = b % a; + b = c; + } + return b; +} + +static NSUInteger gcdArray(size_t const count, NSUInteger const * const values) { + if (count == 0) { + return 0; + } + NSUInteger result = values[0]; + for (size_t i = 1; i < count; ++i) { + result = gcd(values[i], result); + } + return result; +} +#endif + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h new file mode 100644 index 0000000..ca68748 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h @@ -0,0 +1,58 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCoder.h" + +/** + Global object holding the array of coders, so that we avoid passing them from object to object. + Uses a priority queue behind scenes, which means the latest added coders have the highest priority. + This is done so when encoding/decoding something, we go through the list and ask each coder if they can handle the current data. + That way, users can add their custom coders while preserving our existing prebuilt ones + + Note: the `coders` getter will return the coders in their reversed order + Example: + - by default we internally set coders = `IOCoder`, `WebPCoder`. (`GIFCoder` is not recommended to add only if you want to get GIF support without `FLAnimatedImage`) + - calling `coders` will return `@[WebPCoder, IOCoder]` + - call `[addCoder:[MyCrazyCoder new]]` + - calling `coders` now returns `@[MyCrazyCoder, WebPCoder, IOCoder]` + + Coders + ------ + A coder must conform to the `SDWebImageCoder` protocol or even to `SDWebImageProgressiveCoder` if it supports progressive decoding + Conformance is important because that way, they will implement `canDecodeFromData` or `canEncodeToFormat` + Those methods are called on each coder in the array (using the priority order) until one of them returns YES. + That means that coder can decode that data / encode to that format + */ +@interface SDWebImageCodersManager : NSObject + +/** + Shared reusable instance + */ ++ (nonnull instancetype)sharedInstance; + +/** + All coders in coders manager. The coders array is a priority queue, which means the later added coder will have the highest priority + */ +@property (nonatomic, copy, readwrite, nullable) NSArray> *coders; + +/** + Add a new coder to the end of coders array. Which has the highest priority. + + @param coder coder + */ +- (void)addCoder:(nonnull id)coder; + +/** + Remove a coder in the coders array. + + @param coder coder + */ +- (void)removeCoder:(nonnull id)coder; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m new file mode 100644 index 0000000..883d1fd --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m @@ -0,0 +1,148 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCodersManager.h" +#import "SDWebImageImageIOCoder.h" +#import "SDWebImageGIFCoder.h" +#ifdef SD_WEBP +#import "SDWebImageWebPCoder.h" +#endif +#import "UIImage+MultiFormat.h" + +#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); +#define UNLOCK(lock) dispatch_semaphore_signal(lock); + +@interface SDWebImageCodersManager () + +@property (nonatomic, strong, nonnull) dispatch_semaphore_t codersLock; + +@end + +@implementation SDWebImageCodersManager + ++ (nonnull instancetype)sharedInstance { + static dispatch_once_t once; + static id instance; + dispatch_once(&once, ^{ + instance = [self new]; + }); + return instance; +} + +- (instancetype)init { + if (self = [super init]) { + // initialize with default coders + NSMutableArray> *mutableCoders = [@[[SDWebImageImageIOCoder sharedCoder]] mutableCopy]; +#ifdef SD_WEBP + [mutableCoders addObject:[SDWebImageWebPCoder sharedCoder]]; +#endif + _coders = [mutableCoders copy]; + _codersLock = dispatch_semaphore_create(1); + } + return self; +} + +#pragma mark - Coder IO operations + +- (void)addCoder:(nonnull id)coder { + if (![coder conformsToProtocol:@protocol(SDWebImageCoder)]) { + return; + } + LOCK(self.codersLock); + NSMutableArray> *mutableCoders = [self.coders mutableCopy]; + if (!mutableCoders) { + mutableCoders = [NSMutableArray array]; + } + [mutableCoders addObject:coder]; + self.coders = [mutableCoders copy]; + UNLOCK(self.codersLock); +} + +- (void)removeCoder:(nonnull id)coder { + if (![coder conformsToProtocol:@protocol(SDWebImageCoder)]) { + return; + } + LOCK(self.codersLock); + NSMutableArray> *mutableCoders = [self.coders mutableCopy]; + [mutableCoders removeObject:coder]; + self.coders = [mutableCoders copy]; + UNLOCK(self.codersLock); +} + +#pragma mark - SDWebImageCoder +- (BOOL)canDecodeFromData:(NSData *)data { + LOCK(self.codersLock); + NSArray> *coders = self.coders; + UNLOCK(self.codersLock); + for (id coder in coders.reverseObjectEnumerator) { + if ([coder canDecodeFromData:data]) { + return YES; + } + } + return NO; +} + +- (BOOL)canEncodeToFormat:(SDImageFormat)format { + LOCK(self.codersLock); + NSArray> *coders = self.coders; + UNLOCK(self.codersLock); + for (id coder in coders.reverseObjectEnumerator) { + if ([coder canEncodeToFormat:format]) { + return YES; + } + } + return NO; +} + +- (UIImage *)decodedImageWithData:(NSData *)data { + LOCK(self.codersLock); + NSArray> *coders = self.coders; + UNLOCK(self.codersLock); + for (id coder in coders.reverseObjectEnumerator) { + if ([coder canDecodeFromData:data]) { + return [coder decodedImageWithData:data]; + } + } + return nil; +} + +- (UIImage *)decompressedImageWithImage:(UIImage *)image + data:(NSData *__autoreleasing _Nullable *)data + options:(nullable NSDictionary*)optionsDict { + if (!image) { + return nil; + } + LOCK(self.codersLock); + NSArray> *coders = self.coders; + UNLOCK(self.codersLock); + for (id coder in coders.reverseObjectEnumerator) { + if ([coder canDecodeFromData:*data]) { + UIImage *decompressedImage = [coder decompressedImageWithImage:image data:data options:optionsDict]; + decompressedImage.sd_imageFormat = image.sd_imageFormat; + return decompressedImage; + } + } + return nil; +} + +- (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format { + if (!image) { + return nil; + } + LOCK(self.codersLock); + NSArray> *coders = self.coders; + UNLOCK(self.codersLock); + for (id coder in coders.reverseObjectEnumerator) { + if ([coder canEncodeToFormat:format]) { + return [coder encodedDataWithImage:image format:format]; + } + } + return nil; +} + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageCompat.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h similarity index 67% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageCompat.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h index f555c27..a4493ae 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageCompat.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h @@ -15,7 +15,7 @@ // Apple's defines from TargetConditionals.h are a bit weird. // Seems like TARGET_OS_MAC is always defined (on all platforms). -// To determine if we are running on OSX, we can only relly on TARGET_OS_IPHONE=0 and all the other platforms +// To determine if we are running on OSX, we can only rely on TARGET_OS_IPHONE=0 and all the other platforms #if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH #define SD_MAC 1 #else @@ -70,6 +70,12 @@ #endif #if SD_WATCH #import + #ifndef UIView + #define UIView WKInterfaceObject + #endif + #ifndef UIImageView + #define UIImageView WKInterfaceImage + #endif #endif #endif @@ -81,31 +87,21 @@ #define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type #endif -#if OS_OBJECT_USE_OBJC - #undef SDDispatchQueueRelease - #undef SDDispatchQueueSetterSementics - #define SDDispatchQueueRelease(q) - #define SDDispatchQueueSetterSementics strong -#else - #undef SDDispatchQueueRelease - #undef SDDispatchQueueSetterSementics - #define SDDispatchQueueRelease(q) (dispatch_release(q)) - #define SDDispatchQueueSetterSementics assign -#endif - -extern UIImage *SDScaledImageForKey(NSString *key, UIImage *image); +FOUNDATION_EXPORT UIImage *SDScaledImageForKey(NSString *key, UIImage *image); -typedef void(^SDWebImageNoParamsBlock)(); +typedef void(^SDWebImageNoParamsBlock)(void); -extern NSString *const SDWebImageErrorDomain; +FOUNDATION_EXPORT NSString *const SDWebImageErrorDomain; -#ifndef dispatch_main_async_safe -#define dispatch_main_async_safe(block)\ - if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {\ +#ifndef dispatch_queue_async_safe +#define dispatch_queue_async_safe(queue, block)\ + if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\ block();\ } else {\ - dispatch_async(dispatch_get_main_queue(), block);\ + dispatch_async(queue, block);\ } #endif -static int64_t kAsyncTestTimeout = 5; +#ifndef dispatch_main_async_safe +#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block) +#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageCompat.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m similarity index 63% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageCompat.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m index ade04be..ffde1d2 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageCompat.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m @@ -7,9 +7,14 @@ */ #import "SDWebImageCompat.h" +#import "UIImage+MultiFormat.h" #if !__has_feature(objc_arc) -#error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag + #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag +#endif + +#if !OS_OBJECT_USE_OBJC + #error SDWebImage need ARC for dispatch object #endif inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullable image) { @@ -26,10 +31,14 @@ for (UIImage *tempImage in image.images) { [scaledImages addObject:SDScaledImageForKey(key, tempImage)]; } - - return [UIImage animatedImageWithImages:scaledImages duration:image.duration]; - } - else { + + UIImage *animatedImage = [UIImage animatedImageWithImages:scaledImages duration:image.duration]; + if (animatedImage) { + animatedImage.sd_imageLoopCount = image.sd_imageLoopCount; + animatedImage.sd_imageFormat = image.sd_imageFormat; + } + return animatedImage; + } else { #if SD_WATCH if ([[WKInterfaceDevice currentDevice] respondsToSelector:@selector(screenScale)]) { #elif SD_UIKIT @@ -47,9 +56,12 @@ scale = 3.0; } } - - UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation]; - image = scaledImage; + + if (scale != image.scale) { + UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation]; + scaledImage.sd_imageFormat = image.sd_imageFormat; + image = scaledImage; + } } return image; } diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h similarity index 76% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h index 94bc76e..906eaa7 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h @@ -11,7 +11,14 @@ #import "SDWebImageOperation.h" typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { + /** + * Put the download in the low queue priority and task priority. + */ SDWebImageDownloaderLowPriority = 1 << 0, + + /** + * This flag enables progressive download, the image is displayed progressively during download as a browser would do. + */ SDWebImageDownloaderProgressiveDownload = 1 << 1, /** @@ -24,13 +31,12 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { * Call completion block with nil image/imageData if the image was read from NSURLCache * (to be combined with `SDWebImageDownloaderUseNSURLCache`). */ - SDWebImageDownloaderIgnoreCachedResponse = 1 << 3, + /** * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for * extra time in background to let the request finish. If the background task expires the operation will be cancelled. */ - SDWebImageDownloaderContinueInBackground = 1 << 4, /** @@ -46,7 +52,7 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6, /** - * Put the image in the high priority queue. + * Put the download in the high queue priority and task priority. */ SDWebImageDownloaderHighPriority = 1 << 7, @@ -68,8 +74,8 @@ typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { SDWebImageDownloaderLIFOExecutionOrder }; -extern NSString * _Nonnull const SDWebImageDownloadStartNotification; -extern NSString * _Nonnull const SDWebImageDownloadStopNotification; +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStartNotification; +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStopNotification; typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL); @@ -83,9 +89,16 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB /** * A token associated with each download. Can be used to cancel a download */ -@interface SDWebImageDownloadToken : NSObject +@interface SDWebImageDownloadToken : NSObject +/** + The download's URL. This should be readonly and you should not modify + */ @property (nonatomic, strong, nullable) NSURL *url; +/** + The cancel token taken from `addHandlersForProgress:completed`. This should be readonly and you should not modify + @note use `-[SDWebImageDownloadToken cancel]` to cancel the token + */ @property (nonatomic, strong, nullable) id downloadOperationCancelToken; @end @@ -112,12 +125,19 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB */ @property (readonly, nonatomic) NSUInteger currentDownloadCount; - /** * The timeout value (in seconds) for the download operation. Default: 15.0. */ @property (assign, nonatomic) NSTimeInterval downloadTimeout; +/** + * The configuration in use by the internal NSURLSession. + * Mutating this object directly has no effect. + * + * @see createNewSessionWithConfiguration: + */ +@property (readonly, nonatomic, nonnull) NSURLSessionConfiguration *sessionConfiguration; + /** * Changes download operations execution order. Default value is `SDWebImageDownloaderFIFOExecutionOrder`. @@ -156,7 +176,7 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB /** * Creates an instance of a downloader with specified session configuration. - * *Note*: `timeoutIntervalForRequest` is going to be overwritten. + * @note `timeoutIntervalForRequest` is going to be overwritten. * @return new instance of downloader class */ - (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration NS_DESIGNATED_INITIALIZER; @@ -177,12 +197,13 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB - (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field; /** - * Sets a subclass of `SDWebImageDownloaderOperation` as the default - * `NSOperation` to be used each time SDWebImage constructs a request + * Sets a subclass of `NSOperation` and conforms to `SDWebImageDownloaderOperationInterface`. + * Default is `SDWebImageDownloaderOperation`. + * Can be used each time SDWebImage constructs a request * operation to download an image. * - * @param operationClass The subclass of `SDWebImageDownloaderOperation` to set - * as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`. + * @param operationClass The subclass of `NSOperation` and conforms to `SDWebImageDownloaderOperationInterface`. + * Default is `SDWebImageDownloaderOperation`, Passing `nil` will revert to `SDWebImageDownloaderOperation`. */ - (void)setOperationClass:(nullable Class)operationClass; @@ -230,4 +251,22 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB */ - (void)cancelAllDownloads; +/** + * Forces SDWebImageDownloader to create and use a new NSURLSession that is + * initialized with the given configuration. + * @note All existing download operations in the queue will be cancelled. + * @note `timeoutIntervalForRequest` is going to be overwritten. + * + * @param sessionConfiguration The configuration to use for the new NSURLSession + */ +- (void)createNewSessionWithConfiguration:(nonnull NSURLSessionConfiguration *)sessionConfiguration; + +/** + * Invalidates the managed session, optionally canceling pending operations. + * @note If you use custom downloader instead of the shared downloader, you need call this method when you do not use it to avoid memory leak + * @param cancelPendingOperations Whether or not to cancel pending operations. + * @note Calling this method on the shared downloader has no effect. + */ +- (void)invalidateSessionAndCancel:(BOOL)cancelPendingOperations; + @end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m new file mode 100644 index 0000000..30cadca --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m @@ -0,0 +1,434 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageDownloader.h" +#import "SDWebImageDownloaderOperation.h" + +#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); +#define UNLOCK(lock) dispatch_semaphore_signal(lock); + +@interface SDWebImageDownloadToken () + +@property (nonatomic, weak, nullable) NSOperation *downloadOperation; + +@end + +@implementation SDWebImageDownloadToken + +- (void)cancel { + if (self.downloadOperation) { + SDWebImageDownloadToken *cancelToken = self.downloadOperationCancelToken; + if (cancelToken) { + [self.downloadOperation cancel:cancelToken]; + } + } +} + +@end + + +@interface SDWebImageDownloader () + +@property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; +@property (weak, nonatomic, nullable) NSOperation *lastAddedOperation; +@property (assign, nonatomic, nullable) Class operationClass; +@property (strong, nonatomic, nonnull) NSMutableDictionary *> *URLOperations; +@property (strong, nonatomic, nullable) SDHTTPHeadersMutableDictionary *HTTPHeaders; +@property (strong, nonatomic, nonnull) dispatch_semaphore_t operationsLock; // a lock to keep the access to `URLOperations` thread-safe +@property (strong, nonatomic, nonnull) dispatch_semaphore_t headersLock; // a lock to keep the access to `HTTPHeaders` thread-safe + +// The session in which data tasks will run +@property (strong, nonatomic) NSURLSession *session; + +@end + +@implementation SDWebImageDownloader + ++ (void)initialize { + // Bind SDNetworkActivityIndicator if available (download it here: http://github.com/rs/SDNetworkActivityIndicator ) + // To use it, just add #import "SDNetworkActivityIndicator.h" in addition to the SDWebImage import + if (NSClassFromString(@"SDNetworkActivityIndicator")) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + id activityIndicator = [NSClassFromString(@"SDNetworkActivityIndicator") performSelector:NSSelectorFromString(@"sharedActivityIndicator")]; +#pragma clang diagnostic pop + + // Remove observer in case it was previously added. + [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStopNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:activityIndicator + selector:NSSelectorFromString(@"startActivity") + name:SDWebImageDownloadStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:activityIndicator + selector:NSSelectorFromString(@"stopActivity") + name:SDWebImageDownloadStopNotification object:nil]; + } +} + ++ (nonnull instancetype)sharedDownloader { + static dispatch_once_t once; + static id instance; + dispatch_once(&once, ^{ + instance = [self new]; + }); + return instance; +} + +- (nonnull instancetype)init { + return [self initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +} + +- (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration { + if ((self = [super init])) { + _operationClass = [SDWebImageDownloaderOperation class]; + _shouldDecompressImages = YES; + _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; + _downloadQueue = [NSOperationQueue new]; + _downloadQueue.maxConcurrentOperationCount = 6; + _downloadQueue.name = @"com.hackemist.SDWebImageDownloader"; + _URLOperations = [NSMutableDictionary new]; + SDHTTPHeadersMutableDictionary *headerDictionary = [SDHTTPHeadersMutableDictionary dictionary]; + NSString *userAgent = nil; +#if SD_UIKIT + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]]; +#elif SD_WATCH + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; watchOS %@; Scale/%0.2f)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[WKInterfaceDevice currentDevice] model], [[WKInterfaceDevice currentDevice] systemVersion], [[WKInterfaceDevice currentDevice] screenScale]]; +#elif SD_MAC + userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; +#endif + if (userAgent) { + if (![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) { + NSMutableString *mutableUserAgent = [userAgent mutableCopy]; + if (CFStringTransform((__bridge CFMutableStringRef)(mutableUserAgent), NULL, (__bridge CFStringRef)@"Any-Latin; Latin-ASCII; [:^ASCII:] Remove", false)) { + userAgent = mutableUserAgent; + } + } + headerDictionary[@"User-Agent"] = userAgent; + } +#ifdef SD_WEBP + headerDictionary[@"Accept"] = @"image/webp,image/*;q=0.8"; +#else + headerDictionary[@"Accept"] = @"image/*;q=0.8"; +#endif + _HTTPHeaders = headerDictionary; + _operationsLock = dispatch_semaphore_create(1); + _headersLock = dispatch_semaphore_create(1); + _downloadTimeout = 15.0; + + [self createNewSessionWithConfiguration:sessionConfiguration]; + } + return self; +} + +- (void)createNewSessionWithConfiguration:(NSURLSessionConfiguration *)sessionConfiguration { + [self cancelAllDownloads]; + + if (self.session) { + [self.session invalidateAndCancel]; + } + + sessionConfiguration.timeoutIntervalForRequest = self.downloadTimeout; + + /** + * Create the session for this task + * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate + * method calls and completion handler calls. + */ + self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration + delegate:self + delegateQueue:nil]; +} + +- (void)invalidateSessionAndCancel:(BOOL)cancelPendingOperations { + if (self == [SDWebImageDownloader sharedDownloader]) { + return; + } + if (cancelPendingOperations) { + [self.session invalidateAndCancel]; + } else { + [self.session finishTasksAndInvalidate]; + } +} + +- (void)dealloc { + [self.session invalidateAndCancel]; + self.session = nil; + + [self.downloadQueue cancelAllOperations]; +} + +- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field { + LOCK(self.headersLock); + if (value) { + self.HTTPHeaders[field] = value; + } else { + [self.HTTPHeaders removeObjectForKey:field]; + } + UNLOCK(self.headersLock); +} + +- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field { + if (!field) { + return nil; + } + return [[self allHTTPHeaderFields] objectForKey:field]; +} + +- (nonnull SDHTTPHeadersDictionary *)allHTTPHeaderFields { + LOCK(self.headersLock); + SDHTTPHeadersDictionary *allHTTPHeaderFields = [self.HTTPHeaders copy]; + UNLOCK(self.headersLock); + return allHTTPHeaderFields; +} + +- (void)setMaxConcurrentDownloads:(NSInteger)maxConcurrentDownloads { + _downloadQueue.maxConcurrentOperationCount = maxConcurrentDownloads; +} + +- (NSUInteger)currentDownloadCount { + return _downloadQueue.operationCount; +} + +- (NSInteger)maxConcurrentDownloads { + return _downloadQueue.maxConcurrentOperationCount; +} + +- (NSURLSessionConfiguration *)sessionConfiguration { + return self.session.configuration; +} + +- (void)setOperationClass:(nullable Class)operationClass { + if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperationInterface)]) { + _operationClass = operationClass; + } else { + _operationClass = [SDWebImageDownloaderOperation class]; + } +} + +- (NSOperation *)createDownloaderOperationWithUrl:(nullable NSURL *)url + options:(SDWebImageDownloaderOptions)options { + NSTimeInterval timeoutInterval = self.downloadTimeout; + if (timeoutInterval == 0.0) { + timeoutInterval = 15.0; + } + + // In order to prevent from potential duplicate caching (NSURLCache + SDImageCache) we disable the cache for image requests if told otherwise + NSURLRequestCachePolicy cachePolicy = options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData; + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url + cachePolicy:cachePolicy + timeoutInterval:timeoutInterval]; + + request.HTTPShouldHandleCookies = (options & SDWebImageDownloaderHandleCookies); + request.HTTPShouldUsePipelining = YES; + if (self.headersFilter) { + request.allHTTPHeaderFields = self.headersFilter(url, [self allHTTPHeaderFields]); + } + else { + request.allHTTPHeaderFields = [self allHTTPHeaderFields]; + } + NSOperation *operation = [[self.operationClass alloc] initWithRequest:request inSession:self.session options:options]; + operation.shouldDecompressImages = self.shouldDecompressImages; + + if (self.urlCredential) { + operation.credential = self.urlCredential; + } else if (self.username && self.password) { + operation.credential = [NSURLCredential credentialWithUser:self.username password:self.password persistence:NSURLCredentialPersistenceForSession]; + } + + if (options & SDWebImageDownloaderHighPriority) { + operation.queuePriority = NSOperationQueuePriorityHigh; + } else if (options & SDWebImageDownloaderLowPriority) { + operation.queuePriority = NSOperationQueuePriorityLow; + } + + if (self.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { + // Emulate LIFO execution order by systematically adding new operations as last operation's dependency + [self.lastAddedOperation addDependency:operation]; + self.lastAddedOperation = operation; + } + + return operation; +} + +- (void)cancel:(nullable SDWebImageDownloadToken *)token { + NSURL *url = token.url; + if (!url) { + return; + } + LOCK(self.operationsLock); + NSOperation *operation = [self.URLOperations objectForKey:url]; + if (operation) { + BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; + if (canceled) { + [self.URLOperations removeObjectForKey:url]; + } + } + UNLOCK(self.operationsLock); +} + +- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { + // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. + if (url == nil) { + if (completedBlock != nil) { + completedBlock(nil, nil, nil, NO); + } + return nil; + } + + LOCK(self.operationsLock); + NSOperation *operation = [self.URLOperations objectForKey:url]; + // There is a case that the operation may be marked as finished or cancelled, but not been removed from `self.URLOperations`. + if (!operation || operation.isFinished || operation.isCancelled) { + operation = [self createDownloaderOperationWithUrl:url options:options]; + __weak typeof(self) wself = self; + operation.completionBlock = ^{ + __strong typeof(wself) sself = wself; + if (!sself) { + return; + } + LOCK(sself.operationsLock); + [sself.URLOperations removeObjectForKey:url]; + UNLOCK(sself.operationsLock); + }; + [self.URLOperations setObject:operation forKey:url]; + // Add operation to operation queue only after all configuration done according to Apple's doc. + // `addOperation:` does not synchronously execute the `operation.completionBlock` so this will not cause deadlock. + [self.downloadQueue addOperation:operation]; + } + else if (!operation.isExecuting) { + if (options & SDWebImageDownloaderHighPriority) { + operation.queuePriority = NSOperationQueuePriorityHigh; + } else if (options & SDWebImageDownloaderLowPriority) { + operation.queuePriority = NSOperationQueuePriorityLow; + } else { + operation.queuePriority = NSOperationQueuePriorityNormal; + } + } + UNLOCK(self.operationsLock); + + id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; + + SDWebImageDownloadToken *token = [SDWebImageDownloadToken new]; + token.downloadOperation = operation; + token.url = url; + token.downloadOperationCancelToken = downloadOperationCancelToken; + + return token; +} + +- (void)setSuspended:(BOOL)suspended { + self.downloadQueue.suspended = suspended; +} + +- (void)cancelAllDownloads { + [self.downloadQueue cancelAllOperations]; +} + +#pragma mark Helper methods + +- (NSOperation *)operationWithTask:(NSURLSessionTask *)task { + NSOperation *returnOperation = nil; + for (NSOperation *operation in self.downloadQueue.operations) { + if ([operation respondsToSelector:@selector(dataTask)]) { + if (operation.dataTask.taskIdentifier == task.taskIdentifier) { + returnOperation = operation; + break; + } + } + } + return returnOperation; +} + +#pragma mark NSURLSessionDataDelegate + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + NSOperation *dataOperation = [self operationWithTask:dataTask]; + if ([dataOperation respondsToSelector:@selector(URLSession:dataTask:didReceiveResponse:completionHandler:)]) { + [dataOperation URLSession:session dataTask:dataTask didReceiveResponse:response completionHandler:completionHandler]; + } else { + if (completionHandler) { + completionHandler(NSURLSessionResponseAllow); + } + } +} + +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { + + // Identify the operation that runs this task and pass it the delegate method + NSOperation *dataOperation = [self operationWithTask:dataTask]; + if ([dataOperation respondsToSelector:@selector(URLSession:dataTask:didReceiveData:)]) { + [dataOperation URLSession:session dataTask:dataTask didReceiveData:data]; + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + NSOperation *dataOperation = [self operationWithTask:dataTask]; + if ([dataOperation respondsToSelector:@selector(URLSession:dataTask:willCacheResponse:completionHandler:)]) { + [dataOperation URLSession:session dataTask:dataTask willCacheResponse:proposedResponse completionHandler:completionHandler]; + } else { + if (completionHandler) { + completionHandler(proposedResponse); + } + } +} + +#pragma mark NSURLSessionTaskDelegate + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { + + // Identify the operation that runs this task and pass it the delegate method + NSOperation *dataOperation = [self operationWithTask:task]; + if ([dataOperation respondsToSelector:@selector(URLSession:task:didCompleteWithError:)]) { + [dataOperation URLSession:session task:task didCompleteWithError:error]; + } +} + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + NSOperation *dataOperation = [self operationWithTask:task]; + if ([dataOperation respondsToSelector:@selector(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)]) { + [dataOperation URLSession:session task:task willPerformHTTPRedirection:response newRequest:request completionHandler:completionHandler]; + } else { + if (completionHandler) { + completionHandler(request); + } + } +} + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + NSOperation *dataOperation = [self operationWithTask:task]; + if ([dataOperation respondsToSelector:@selector(URLSession:task:didReceiveChallenge:completionHandler:)]) { + [dataOperation URLSession:session task:task didReceiveChallenge:challenge completionHandler:completionHandler]; + } else { + if (completionHandler) { + completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); + } + } +} + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h similarity index 82% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h index b190855..6d9d95c 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h @@ -10,18 +10,19 @@ #import "SDWebImageDownloader.h" #import "SDWebImageOperation.h" -extern NSString * _Nonnull const SDWebImageDownloadStartNotification; -extern NSString * _Nonnull const SDWebImageDownloadReceiveResponseNotification; -extern NSString * _Nonnull const SDWebImageDownloadStopNotification; -extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStartNotification; +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadReceiveResponseNotification; +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStopNotification; +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadFinishNotification; /** Describes a downloader operation. If one wants to use a custom downloader op, it needs to inherit from `NSOperation` and conform to this protocol + For the description about these methods, see `SDWebImageDownloaderOperation` */ -@protocol SDWebImageDownloaderOperationInterface - +@protocol SDWebImageDownloaderOperationInterface +@required - (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request inSession:(nullable NSURLSession *)session options:(SDWebImageDownloaderOptions)options; @@ -35,10 +36,15 @@ extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; - (nullable NSURLCredential *)credential; - (void)setCredential:(nullable NSURLCredential *)value; +- (BOOL)cancel:(nullable id)token; + +@optional +- (nullable NSURLSessionTask *)dataTask; + @end -@interface SDWebImageDownloaderOperation : NSOperation +@interface SDWebImageDownloaderOperation : NSOperation /** * The request used by the operation's task. @@ -60,7 +66,7 @@ extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; @property (nonatomic, assign) BOOL shouldUseCredentialStorage __deprecated_msg("Property deprecated. Does nothing. Kept only for backwards compatibility"); /** - * The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. + * The credential used for authentication challenges in `-URLSession:task:didReceiveChallenge:completionHandler:`. * * This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. */ @@ -77,7 +83,7 @@ extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; @property (assign, nonatomic) NSInteger expectedSize; /** - * The response returned by the operation's connection. + * The response returned by the operation's task. */ @property (strong, nonatomic, nullable) NSURLResponse *response; diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m similarity index 50% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m index 63df1af..c10ba8d 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m @@ -7,11 +7,20 @@ */ #import "SDWebImageDownloaderOperation.h" -#import "SDWebImageDecoder.h" -#import "UIImage+MultiFormat.h" -#import #import "SDWebImageManager.h" #import "NSImage+WebCache.h" +#import "SDWebImageCodersManager.h" +#import "UIImage+MultiFormat.h" + +#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); +#define UNLOCK(lock) dispatch_semaphore_signal(lock); + +// iOS 8 Foundation.framework extern these symbol but the define is in CFNetwork.framework. We just fix this without import CFNetwork.framework +#if (__IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0) +const float NSURLSessionTaskPriorityHigh = 0.75; +const float NSURLSessionTaskPriorityDefault = 0.5; +const float NSURLSessionTaskPriorityLow = 0.25; +#endif NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; NSString *const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDownloadReceiveResponseNotification"; @@ -30,6 +39,7 @@ @interface SDWebImageDownloaderOperation () @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; @property (strong, nonatomic, nullable) NSMutableData *imageData; +@property (copy, nonatomic, nullable) NSData *cachedData; // for `SDWebImageDownloaderIgnoreCachedResponse` // This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run // the task associated with this operation @@ -39,21 +49,18 @@ @interface SDWebImageDownloaderOperation () @property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask; -@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; +@property (strong, nonatomic, nonnull) dispatch_semaphore_t callbacksLock; // a lock to keep the access to `callbackBlocks` thread-safe +@property (strong, nonatomic, nonnull) dispatch_queue_t coderQueue; // the queue to do image decoding #if SD_UIKIT @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; #endif +@property (strong, nonatomic, nullable) id progressiveCoder; + @end -@implementation SDWebImageDownloaderOperation { - size_t width, height; -#if SD_UIKIT || SD_WATCH - UIImageOrientation orientation; -#endif - BOOL responseFromCached; -} +@implementation SDWebImageDownloaderOperation @synthesize executing = _executing; @synthesize finished = _finished; @@ -74,45 +81,43 @@ - (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request _finished = NO; _expectedSize = 0; _unownedSession = session; - responseFromCached = YES; // Initially wrong until `- URLSession:dataTask:willCacheResponse:completionHandler: is called or not called - _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderOperationBarrierQueue", DISPATCH_QUEUE_CONCURRENT); + _callbacksLock = dispatch_semaphore_create(1); + _coderQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderOperationCoderQueue", DISPATCH_QUEUE_SERIAL); +#if SD_UIKIT + _backgroundTaskId = UIBackgroundTaskInvalid; +#endif } return self; } -- (void)dealloc { - SDDispatchQueueRelease(_barrierQueue); -} - - (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { SDCallbacksDictionary *callbacks = [NSMutableDictionary new]; if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; - dispatch_barrier_async(self.barrierQueue, ^{ - [self.callbackBlocks addObject:callbacks]; - }); + LOCK(self.callbacksLock); + [self.callbackBlocks addObject:callbacks]; + UNLOCK(self.callbacksLock); return callbacks; } - (nullable NSArray *)callbacksForKey:(NSString *)key { - __block NSMutableArray *callbacks = nil; - dispatch_sync(self.barrierQueue, ^{ - // We need to remove [NSNull null] because there might not always be a progress block for each callback - callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; - [callbacks removeObjectIdenticalTo:[NSNull null]]; - }); - return [callbacks copy]; // strip mutability here + LOCK(self.callbacksLock); + NSMutableArray *callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; + UNLOCK(self.callbacksLock); + // We need to remove [NSNull null] because there might not always be a progress block for each callback + [callbacks removeObjectIdenticalTo:[NSNull null]]; + return [callbacks copy]; // strip mutability here } - (BOOL)cancel:(nullable id)token { - __block BOOL shouldCancel = NO; - dispatch_barrier_sync(self.barrierQueue, ^{ - [self.callbackBlocks removeObjectIdenticalTo:token]; - if (self.callbackBlocks.count == 0) { - shouldCancel = YES; - } - }); + BOOL shouldCancel = NO; + LOCK(self.callbacksLock); + [self.callbackBlocks removeObjectIdenticalTo:token]; + if (self.callbackBlocks.count == 0) { + shouldCancel = YES; + } + UNLOCK(self.callbacksLock); if (shouldCancel) { [self cancel]; } @@ -134,19 +139,12 @@ - (void)start { __weak __typeof__ (self) wself = self; UIApplication * app = [UIApplicationClass performSelector:@selector(sharedApplication)]; self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{ - __strong __typeof (wself) sself = wself; - - if (sself) { - [sself cancel]; - - [app endBackgroundTask:sself.backgroundTaskId]; - sself.backgroundTaskId = UIBackgroundTaskInvalid; - } + [wself cancel]; }]; } #endif NSURLSession *session = self.unownedSession; - if (!self.unownedSession) { + if (!session) { NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; sessionConfig.timeoutIntervalForRequest = 15; @@ -155,40 +153,55 @@ - (void)start { * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate * method calls and completion handler calls. */ - self.ownedSession = [NSURLSession sessionWithConfiguration:sessionConfig - delegate:self - delegateQueue:nil]; - session = self.ownedSession; + session = [NSURLSession sessionWithConfiguration:sessionConfig + delegate:self + delegateQueue:nil]; + self.ownedSession = session; + } + + if (self.options & SDWebImageDownloaderIgnoreCachedResponse) { + // Grab the cached data for later check + NSURLCache *URLCache = session.configuration.URLCache; + if (!URLCache) { + URLCache = [NSURLCache sharedURLCache]; + } + NSCachedURLResponse *cachedResponse; + // NSURLCache's `cachedResponseForRequest:` is not thread-safe, see https://developer.apple.com/documentation/foundation/nsurlcache#2317483 + @synchronized (URLCache) { + cachedResponse = [URLCache cachedResponseForRequest:self.request]; + } + if (cachedResponse) { + self.cachedData = cachedResponse.data; + } } self.dataTask = [session dataTaskWithRequest:self.request]; self.executing = YES; } - - [self.dataTask resume]; if (self.dataTask) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + if ([self.dataTask respondsToSelector:@selector(setPriority:)]) { + if (self.options & SDWebImageDownloaderHighPriority) { + self.dataTask.priority = NSURLSessionTaskPriorityHigh; + } else if (self.options & SDWebImageDownloaderLowPriority) { + self.dataTask.priority = NSURLSessionTaskPriorityLow; + } + } +#pragma clang diagnostic pop + [self.dataTask resume]; for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { progressBlock(0, NSURLResponseUnknownLength, self.request.URL); } + __block typeof(self) strongSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:strongSelf]; }); } else { - [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}]]; - } - -#if SD_UIKIT - Class UIApplicationClass = NSClassFromString(@"UIApplication"); - if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { - return; - } - if (self.backgroundTaskId != UIBackgroundTaskInvalid) { - UIApplication * app = [UIApplication performSelector:@selector(sharedApplication)]; - [app endBackgroundTask:self.backgroundTaskId]; - self.backgroundTaskId = UIBackgroundTaskInvalid; + [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorUnknown userInfo:@{NSLocalizedDescriptionKey : @"Task can't be initialized"}]]; + [self done]; } -#endif } - (void)cancel { @@ -203,11 +216,12 @@ - (void)cancelInternal { if (self.dataTask) { [self.dataTask cancel]; + __block typeof(self) strongSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:strongSelf]; }); - // As we cancelled the connection, its callback won't be called and thus won't + // As we cancelled the task, its callback won't be called and thus won't // maintain the isFinished and isExecuting flags. if (self.isExecuting) self.executing = NO; if (!self.isFinished) self.finished = YES; @@ -223,14 +237,26 @@ - (void)done { } - (void)reset { - dispatch_barrier_async(self.barrierQueue, ^{ - [self.callbackBlocks removeAllObjects]; - }); - self.dataTask = nil; - self.imageData = nil; - if (self.ownedSession) { - [self.ownedSession invalidateAndCancel]; - self.ownedSession = nil; + LOCK(self.callbacksLock); + [self.callbackBlocks removeAllObjects]; + UNLOCK(self.callbacksLock); + + @synchronized (self) { + self.dataTask = nil; + + if (self.ownedSession) { + [self.ownedSession invalidateAndCancel]; + self.ownedSession = nil; + } + +#if SD_UIKIT + if (self.backgroundTaskId != UIBackgroundTaskInvalid) { + // If backgroundTaskId != UIBackgroundTaskInvalid, sharedApplication is always exist + UIApplication * app = [UIApplication performSelector:@selector(sharedApplication)]; + [app endBackgroundTask:self.backgroundTaskId]; + self.backgroundTaskId = UIBackgroundTaskInvalid; + } +#endif } } @@ -256,125 +282,79 @@ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { + NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow; + NSInteger expected = (NSInteger)response.expectedContentLength; + expected = expected > 0 ? expected : 0; + self.expectedSize = expected; + self.response = response; + NSInteger statusCode = [response respondsToSelector:@selector(statusCode)] ? ((NSHTTPURLResponse *)response).statusCode : 200; + BOOL valid = statusCode < 400; + //'304 Not Modified' is an exceptional one. It should be treated as cancelled if no cache data + //URLSession current behavior will return 200 status code when the server respond 304 and URLCache hit. But this is not a standard behavior and we just add a check + if (statusCode == 304 && !self.cachedData) { + valid = NO; + } - //'304 Not Modified' is an exceptional one - if (![response respondsToSelector:@selector(statusCode)] || (((NSHTTPURLResponse *)response).statusCode < 400 && ((NSHTTPURLResponse *)response).statusCode != 304)) { - NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; - self.expectedSize = expected; + if (valid) { for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { progressBlock(0, expected, self.request.URL); } - - self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; - self.response = response; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:self]; - }); - } - else { - NSUInteger code = ((NSHTTPURLResponse *)response).statusCode; - - //This is the case when server returns '304 Not Modified'. It means that remote image is not changed. - //In case of 304 we need just cancel the operation and return cached image from the cache. - if (code == 304) { - [self cancelInternal]; - } else { - [self.dataTask cancel]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; - }); - - [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:((NSHTTPURLResponse *)response).statusCode userInfo:nil]]; - - [self done]; + } else { + // Status code invalid and marked as cancelled. Do not call `[self.dataTask cancel]` which may mass up URLSession life cycle + disposition = NSURLSessionResponseCancel; } + __block typeof(self) strongSelf = self; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:strongSelf]; + }); if (completionHandler) { - completionHandler(NSURLSessionResponseAllow); + completionHandler(disposition); } } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { + if (!self.imageData) { + self.imageData = [[NSMutableData alloc] initWithCapacity:self.expectedSize]; + } [self.imageData appendData:data]; if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0) { - // The following code is from http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ - // Thanks to the author @Nyx0uf - + // Get the image data + __block NSData *imageData = [self.imageData copy]; // Get the total bytes downloaded - const NSInteger totalSize = self.imageData.length; - - // Update the data source, we must pass ALL the data, not just the new bytes - CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)self.imageData, NULL); - - if (width + height == 0) { - CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); - if (properties) { - NSInteger orientationValue = -1; - CFTypeRef val = CFDictionaryGetValue(properties, kCGImagePropertyPixelHeight); - if (val) CFNumberGetValue(val, kCFNumberLongType, &height); - val = CFDictionaryGetValue(properties, kCGImagePropertyPixelWidth); - if (val) CFNumberGetValue(val, kCFNumberLongType, &width); - val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); - if (val) CFNumberGetValue(val, kCFNumberNSIntegerType, &orientationValue); - CFRelease(properties); - - // When we draw to Core Graphics, we lose orientation information, - // which means the image below born of initWithCGIImage will be - // oriented incorrectly sometimes. (Unlike the image born of initWithData - // in didCompleteWithError.) So save it here and pass it on later. -#if SD_UIKIT || SD_WATCH - orientation = [[self class] orientationFromPropertyValue:(orientationValue == -1 ? 1 : orientationValue)]; -#endif - } - } - - if (width + height > 0 && totalSize < self.expectedSize) { - // Create the image - CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); - -#if SD_UIKIT || SD_WATCH - // Workaround for iOS anamorphic image - if (partialImageRef) { - const size_t partialHeight = CGImageGetHeight(partialImageRef); - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8, width * 4, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); - CGColorSpaceRelease(colorSpace); - if (bmContext) { - CGContextDrawImage(bmContext, (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = width, .size.height = partialHeight}, partialImageRef); - CGImageRelease(partialImageRef); - partialImageRef = CGBitmapContextCreateImage(bmContext); - CGContextRelease(bmContext); - } - else { - CGImageRelease(partialImageRef); - partialImageRef = nil; + const NSInteger totalSize = imageData.length; + // Get the finish status + BOOL finished = (totalSize >= self.expectedSize); + + if (!self.progressiveCoder) { + // We need to create a new instance for progressive decoding to avoid conflicts + for (idcoder in [SDWebImageCodersManager sharedInstance].coders) { + if ([coder conformsToProtocol:@protocol(SDWebImageProgressiveCoder)] && + [((id)coder) canIncrementallyDecodeFromData:imageData]) { + self.progressiveCoder = [[[coder class] alloc] init]; + break; } } -#endif - - if (partialImageRef) { -#if SD_UIKIT || SD_WATCH - UIImage *image = [UIImage imageWithCGImage:partialImageRef scale:1 orientation:orientation]; -#elif SD_MAC - UIImage *image = [[UIImage alloc] initWithCGImage:partialImageRef size:NSZeroSize]; -#endif - NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; - UIImage *scaledImage = [self scaledImageForKey:key image:image]; - if (self.shouldDecompressImages) { - image = [UIImage decodedImageWithImage:scaledImage]; - } - else { - image = scaledImage; + } + + // progressive decode the image in coder queue + dispatch_async(self.coderQueue, ^{ + @autoreleasepool { + UIImage *image = [self.progressiveCoder incrementallyDecodedImageWithData:imageData finished:finished]; + if (image) { + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; + image = [self scaledImageForKey:key image:image]; + if (self.shouldDecompressImages) { + image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}]; + } + + // We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding. + + [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO]; } - CGImageRelease(partialImageRef); - - [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO]; } - } - - CFRelease(imageSource); + }); } for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { @@ -386,11 +366,10 @@ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask willCacheResponse:(NSCachedURLResponse *)proposedResponse completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { - - responseFromCached = NO; // If this method is called, it means the response wasn't read from cache + NSCachedURLResponse *cachedResponse = proposedResponse; - if (self.request.cachePolicy == NSURLRequestReloadIgnoringLocalCacheData) { + if (!(self.options & SDWebImageDownloaderUseNSURLCache)) { // Prevents caching of responses cachedResponse = nil; } @@ -404,56 +383,69 @@ - (void)URLSession:(NSURLSession *)session - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { @synchronized(self) { self.dataTask = nil; + __block typeof(self) strongSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:strongSelf]; if (!error) { - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:strongSelf]; } }); } + // make sure to call `[self done]` to mark operation as finished if (error) { [self callCompletionBlocksWithError:error]; + [self done]; } else { if ([self callbacksForKey:kCompletedCallbackKey].count > 0) { /** - * See #1608 and #1623 - apparently, there is a race condition on `NSURLCache` that causes a crash - * Limited the calls to `cachedResponseForRequest:` only for cases where we should ignore the cached response - * and images for which responseFromCached is YES (only the ones that cannot be cached). - * Note: responseFromCached is set to NO inside `willCacheResponse:`. This method doesn't get called for large images or images behind authentication + * If you specified to use `NSURLCache`, then the response you get here is what you need. */ - if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached && [[NSURLCache sharedURLCache] cachedResponseForRequest:self.request]) { - // hack - [self callCompletionBlocksWithImage:nil imageData:nil error:nil finished:YES]; - } else if (self.imageData) { - UIImage *image = [UIImage sd_imageWithData:self.imageData]; - NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; - image = [self scaledImageForKey:key image:image]; - - // Do not force decoding animated GIFs - if (!image.images) { - if (self.shouldDecompressImages) { - if (self.options & SDWebImageDownloaderScaleDownLargeImages) { -#if SD_UIKIT || SD_WATCH - image = [UIImage decodedAndScaledDownImageWithImage:image]; - [self.imageData setData:UIImagePNGRepresentation(image)]; -#endif - } else { - image = [UIImage decodedImageWithImage:image]; - } - } - } - if (CGSizeEqualToSize(image.size, CGSizeZero)) { - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]]; + __block NSData *imageData = [self.imageData copy]; + self.imageData = nil; + if (imageData) { + /** if you specified to only use cached data via `SDWebImageDownloaderIgnoreCachedResponse`, + * then we should check if the cached data is equal to image data + */ + if (self.options & SDWebImageDownloaderIgnoreCachedResponse && [self.cachedData isEqualToData:imageData]) { + // call completion block with nil + [self callCompletionBlocksWithImage:nil imageData:nil error:nil finished:YES]; + [self done]; } else { - [self callCompletionBlocksWithImage:image imageData:self.imageData error:nil finished:YES]; + // decode the image in coder queue + dispatch_async(self.coderQueue, ^{ + @autoreleasepool { + UIImage *image = [[SDWebImageCodersManager sharedInstance] decodedImageWithData:imageData]; + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; + image = [self scaledImageForKey:key image:image]; + + // Do not force decoding animated images or GIF, + // because there has imageCoder which can change `image` or `imageData` to static image, lose the animated feature totally. + BOOL shouldDecode = !image.images && image.sd_imageFormat != SDImageFormatGIF; + if (shouldDecode) { + if (self.shouldDecompressImages) { + BOOL shouldScaleDown = self.options & SDWebImageDownloaderScaleDownLargeImages; + image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(shouldScaleDown)}]; + } + } + CGSize imageSize = image.size; + if (imageSize.width == 0 || imageSize.height == 0) { + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]]; + } else { + [self callCompletionBlocksWithImage:image imageData:imageData error:nil finished:YES]; + } + [self done]; + } + }); } } else { [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]]; + [self done]; } + } else { + [self done]; } } - [self done]; } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { @@ -487,32 +479,6 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didRece } #pragma mark Helper methods - -#if SD_UIKIT || SD_WATCH -+ (UIImageOrientation)orientationFromPropertyValue:(NSInteger)value { - switch (value) { - case 1: - return UIImageOrientationUp; - case 3: - return UIImageOrientationDown; - case 8: - return UIImageOrientationLeft; - case 6: - return UIImageOrientationRight; - case 2: - return UIImageOrientationUpMirrored; - case 4: - return UIImageOrientationDownMirrored; - case 5: - return UIImageOrientationLeftMirrored; - case 7: - return UIImageOrientationRightMirrored; - default: - return UIImageOrientationUp; - } -} -#endif - - (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { return SDScaledImageForKey(key, image); } diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h new file mode 100644 index 0000000..c3a0f71 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h @@ -0,0 +1,34 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" + +@interface SDWebImageFrame : NSObject + +// This class is used for creating animated images via `animatedImageWithFrames` in `SDWebImageCoderHelper`. Attention if you need to specify animated images loop count, use `sd_imageLoopCount` property in `UIImage+MultiFormat`. + +/** + The image of current frame. You should not set an animated image. + */ +@property (nonatomic, strong, readonly, nonnull) UIImage *image; +/** + The duration of current frame to be displayed. The number is seconds but not milliseconds. You should not set this to zero. + */ +@property (nonatomic, readonly, assign) NSTimeInterval duration; + +/** + Create a frame instance with specify image and duration + + @param image current frame's image + @param duration current frame's duration + @return frame instance + */ ++ (instancetype _Nonnull)frameWithImage:(UIImage * _Nonnull)image duration:(NSTimeInterval)duration; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m new file mode 100644 index 0000000..b0aefe5 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m @@ -0,0 +1,28 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageFrame.h" + +@interface SDWebImageFrame () + +@property (nonatomic, strong, readwrite, nonnull) UIImage *image; +@property (nonatomic, readwrite, assign) NSTimeInterval duration; + +@end + +@implementation SDWebImageFrame + ++ (instancetype)frameWithImage:(UIImage *)image duration:(NSTimeInterval)duration { + SDWebImageFrame *frame = [[SDWebImageFrame alloc] init]; + frame.image = image; + frame.duration = duration; + + return frame; +} + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h new file mode 100644 index 0000000..30521f9 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h @@ -0,0 +1,23 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCoder.h" + +/** + Built in coder using ImageIO that supports GIF encoding/decoding + @note `SDWebImageIOCoder` supports GIF but only as static (will use the 1st frame). + @note Use `SDWebImageGIFCoder` for fully animated GIFs - less performant than `FLAnimatedImage` + @note If you decide to make all `UIImageView`(including `FLAnimatedImageView`) instance support GIF. You should add this coder to `SDWebImageCodersManager` and make sure that it has a higher priority than `SDWebImageIOCoder` + @note The recommended approach for animated GIFs is using `FLAnimatedImage`. It's more performant than `UIImageView` for GIF displaying + */ +@interface SDWebImageGIFCoder : NSObject + ++ (nonnull instancetype)sharedCoder; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m new file mode 100644 index 0000000..e43b773 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m @@ -0,0 +1,184 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageGIFCoder.h" +#import "NSImage+WebCache.h" +#import +#import "NSData+ImageContentType.h" +#import "UIImage+MultiFormat.h" +#import "SDWebImageCoderHelper.h" +#import "SDAnimatedImageRep.h" + +@implementation SDWebImageGIFCoder + ++ (instancetype)sharedCoder { + static SDWebImageGIFCoder *coder; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + coder = [[SDWebImageGIFCoder alloc] init]; + }); + return coder; +} + +#pragma mark - Decode +- (BOOL)canDecodeFromData:(nullable NSData *)data { + return ([NSData sd_imageFormatForImageData:data] == SDImageFormatGIF); +} + +- (UIImage *)decodedImageWithData:(NSData *)data { + if (!data) { + return nil; + } + +#if SD_MAC + SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:data]; + NSImage *animatedImage = [[NSImage alloc] initWithSize:imageRep.size]; + [animatedImage addRepresentation:imageRep]; + return animatedImage; +#else + + CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); + if (!source) { + return nil; + } + size_t count = CGImageSourceGetCount(source); + + UIImage *animatedImage; + + if (count <= 1) { + animatedImage = [[UIImage alloc] initWithData:data]; + } else { + NSMutableArray *frames = [NSMutableArray array]; + + for (size_t i = 0; i < count; i++) { + CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, i, NULL); + if (!imageRef) { + continue; + } + + float duration = [self sd_frameDurationAtIndex:i source:source]; + UIImage *image = [[UIImage alloc] initWithCGImage:imageRef]; + CGImageRelease(imageRef); + + SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:image duration:duration]; + [frames addObject:frame]; + } + + NSUInteger loopCount = 1; + NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(source, nil); + NSDictionary *gifProperties = [imageProperties valueForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary]; + if (gifProperties) { + NSNumber *gifLoopCount = [gifProperties valueForKey:(__bridge NSString *)kCGImagePropertyGIFLoopCount]; + if (gifLoopCount != nil) { + loopCount = gifLoopCount.unsignedIntegerValue; + } + } + + animatedImage = [SDWebImageCoderHelper animatedImageWithFrames:frames]; + animatedImage.sd_imageLoopCount = loopCount; + animatedImage.sd_imageFormat = SDImageFormatGIF; + } + + CFRelease(source); + + return animatedImage; +#endif +} + +- (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { + float frameDuration = 0.1f; + CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil); + if (!cfFrameProperties) { + return frameDuration; + } + NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties; + NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; + + NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; + if (delayTimeUnclampedProp != nil) { + frameDuration = [delayTimeUnclampedProp floatValue]; + } else { + NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; + if (delayTimeProp != nil) { + frameDuration = [delayTimeProp floatValue]; + } + } + + // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. + // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify + // a duration of <= 10 ms. See and + // for more information. + + if (frameDuration < 0.011f) { + frameDuration = 0.100f; + } + + CFRelease(cfFrameProperties); + return frameDuration; +} + +- (UIImage *)decompressedImageWithImage:(UIImage *)image + data:(NSData *__autoreleasing _Nullable *)data + options:(nullable NSDictionary*)optionsDict { + // GIF do not decompress + return image; +} + +#pragma mark - Encode +- (BOOL)canEncodeToFormat:(SDImageFormat)format { + return (format == SDImageFormatGIF); +} + +- (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format { + if (!image) { + return nil; + } + + if (format != SDImageFormatGIF) { + return nil; + } + + NSMutableData *imageData = [NSMutableData data]; + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatGIF]; + NSArray *frames = [SDWebImageCoderHelper framesFromAnimatedImage:image]; + + // Create an image destination. GIF does not support EXIF image orientation + CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, frames.count, NULL); + if (!imageDestination) { + // Handle failure. + return nil; + } + if (frames.count == 0) { + // for static single GIF images + CGImageDestinationAddImage(imageDestination, image.CGImage, nil); + } else { + // for animated GIF images + NSUInteger loopCount = image.sd_imageLoopCount; + NSDictionary *gifProperties = @{(__bridge NSString *)kCGImagePropertyGIFDictionary: @{(__bridge NSString *)kCGImagePropertyGIFLoopCount : @(loopCount)}}; + CGImageDestinationSetProperties(imageDestination, (__bridge CFDictionaryRef)gifProperties); + + for (size_t i = 0; i < frames.count; i++) { + SDWebImageFrame *frame = frames[i]; + float frameDuration = frame.duration; + CGImageRef frameImageRef = frame.image.CGImage; + NSDictionary *frameProperties = @{(__bridge NSString *)kCGImagePropertyGIFDictionary : @{(__bridge NSString *)kCGImagePropertyGIFDelayTime : @(frameDuration)}}; + CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)frameProperties); + } + } + // Finalize the destination. + if (CGImageDestinationFinalize(imageDestination) == NO) { + // Handle failure. + imageData = nil; + } + + CFRelease(imageDestination); + + return [imageData copy]; +} + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h new file mode 100644 index 0000000..04f68fb --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h @@ -0,0 +1,30 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCoder.h" + +/** + Built in coder that supports PNG, JPEG, TIFF, includes support for progressive decoding. + + GIF + Also supports static GIF (meaning will only handle the 1st frame). + For a full GIF support, we recommend `FLAnimatedImage` or our less performant `SDWebImageGIFCoder` + + HEIC + 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 + Decode(Software): !Simulator && (iOS 11 || tvOS 11 || macOS 10.13) + Decode(Hardware): !Simulator && ((iOS 11 && A9Chip) || (macOS 10.13 && 6thGenerationIntelCPU)) + Encode(Software): macOS 10.13 + Encode(Hardware): !Simulator && ((iOS 11 && A10FusionChip) || (macOS 10.13 && 6thGenerationIntelCPU)) + */ +@interface SDWebImageImageIOCoder : NSObject + ++ (nonnull instancetype)sharedCoder; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m new file mode 100644 index 0000000..8f31e97 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m @@ -0,0 +1,536 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageImageIOCoder.h" +#import "SDWebImageCoderHelper.h" +#import "NSImage+WebCache.h" +#import +#import "NSData+ImageContentType.h" +#import "UIImage+MultiFormat.h" + +#if SD_UIKIT || SD_WATCH +static const size_t kBytesPerPixel = 4; +static const size_t kBitsPerComponent = 8; + +/* + * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImages` is set + * Suggested value for iPad1 and iPhone 3GS: 60. + * Suggested value for iPad2 and iPhone 4: 120. + * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30. + */ +static const CGFloat kDestImageSizeMB = 60.0f; + +/* + * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImages` is set + * Suggested value for iPad1 and iPhone 3GS: 20. + * Suggested value for iPad2 and iPhone 4: 40. + * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10. + */ +static const CGFloat kSourceImageTileSizeMB = 20.0f; + +static const CGFloat kBytesPerMB = 1024.0f * 1024.0f; +static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel; +static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB; +static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB; + +static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet. +#endif + +@implementation SDWebImageImageIOCoder { + size_t _width, _height; +#if SD_UIKIT || SD_WATCH + UIImageOrientation _orientation; +#endif + CGImageSourceRef _imageSource; +} + +- (void)dealloc { + if (_imageSource) { + CFRelease(_imageSource); + _imageSource = NULL; + } +} + ++ (instancetype)sharedCoder { + static SDWebImageImageIOCoder *coder; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + coder = [[SDWebImageImageIOCoder alloc] init]; + }); + return coder; +} + +#pragma mark - Decode +- (BOOL)canDecodeFromData:(nullable NSData *)data { + switch ([NSData sd_imageFormatForImageData:data]) { + case SDImageFormatWebP: + // Do not support WebP decoding + return NO; + case SDImageFormatHEIC: + // Check HEIC decoding compatibility + return [[self class] canDecodeFromHEICFormat]; + case SDImageFormatHEIF: + // Check HEIF decoding compatibility + return [[self class] canDecodeFromHEIFFormat]; + default: + return YES; + } +} + +- (BOOL)canIncrementallyDecodeFromData:(NSData *)data { + switch ([NSData sd_imageFormatForImageData:data]) { + case SDImageFormatWebP: + // Do not support WebP progressive decoding + return NO; + case SDImageFormatHEIC: + // Check HEIC decoding compatibility + return [[self class] canDecodeFromHEICFormat]; + case SDImageFormatHEIF: + // Check HEIF decoding compatibility + return [[self class] canDecodeFromHEIFFormat]; + default: + return YES; + } +} + +- (UIImage *)decodedImageWithData:(NSData *)data { + if (!data) { + return nil; + } + + UIImage *image = [[UIImage alloc] initWithData:data]; + image.sd_imageFormat = [NSData sd_imageFormatForImageData:data]; + + return image; +} + +- (UIImage *)incrementallyDecodedImageWithData:(NSData *)data finished:(BOOL)finished { + if (!_imageSource) { + _imageSource = CGImageSourceCreateIncremental(NULL); + } + UIImage *image; + + // The following code is from http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ + // Thanks to the author @Nyx0uf + + // Update the data source, we must pass ALL the data, not just the new bytes + CGImageSourceUpdateData(_imageSource, (__bridge CFDataRef)data, finished); + + if (_width + _height == 0) { + CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(_imageSource, 0, NULL); + if (properties) { + NSInteger orientationValue = 1; + CFTypeRef val = CFDictionaryGetValue(properties, kCGImagePropertyPixelHeight); + if (val) CFNumberGetValue(val, kCFNumberLongType, &_height); + val = CFDictionaryGetValue(properties, kCGImagePropertyPixelWidth); + if (val) CFNumberGetValue(val, kCFNumberLongType, &_width); + val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); + if (val) CFNumberGetValue(val, kCFNumberNSIntegerType, &orientationValue); + CFRelease(properties); + + // When we draw to Core Graphics, we lose orientation information, + // which means the image below born of initWithCGIImage will be + // oriented incorrectly sometimes. (Unlike the image born of initWithData + // in didCompleteWithError.) So save it here and pass it on later. +#if SD_UIKIT || SD_WATCH + _orientation = [SDWebImageCoderHelper imageOrientationFromEXIFOrientation:orientationValue]; +#endif + } + } + + if (_width + _height > 0) { + // Create the image + CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(_imageSource, 0, NULL); + + if (partialImageRef) { +#if SD_UIKIT || SD_WATCH + image = [[UIImage alloc] initWithCGImage:partialImageRef scale:1 orientation:_orientation]; +#elif SD_MAC + image = [[UIImage alloc] initWithCGImage:partialImageRef size:NSZeroSize]; +#endif + CGImageRelease(partialImageRef); + image.sd_imageFormat = [NSData sd_imageFormatForImageData:data]; + } + } + + if (finished) { + if (_imageSource) { + CFRelease(_imageSource); + _imageSource = NULL; + } + } + + return image; +} + +- (UIImage *)decompressedImageWithImage:(UIImage *)image + data:(NSData *__autoreleasing _Nullable *)data + options:(nullable NSDictionary*)optionsDict { +#if SD_MAC + return image; +#endif +#if SD_UIKIT || SD_WATCH + BOOL shouldScaleDown = NO; + if (optionsDict != nil) { + NSNumber *scaleDownLargeImagesOption = nil; + if ([optionsDict[SDWebImageCoderScaleDownLargeImagesKey] isKindOfClass:[NSNumber class]]) { + scaleDownLargeImagesOption = (NSNumber *)optionsDict[SDWebImageCoderScaleDownLargeImagesKey]; + } + if (scaleDownLargeImagesOption != nil) { + shouldScaleDown = [scaleDownLargeImagesOption boolValue]; + } + } + if (!shouldScaleDown) { + return [self sd_decompressedImageWithImage:image]; + } else { + UIImage *scaledDownImage = [self sd_decompressedAndScaledDownImageWithImage:image]; + if (scaledDownImage && !CGSizeEqualToSize(scaledDownImage.size, image.size)) { + // if the image is scaled down, need to modify the data pointer as well + SDImageFormat format = [NSData sd_imageFormatForImageData:*data]; + NSData *imageData = [self encodedDataWithImage:scaledDownImage format:format]; + if (imageData) { + *data = imageData; + } + } + return scaledDownImage; + } +#endif +} + +#if SD_UIKIT || SD_WATCH +- (nullable UIImage *)sd_decompressedImageWithImage:(nullable UIImage *)image { + if (![[self class] shouldDecodeImage:image]) { + return image; + } + + // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. + // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; + @autoreleasepool{ + + CGImageRef imageRef = image.CGImage; + // device color space + CGColorSpaceRef colorspaceRef = SDCGColorSpaceGetDeviceRGB(); + BOOL hasAlpha = SDCGImageRefContainsAlpha(imageRef); + // iOS display alpha info (BRGA8888/BGRX8888) + CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host; + bitmapInfo |= hasAlpha ? kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst; + + size_t width = CGImageGetWidth(imageRef); + size_t height = CGImageGetHeight(imageRef); + + // kCGImageAlphaNone is not supported in CGBitmapContextCreate. + // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast + // to create bitmap graphics contexts without alpha info. + CGContextRef context = CGBitmapContextCreate(NULL, + width, + height, + kBitsPerComponent, + 0, + colorspaceRef, + bitmapInfo); + if (context == NULL) { + return image; + } + + // Draw the image into the context and retrieve the new bitmap image without alpha + CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); + CGImageRef imageRefWithoutAlpha = CGBitmapContextCreateImage(context); + UIImage *imageWithoutAlpha = [[UIImage alloc] initWithCGImage:imageRefWithoutAlpha scale:image.scale orientation:image.imageOrientation]; + CGContextRelease(context); + CGImageRelease(imageRefWithoutAlpha); + + return imageWithoutAlpha; + } +} + +- (nullable UIImage *)sd_decompressedAndScaledDownImageWithImage:(nullable UIImage *)image { + if (![[self class] shouldDecodeImage:image]) { + return image; + } + + if (![[self class] shouldScaleDownImage:image]) { + return [self sd_decompressedImageWithImage:image]; + } + + CGContextRef destContext; + + // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. + // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; + @autoreleasepool { + CGImageRef sourceImageRef = image.CGImage; + + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + CGFloat sourceTotalPixels = sourceResolution.width * sourceResolution.height; + // Determine the scale ratio to apply to the input image + // that results in an output image of the defined size. + // see kDestImageSizeMB, and how it relates to destTotalPixels. + CGFloat imageScale = sqrt(kDestTotalPixels / sourceTotalPixels); + CGSize destResolution = CGSizeZero; + destResolution.width = (int)(sourceResolution.width * imageScale); + destResolution.height = (int)(sourceResolution.height * imageScale); + + // device color space + CGColorSpaceRef colorspaceRef = SDCGColorSpaceGetDeviceRGB(); + BOOL hasAlpha = SDCGImageRefContainsAlpha(sourceImageRef); + // iOS display alpha info (BGRA8888/BGRX8888) + CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host; + bitmapInfo |= hasAlpha ? kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst; + + // kCGImageAlphaNone is not supported in CGBitmapContextCreate. + // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast + // to create bitmap graphics contexts without alpha info. + destContext = CGBitmapContextCreate(NULL, + destResolution.width, + destResolution.height, + kBitsPerComponent, + 0, + colorspaceRef, + bitmapInfo); + + if (destContext == NULL) { + return image; + } + CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh); + + // Now define the size of the rectangle to be used for the + // incremental blits from the input image to the output image. + // we use a source tile width equal to the width of the source + // image due to the way that iOS retrieves image data from disk. + // iOS must decode an image from disk in full width 'bands', even + // if current graphics context is clipped to a subrect within that + // band. Therefore we fully utilize all of the pixel data that results + // from a decoding opertion by achnoring our tile size to the full + // width of the input image. + CGRect sourceTile = CGRectZero; + sourceTile.size.width = sourceResolution.width; + // The source tile height is dynamic. Since we specified the size + // of the source tile in MB, see how many rows of pixels high it + // can be given the input image width. + sourceTile.size.height = (int)(kTileTotalPixels / sourceTile.size.width ); + sourceTile.origin.x = 0.0f; + // The output tile is the same proportions as the input tile, but + // scaled to image scale. + CGRect destTile; + destTile.size.width = destResolution.width; + destTile.size.height = sourceTile.size.height * imageScale; + destTile.origin.x = 0.0f; + // The source seem overlap is proportionate to the destination seem overlap. + // this is the amount of pixels to overlap each tile as we assemble the ouput image. + float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height); + CGImageRef sourceTileImageRef; + // calculate the number of read/write operations required to assemble the + // output image. + int iterations = (int)( sourceResolution.height / sourceTile.size.height ); + // If tile height doesn't divide the image height evenly, add another iteration + // to account for the remaining pixels. + int remainder = (int)sourceResolution.height % (int)sourceTile.size.height; + if(remainder) { + iterations++; + } + // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations. + float sourceTileHeightMinusOverlap = sourceTile.size.height; + sourceTile.size.height += sourceSeemOverlap; + destTile.size.height += kDestSeemOverlap; + for( int y = 0; y < iterations; ++y ) { + @autoreleasepool { + sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap; + destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + kDestSeemOverlap); + sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile ); + if( y == iterations - 1 && remainder ) { + float dify = destTile.size.height; + destTile.size.height = CGImageGetHeight( sourceTileImageRef ) * imageScale; + dify -= destTile.size.height; + destTile.origin.y += dify; + } + CGContextDrawImage( destContext, destTile, sourceTileImageRef ); + CGImageRelease( sourceTileImageRef ); + } + } + + CGImageRef destImageRef = CGBitmapContextCreateImage(destContext); + CGContextRelease(destContext); + if (destImageRef == NULL) { + return image; + } + UIImage *destImage = [[UIImage alloc] initWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation]; + CGImageRelease(destImageRef); + if (destImage == nil) { + return image; + } + return destImage; + } +} +#endif + +#pragma mark - Encode +- (BOOL)canEncodeToFormat:(SDImageFormat)format { + switch (format) { + case SDImageFormatWebP: + // Do not support WebP encoding + return NO; + case SDImageFormatHEIC: + // Check HEIC encoding compatibility + return [[self class] canEncodeToHEICFormat]; + case SDImageFormatHEIF: + // Check HEIF encoding compatibility + return [[self class] canEncodeToHEIFFormat]; + default: + return YES; + } +} + +- (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format { + if (!image) { + return nil; + } + + if (format == SDImageFormatUndefined) { + BOOL hasAlpha = SDCGImageRefContainsAlpha(image.CGImage); + if (hasAlpha) { + format = SDImageFormatPNG; + } else { + format = SDImageFormatJPEG; + } + } + + NSMutableData *imageData = [NSMutableData data]; + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:format]; + + // Create an image destination. + CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); + if (!imageDestination) { + // Handle failure. + return nil; + } + + NSMutableDictionary *properties = [NSMutableDictionary dictionary]; +#if SD_UIKIT || SD_WATCH + NSInteger exifOrientation = [SDWebImageCoderHelper exifOrientationFromImageOrientation:image.imageOrientation]; + [properties setValue:@(exifOrientation) forKey:(__bridge NSString *)kCGImagePropertyOrientation]; +#endif + + // Add your image to the destination. + CGImageDestinationAddImage(imageDestination, image.CGImage, (__bridge CFDictionaryRef)properties); + + // Finalize the destination. + if (CGImageDestinationFinalize(imageDestination) == NO) { + // Handle failure. + imageData = nil; + } + + CFRelease(imageDestination); + + return [imageData copy]; +} + +#pragma mark - Helper ++ (BOOL)shouldDecodeImage:(nullable UIImage *)image { + // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error + if (image == nil) { + return NO; + } + + // do not decode animated images + if (image.images != nil) { + return NO; + } + + return YES; +} + ++ (BOOL)canDecodeFromHEICFormat { + static BOOL canDecode = NO; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatHEIC]; + NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers(); + if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) { + canDecode = YES; + } + }); + return canDecode; +} + ++ (BOOL)canDecodeFromHEIFFormat { + static BOOL canDecode = NO; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatHEIF]; + NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers(); + if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) { + canDecode = YES; + } + }); + return canDecode; +} + ++ (BOOL)canEncodeToHEICFormat { + static BOOL canEncode = NO; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableData *imageData = [NSMutableData data]; + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatHEIC]; + + // Create an image destination. + CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); + if (!imageDestination) { + // Can't encode to HEIC + canEncode = NO; + } else { + // Can encode to HEIC + CFRelease(imageDestination); + canEncode = YES; + } + }); + return canEncode; +} + ++ (BOOL)canEncodeToHEIFFormat { + static BOOL canEncode = NO; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableData *imageData = [NSMutableData data]; + CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatHEIF]; + + // Create an image destination. + CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); + if (!imageDestination) { + // Can't encode to HEIF + canEncode = NO; + } else { + // Can encode to HEIF + CFRelease(imageDestination); + canEncode = YES; + } + }); + return canEncode; +} + +#if SD_UIKIT || SD_WATCH ++ (BOOL)shouldScaleDownImage:(nonnull UIImage *)image { + BOOL shouldScaleDown = YES; + + CGImageRef sourceImageRef = image.CGImage; + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + float sourceTotalPixels = sourceResolution.width * sourceResolution.height; + float imageScale = kDestTotalPixels / sourceTotalPixels; + if (imageScale < 1) { + shouldScaleDown = YES; + } else { + shouldScaleDown = NO; + } + + return shouldScaleDown; +} +#endif + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageManager.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.h similarity index 74% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageManager.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.h index ba8b755..9168021 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageManager.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.h @@ -25,7 +25,7 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { SDWebImageLowPriority = 1 << 1, /** - * This flag disables on-disk caching + * This flag disables on-disk caching after the download finished, only cache in memory */ SDWebImageCacheMemoryOnly = 1 << 2, @@ -94,14 +94,37 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { * images to a size compatible with the constrained memory of devices. * If `SDWebImageProgressiveDownload` flag is set the scale down is deactivated. */ - SDWebImageScaleDownLargeImages = 1 << 12 + SDWebImageScaleDownLargeImages = 1 << 12, + + /** + * By default, we do not query disk data when the image is cached in memory. This mask can force to query disk data at the same time. + * This flag is recommend to be used with `SDWebImageQueryDiskSync` to ensure the image is loaded in the same runloop. + */ + SDWebImageQueryDataWhenInMemory = 1 << 13, + + /** + * By default, we query the memory cache synchronously, disk cache asynchronously. This mask can force to query disk cache synchronously to ensure that image is loaded in the same runloop. + * This flag can avoid flashing during cell reuse if you disable memory cache or in some other cases. + */ + SDWebImageQueryDiskSync = 1 << 14, + + /** + * By default, when the cache missed, the image is download from the network. This flag can prevent network to load from cache only. + */ + SDWebImageFromCacheOnly = 1 << 15, + /** + * By default, when you use `SDWebImageTransition` to do some view transition after the image load finished, this transition is only applied for image download from the network. This mask can force to apply view transition for memory and disk cache as well. + */ + SDWebImageForceTransition = 1 << 16 }; typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL); typedef void(^SDInternalCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL); -typedef NSString * _Nullable (^SDWebImageCacheKeyFilterBlock)(NSURL * _Nullable url); +typedef NSString * _Nullable(^SDWebImageCacheKeyFilterBlock)(NSURL * _Nullable url); + +typedef NSData * _Nullable(^SDWebImageCacheSerializerBlock)(UIImage * _Nonnull image, NSData * _Nullable data, NSURL * _Nullable imageURL); @class SDWebImageManager; @@ -120,6 +143,16 @@ typedef NSString * _Nullable (^SDWebImageCacheKeyFilterBlock)(NSURL * _Nullable */ - (BOOL)imageManager:(nonnull SDWebImageManager *)imageManager shouldDownloadImageForURL:(nullable NSURL *)imageURL; +/** + * Controls the complicated logic to mark as failed URLs when download error occur. + * If the delegate implement this method, we will not use the built-in way to mark URL as failed based on error code; + @param imageManager The current `SDWebImageManager` + @param imageURL The url of the image + @param error The download error for the url + @return Whether to block this url or not. Return YES to mark this URL as failed. + */ +- (BOOL)imageManager:(nonnull SDWebImageManager *)imageManager shouldBlockFailedURL:(nonnull NSURL *)imageURL withError:(nonnull NSError *)error; + /** * Allows to transform the image immediately after it has been downloaded and just before to cache it on disk and memory. * NOTE: This method is called from a global queue in order to not to block the main thread. @@ -172,15 +205,35 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @code -[[SDWebImageManager sharedManager] setCacheKeyFilter:^(NSURL *url) { +SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL * _Nullable url) { url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; return [url absoluteString]; -}]; +}; * @endcode */ @property (nonatomic, copy, nullable) SDWebImageCacheKeyFilterBlock cacheKeyFilter; +/** + * The cache serializer is a block used to convert the decoded image, the source downloaded data, to the actual data used for storing to the disk cache. If you return nil, means to generate the data from the image instance, see `SDImageCache`. + * For example, if you are using WebP images and facing the slow decoding time issue when later retriving from disk cache again. You can try to encode the decoded image to JPEG/PNG format to disk cache instead of source downloaded data. + * @note The `image` arg is nonnull, but when you also provide a image transformer and the image is transformed, the `data` arg may be nil, take attention to this case. + * @note This method is called from a global queue in order to not to block the main thread. + * @code + SDWebImageManager.sharedManager.cacheSerializer = ^NSData * _Nullable(UIImage * _Nonnull image, NSData * _Nullable data, NSURL * _Nullable imageURL) { + SDImageFormat format = [NSData sd_imageFormatForImageData:data]; + switch (format) { + case SDImageFormatWebP: + return image.images ? data : nil; + default: + return data; + } + }; + * @endcode + * The default value is nil. Means we just store the source downloaded data to disk cache. + */ +@property (nonatomic, copy, nullable) SDWebImageCacheSerializerBlock cacheSerializer; + /** * Returns global SDWebImageManager instance. * diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageManager.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.m similarity index 54% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageManager.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.m index d7d6865..c912fb5 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageManager.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.m @@ -7,14 +7,18 @@ */ #import "SDWebImageManager.h" -#import #import "NSImage+WebCache.h" +#import + +#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); +#define UNLOCK(lock) dispatch_semaphore_signal(lock); @interface SDWebImageCombinedOperation : NSObject @property (assign, nonatomic, getter = isCancelled) BOOL cancelled; -@property (copy, nonatomic, nullable) SDWebImageNoParamsBlock cancelBlock; +@property (strong, nonatomic, nullable) SDWebImageDownloadToken *downloadToken; @property (strong, nonatomic, nullable) NSOperation *cacheOperation; +@property (weak, nonatomic, nullable) SDWebImageManager *manager; @end @@ -23,7 +27,9 @@ @interface SDWebImageManager () @property (strong, nonatomic, readwrite, nonnull) SDImageCache *imageCache; @property (strong, nonatomic, readwrite, nonnull) SDWebImageDownloader *imageDownloader; @property (strong, nonatomic, nonnull) NSMutableSet *failedURLs; -@property (strong, nonatomic, nonnull) NSMutableArray *runningOperations; +@property (strong, nonatomic, nonnull) dispatch_semaphore_t failedURLsLock; // a lock to keep the access to `failedURLs` thread-safe +@property (strong, nonatomic, nonnull) NSMutableSet *runningOperations; +@property (strong, nonatomic, nonnull) dispatch_semaphore_t runningOperationsLock; // a lock to keep the access to `runningOperations` thread-safe @end @@ -49,7 +55,9 @@ - (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:( _imageCache = cache; _imageDownloader = downloader; _failedURLs = [NSMutableSet new]; - _runningOperations = [NSMutableArray new]; + _failedURLsLock = dispatch_semaphore_create(1); + _runningOperations = [NSMutableSet new]; + _runningOperationsLock = dispatch_semaphore_create(1); } return self; } @@ -66,6 +74,10 @@ - (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url { } } +- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { + return SDScaledImageForKey(key, image); +} + - (void)cachedImageExistsForURL:(nullable NSURL *)url completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { NSString *key = [self cacheKeyForURL:url]; @@ -120,14 +132,14 @@ - (void)diskImageExistsForURL:(nullable NSURL *)url url = nil; } - __block SDWebImageCombinedOperation *operation = [SDWebImageCombinedOperation new]; - __weak SDWebImageCombinedOperation *weakOperation = operation; + SDWebImageCombinedOperation *operation = [SDWebImageCombinedOperation new]; + operation.manager = self; BOOL isFailedUrl = NO; if (url) { - @synchronized (self.failedURLs) { - isFailedUrl = [self.failedURLs containsObject:url]; - } + LOCK(self.failedURLsLock); + isFailedUrl = [self.failedURLs containsObject:url]; + UNLOCK(self.failedURLsLock); } if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { @@ -135,22 +147,33 @@ - (void)diskImageExistsForURL:(nullable NSURL *)url return operation; } - @synchronized (self.runningOperations) { - [self.runningOperations addObject:operation]; - } + LOCK(self.runningOperationsLock); + [self.runningOperations addObject:operation]; + UNLOCK(self.runningOperationsLock); NSString *key = [self cacheKeyForURL:url]; - - operation.cacheOperation = [self.imageCache queryCacheOperationForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { - if (operation.isCancelled) { - [self safelyRemoveOperationFromRunning:operation]; + + SDImageCacheOptions cacheOptions = 0; + if (options & SDWebImageQueryDataWhenInMemory) cacheOptions |= SDImageCacheQueryDataWhenInMemory; + if (options & SDWebImageQueryDiskSync) cacheOptions |= SDImageCacheQueryDiskSync; + if (options & SDWebImageScaleDownLargeImages) cacheOptions |= SDImageCacheScaleDownLargeImages; + + __weak SDWebImageCombinedOperation *weakOperation = operation; + operation.cacheOperation = [self.imageCache queryCacheOperationForKey:key options:cacheOptions done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { + __strong __typeof(weakOperation) strongOperation = weakOperation; + if (!strongOperation || strongOperation.isCancelled) { + [self safelyRemoveOperationFromRunning:strongOperation]; return; } - - if ((!cachedImage || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { + + // Check whether we should download image from network + BOOL shouldDownload = (!(options & SDWebImageFromCacheOnly)) + && (!cachedImage || options & SDWebImageRefreshCached) + && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url]); + if (shouldDownload) { if (cachedImage && options & SDWebImageRefreshCached) { // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. - [self callCompletionBlockForOperation:weakOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; } // download if no image or requested to refresh anyway, and download allowed by delegate @@ -171,76 +194,101 @@ - (void)diskImageExistsForURL:(nullable NSURL *)url downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } - SDWebImageDownloadToken *subOperationToken = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (!strongOperation || strongOperation.isCancelled) { + // `SDWebImageCombinedOperation` -> `SDWebImageDownloadToken` -> `downloadOperationCancelToken`, which is a `SDCallbacksDictionary` and retain the completed block below, so we need weak-strong again to avoid retain cycle + __weak typeof(strongOperation) weakSubOperation = strongOperation; + strongOperation.downloadToken = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { + __strong typeof(weakSubOperation) strongSubOperation = weakSubOperation; + if (!strongSubOperation || strongSubOperation.isCancelled) { // Do nothing if the operation was cancelled // See #699 for more details // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data } else if (error) { - [self callCompletionBlockForOperation:strongOperation completion:completedBlock error:error url:url]; - - if ( error.code != NSURLErrorNotConnectedToInternet - && error.code != NSURLErrorCancelled - && error.code != NSURLErrorTimedOut - && error.code != NSURLErrorInternationalRoamingOff - && error.code != NSURLErrorDataNotAllowed - && error.code != NSURLErrorCannotFindHost - && error.code != NSURLErrorCannotConnectToHost) { - @synchronized (self.failedURLs) { - [self.failedURLs addObject:url]; - } + [self callCompletionBlockForOperation:strongSubOperation completion:completedBlock error:error url:url]; + BOOL shouldBlockFailedURL; + // Check whether we should block failed url + if ([self.delegate respondsToSelector:@selector(imageManager:shouldBlockFailedURL:withError:)]) { + shouldBlockFailedURL = [self.delegate imageManager:self shouldBlockFailedURL:url withError:error]; + } else { + shouldBlockFailedURL = ( error.code != NSURLErrorNotConnectedToInternet + && error.code != NSURLErrorCancelled + && error.code != NSURLErrorTimedOut + && error.code != NSURLErrorInternationalRoamingOff + && error.code != NSURLErrorDataNotAllowed + && error.code != NSURLErrorCannotFindHost + && error.code != NSURLErrorCannotConnectToHost + && error.code != NSURLErrorNetworkConnectionLost); + } + + if (shouldBlockFailedURL) { + LOCK(self.failedURLsLock); + [self.failedURLs addObject:url]; + UNLOCK(self.failedURLsLock); } } else { if ((options & SDWebImageRetryFailed)) { - @synchronized (self.failedURLs) { - [self.failedURLs removeObject:url]; - } + LOCK(self.failedURLsLock); + [self.failedURLs removeObject:url]; + UNLOCK(self.failedURLsLock); } BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); + + // We've done the scale process in SDWebImageDownloader with the shared manager, this is used for custom manager and avoid extra scale. + if (self != [SDWebImageManager sharedManager] && self.cacheKeyFilter && downloadedImage) { + downloadedImage = [self scaledImageForKey:key image:downloadedImage]; + } if (options & SDWebImageRefreshCached && cachedImage && !downloadedImage) { // Image refresh hit the NSURLCache cache, do not call the completion block } else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url]; - - if (transformedImage && finished) { - BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - // pass nil if the image was transformed, so we can recalculate the data from the image - [self.imageCache storeImage:transformedImage imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk completion:nil]; + @autoreleasepool { + UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url]; + + if (transformedImage && finished) { + BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; + NSData *cacheData; + // pass nil if the image was transformed, so we can recalculate the data from the image + if (self.cacheSerializer) { + cacheData = self.cacheSerializer(transformedImage, (imageWasTransformed ? nil : downloadedData), url); + } else { + cacheData = (imageWasTransformed ? nil : downloadedData); + } + [self.imageCache storeImage:transformedImage imageData:cacheData forKey:key toDisk:cacheOnDisk completion:nil]; + } + + [self callCompletionBlockForOperation:strongSubOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; } - - [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; }); } else { if (downloadedImage && finished) { - [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; + if (self.cacheSerializer) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + @autoreleasepool { + NSData *cacheData = self.cacheSerializer(downloadedImage, downloadedData, url); + [self.imageCache storeImage:downloadedImage imageData:cacheData forKey:key toDisk:cacheOnDisk completion:nil]; + } + }); + } else { + [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; + } } - [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:downloadedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; + [self callCompletionBlockForOperation:strongSubOperation completion:completedBlock image:downloadedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; } } if (finished) { - [self safelyRemoveOperationFromRunning:strongOperation]; + [self safelyRemoveOperationFromRunning:strongSubOperation]; } }]; - operation.cancelBlock = ^{ - [self.imageDownloader cancel:subOperationToken]; - __strong __typeof(weakOperation) strongOperation = weakOperation; - [self safelyRemoveOperationFromRunning:strongOperation]; - }; } else if (cachedImage) { - __strong __typeof(weakOperation) strongOperation = weakOperation; [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; - [self safelyRemoveOperationFromRunning:operation]; + [self safelyRemoveOperationFromRunning:strongOperation]; } else { // Image not in cache and download disallowed by delegate - __strong __typeof(weakOperation) strongOperation = weakOperation; [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:nil data:nil error:nil cacheType:SDImageCacheTypeNone finished:YES url:url]; - [self safelyRemoveOperationFromRunning:operation]; + [self safelyRemoveOperationFromRunning:strongOperation]; } }]; @@ -255,27 +303,27 @@ - (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url } - (void)cancelAll { - @synchronized (self.runningOperations) { - NSArray *copiedOperations = [self.runningOperations copy]; - [copiedOperations makeObjectsPerformSelector:@selector(cancel)]; - [self.runningOperations removeObjectsInArray:copiedOperations]; - } + LOCK(self.runningOperationsLock); + NSSet *copiedOperations = [self.runningOperations copy]; + UNLOCK(self.runningOperationsLock); + [copiedOperations makeObjectsPerformSelector:@selector(cancel)]; // This will call `safelyRemoveOperationFromRunning:` and remove from the array } - (BOOL)isRunning { BOOL isRunning = NO; - @synchronized (self.runningOperations) { - isRunning = (self.runningOperations.count > 0); - } + LOCK(self.runningOperationsLock); + isRunning = (self.runningOperations.count > 0); + UNLOCK(self.runningOperationsLock); return isRunning; } - (void)safelyRemoveOperationFromRunning:(nullable SDWebImageCombinedOperation*)operation { - @synchronized (self.runningOperations) { - if (operation) { - [self.runningOperations removeObject:operation]; - } + if (!operation) { + return; } + LOCK(self.runningOperationsLock); + [self.runningOperations removeObject:operation]; + UNLOCK(self.runningOperationsLock); } - (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation @@ -305,31 +353,17 @@ - (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)o @implementation SDWebImageCombinedOperation -- (void)setCancelBlock:(nullable SDWebImageNoParamsBlock)cancelBlock { - // check if the operation is already cancelled, then we just call the cancelBlock - if (self.isCancelled) { - if (cancelBlock) { - cancelBlock(); - } - _cancelBlock = nil; // don't forget to nil the cancelBlock, otherwise we will get crashes - } else { - _cancelBlock = [cancelBlock copy]; - } -} - - (void)cancel { - self.cancelled = YES; - if (self.cacheOperation) { - [self.cacheOperation cancel]; - self.cacheOperation = nil; - } - if (self.cancelBlock) { - self.cancelBlock(); - - // TODO: this is a temporary fix to #809. - // Until we can figure the exact cause of the crash, going with the ivar instead of the setter -// self.cancelBlock = nil; - _cancelBlock = nil; + @synchronized(self) { + self.cancelled = YES; + if (self.cacheOperation) { + [self.cacheOperation cancel]; + self.cacheOperation = nil; + } + if (self.downloadToken) { + [self.manager.imageDownloader cancel:self.downloadToken]; + } + [self.manager safelyRemoveOperationFromRunning:self]; } } diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageOperation.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h similarity index 100% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageOperation.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImagePrefetcher.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h similarity index 98% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImagePrefetcher.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h index d0a91ed..93357f4 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImagePrefetcher.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h @@ -61,7 +61,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Queue options for Prefetcher. Defaults to Main Queue. */ -@property (nonatomic, assign, nonnull) dispatch_queue_t prefetcherQueue; +@property (strong, nonatomic, nonnull) dispatch_queue_t prefetcherQueue; @property (weak, nonatomic, nullable) id delegate; diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImagePrefetcher.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m similarity index 81% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImagePrefetcher.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m index b66357f..18c433e 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImagePrefetcher.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m @@ -11,7 +11,7 @@ @interface SDWebImagePrefetcher () @property (strong, nonatomic, nonnull) SDWebImageManager *manager; -@property (strong, nonatomic, nullable) NSArray *prefetchURLs; +@property (strong, atomic, nullable) NSArray *prefetchURLs; // may be accessed from different queue @property (assign, nonatomic) NSUInteger requestedCount; @property (assign, nonatomic) NSUInteger skippedCount; @property (assign, nonatomic) NSUInteger finishedCount; @@ -55,33 +55,33 @@ - (NSUInteger)maxConcurrentDownloads { } - (void)startPrefetchingAtIndex:(NSUInteger)index { - if (index >= self.prefetchURLs.count) return; - self.requestedCount++; - [self.manager loadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + NSURL *currentURL; + @synchronized(self) { + if (index >= self.prefetchURLs.count) return; + currentURL = self.prefetchURLs[index]; + self.requestedCount++; + } + [self.manager loadImageWithURL:currentURL options:self.options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!finished) return; self.finishedCount++; - if (image) { - if (self.progressBlock) { - self.progressBlock(self.finishedCount,(self.prefetchURLs).count); - } + if (self.progressBlock) { + self.progressBlock(self.finishedCount,(self.prefetchURLs).count); } - else { - if (self.progressBlock) { - self.progressBlock(self.finishedCount,(self.prefetchURLs).count); - } + if (!image) { // Add last failed self.skippedCount++; } if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didPrefetchURL:finishedCount:totalCount:)]) { [self.delegate imagePrefetcher:self - didPrefetchURL:self.prefetchURLs[index] + didPrefetchURL:currentURL finishedCount:self.finishedCount totalCount:self.prefetchURLs.count ]; } if (self.prefetchURLs.count > self.requestedCount) { dispatch_async(self.prefetcherQueue, ^{ + // we need dispatch to avoid function recursion call. This can prevent stack overflow even for huge urls list [self startPrefetchingAtIndex:self.requestedCount]; }); } else if (self.finishedCount == self.requestedCount) { @@ -132,10 +132,12 @@ - (void)prefetchURLs:(nullable NSArray *)urls } - (void)cancelPrefetching { - self.prefetchURLs = nil; - self.skippedCount = 0; - self.requestedCount = 0; - self.finishedCount = 0; + @synchronized(self) { + self.prefetchURLs = nil; + self.skippedCount = 0; + self.requestedCount = 0; + self.finishedCount = 0; + } [self.manager cancelAll]; } diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h new file mode 100644 index 0000000..6740108 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h @@ -0,0 +1,98 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" + +#if SD_UIKIT || SD_MAC +#import "SDImageCache.h" + +// This class is used to provide a transition animation after the view category load image finished. Use this on `sd_imageTransition` in UIView+WebCache.h +// for UIKit(iOS & tvOS), we use `+[UIView transitionWithView:duration:options:animations:completion]` for transition animation. +// for AppKit(macOS), we use `+[NSAnimationContext runAnimationGroup:completionHandler:]` for transition animation. You can call `+[NSAnimationContext currentContext]` to grab the context during animations block. +// These transition are provided for basic usage. If you need complicated animation, consider to directly use Core Animation or use `SDWebImageAvoidAutoSetImage` and implement your own after image load finished. + +#if SD_UIKIT +typedef UIViewAnimationOptions SDWebImageAnimationOptions; +#else +typedef NS_OPTIONS(NSUInteger, SDWebImageAnimationOptions) { + SDWebImageAnimationOptionAllowsImplicitAnimation = 1 << 0, // specify `allowsImplicitAnimation` for the `NSAnimationContext` +}; +#endif + +typedef void (^SDWebImageTransitionPreparesBlock)(__kindof UIView * _Nonnull view, UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL); +typedef void (^SDWebImageTransitionAnimationsBlock)(__kindof UIView * _Nonnull view, UIImage * _Nullable image); +typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished); + +@interface SDWebImageTransition : NSObject + +/** + By default, we set the image to the view at the beginning of the animtions. You can disable this and provide custom set image process + */ +@property (nonatomic, assign) BOOL avoidAutoSetImage; +/** + The duration of the transition animation, measured in seconds. Defaults to 0.5. + */ +@property (nonatomic, assign) NSTimeInterval duration; +/** + The timing function used for all animations within this transition animation (macOS). + */ +@property (nonatomic, strong, nullable) CAMediaTimingFunction *timingFunction NS_AVAILABLE_MAC(10_7); +/** + A mask of options indicating how you want to perform the animations. + */ +@property (nonatomic, assign) SDWebImageAnimationOptions animationOptions; +/** + A block object to be executed before the animation sequence starts. + */ +@property (nonatomic, copy, nullable) SDWebImageTransitionPreparesBlock prepares; +/** + A block object that contains the changes you want to make to the specified view. + */ +@property (nonatomic, copy, nullable) SDWebImageTransitionAnimationsBlock animations; +/** + A block object to be executed when the animation sequence ends. + */ +@property (nonatomic, copy, nullable) SDWebImageTransitionCompletionBlock completion; + +@end + +// Convenience way to create transition. Remember to specify the duration if needed. +// for UIKit, these transition just use the correspond `animationOptions`. By default we enable `UIViewAnimationOptionAllowUserInteraction` to allow user interaction during transition. +// for AppKit, these transition use Core Animation in `animations`. So your view must be layer-backed. Set `wantsLayer = YES` before you apply it. + +@interface SDWebImageTransition (Conveniences) + +// class property is available in Xcode 8. We will drop the Xcode 7.3 support in 5.x +#if __has_feature(objc_class_property) +/// Fade transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *fadeTransition; +/// Flip from left transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromLeftTransition; +/// Flip from right transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromRightTransition; +/// Flip from top transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromTopTransition; +/// Flip from bottom transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromBottomTransition; +/// Curl up transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlUpTransition; +/// Curl down transition. +@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlDownTransition; +#else ++ (nonnull instancetype)fadeTransition; ++ (nonnull instancetype)flipFromLeftTransition; ++ (nonnull instancetype)flipFromRightTransition; ++ (nonnull instancetype)flipFromTopTransition; ++ (nonnull instancetype)flipFromBottomTransition; ++ (nonnull instancetype)curlUpTransition; ++ (nonnull instancetype)curlDownTransition; +#endif + +@end + +#endif diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m new file mode 100644 index 0000000..b04a4c3 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m @@ -0,0 +1,137 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageTransition.h" + +#if SD_UIKIT || SD_MAC + +#if SD_MAC +#import +#endif + +@implementation SDWebImageTransition + +- (instancetype)init { + self = [super init]; + if (self) { + self.duration = 0.5; + } + return self; +} + +@end + +@implementation SDWebImageTransition (Conveniences) + ++ (SDWebImageTransition *)fadeTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionFade; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + ++ (SDWebImageTransition *)flipFromLeftTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionPush; + trans.subtype = kCATransitionFromLeft; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + ++ (SDWebImageTransition *)flipFromRightTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionPush; + trans.subtype = kCATransitionFromRight; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + ++ (SDWebImageTransition *)flipFromTopTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionFlipFromTop | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionPush; + trans.subtype = kCATransitionFromTop; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + ++ (SDWebImageTransition *)flipFromBottomTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionFlipFromBottom | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionPush; + trans.subtype = kCATransitionFromBottom; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + ++ (SDWebImageTransition *)curlUpTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionCurlUp | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionReveal; + trans.subtype = kCATransitionFromTop; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + ++ (SDWebImageTransition *)curlDownTransition { + SDWebImageTransition *transition = [SDWebImageTransition new]; +#if SD_UIKIT + transition.animationOptions = UIViewAnimationOptionTransitionCurlDown | UIViewAnimationOptionAllowUserInteraction; +#else + transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { + CATransition *trans = [CATransition animation]; + trans.type = kCATransitionReveal; + trans.subtype = kCATransitionFromBottom; + [view.layer addAnimation:trans forKey:kCATransition]; + }; +#endif + return transition; +} + +@end + +#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIButton+WebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h similarity index 92% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIButton+WebCache.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h index c43b749..61fada6 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIButton+WebCache.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h @@ -17,13 +17,13 @@ */ @interface UIButton (WebCache) +#pragma mark - Image + /** * Get the current image URL. */ - (nullable NSURL *)sd_currentImageURL; -#pragma mark - Image - /** * Get the image URL for a control state. * @@ -40,7 +40,7 @@ * @param state The state that uses the specified title. The values are described in UIControlState. */ - (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state; + forState:(UIControlState)state NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url` and a placeholder. @@ -54,7 +54,7 @@ */ - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder; + placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -69,7 +69,7 @@ - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options; + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url`. @@ -105,7 +105,7 @@ - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock; + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -128,7 +128,19 @@ options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock; -#pragma mark - Background image +#pragma mark - Background Image + +/** + * Get the current background image URL. + */ +- (nullable NSURL *)sd_currentBackgroundImageURL; + +/** + * Get the background image URL for a control state. + * + * @param state Which state you want to know the URL for. The values are described in UIControlState. + */ +- (nullable NSURL *)sd_backgroundImageURLForState:(UIControlState)state; /** * Set the backgroundImageView `image` with an `url`. @@ -139,7 +151,7 @@ * @param state The state that uses the specified title. The values are described in UIControlState. */ - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state; + forState:(UIControlState)state NS_REFINED_FOR_SWIFT; /** * Set the backgroundImageView `image` with an `url` and a placeholder. @@ -153,7 +165,7 @@ */ - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder; + placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. @@ -168,7 +180,7 @@ - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options; + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; /** * Set the backgroundImageView `image` with an `url`. @@ -204,7 +216,7 @@ - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock; + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIButton+WebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m similarity index 70% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIButton+WebCache.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m index 63f75e4..8cdadb6 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIButton+WebCache.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m @@ -16,26 +16,42 @@ static char imageURLStorageKey; -typedef NSMutableDictionary SDStateImageURLDictionary; +typedef NSMutableDictionary SDStateImageURLDictionary; + +static inline NSString * imageURLKeyForState(UIControlState state) { + return [NSString stringWithFormat:@"image_%lu", (unsigned long)state]; +} + +static inline NSString * backgroundImageURLKeyForState(UIControlState state) { + return [NSString stringWithFormat:@"backgroundImage_%lu", (unsigned long)state]; +} + +static inline NSString * imageOperationKeyForState(UIControlState state) { + return [NSString stringWithFormat:@"UIButtonImageOperation%lu", (unsigned long)state]; +} + +static inline NSString * backgroundImageOperationKeyForState(UIControlState state) { + return [NSString stringWithFormat:@"UIButtonBackgroundImageOperation%lu", (unsigned long)state]; +} @implementation UIButton (WebCache) +#pragma mark - Image + - (nullable NSURL *)sd_currentImageURL { - NSURL *url = self.imageURLStorage[@(self.state)]; + NSURL *url = self.sd_imageURLStorage[imageURLKeyForState(self.state)]; if (!url) { - url = self.imageURLStorage[@(UIControlStateNormal)]; + url = self.sd_imageURLStorage[imageURLKeyForState(UIControlStateNormal)]; } return url; } - (nullable NSURL *)sd_imageURLForState:(UIControlState)state { - return self.imageURLStorage[@(state)]; + return self.sd_imageURLStorage[imageURLKeyForState(state)]; } -#pragma mark - Image - - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } @@ -62,17 +78,16 @@ - (void)sd_setImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { if (!url) { - [self.imageURLStorage removeObjectForKey:@(state)]; - return; + [self.sd_imageURLStorage removeObjectForKey:imageURLKeyForState(state)]; + } else { + self.sd_imageURLStorage[imageURLKeyForState(state)] = url; } - self.imageURLStorage[@(state)] = url; - __weak typeof(self)weakSelf = self; [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options - operationKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)] + operationKey:imageOperationKeyForState(state) setImageBlock:^(UIImage *image, NSData *imageData) { [weakSelf setImage:image forState:state]; } @@ -80,7 +95,21 @@ - (void)sd_setImageWithURL:(nullable NSURL *)url completed:completedBlock]; } -#pragma mark - Background image +#pragma mark - Background Image + +- (nullable NSURL *)sd_currentBackgroundImageURL { + NSURL *url = self.sd_imageURLStorage[backgroundImageURLKeyForState(self.state)]; + + if (!url) { + url = self.sd_imageURLStorage[backgroundImageURLKeyForState(UIControlStateNormal)]; + } + + return url; +} + +- (nullable NSURL *)sd_backgroundImageURLForState:(UIControlState)state { + return self.sd_imageURLStorage[backgroundImageURLKeyForState(state)]; +} - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; @@ -108,17 +137,16 @@ - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { if (!url) { - [self.imageURLStorage removeObjectForKey:@(state)]; - return; + [self.sd_imageURLStorage removeObjectForKey:backgroundImageURLKeyForState(state)]; + } else { + self.sd_imageURLStorage[backgroundImageURLKeyForState(state)] = url; } - self.imageURLStorage[@(state)] = url; - __weak typeof(self)weakSelf = self; [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options - operationKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)] + operationKey:backgroundImageOperationKeyForState(state) setImageBlock:^(UIImage *image, NSData *imageData) { [weakSelf setBackgroundImage:image forState:state]; } @@ -126,23 +154,19 @@ - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url completed:completedBlock]; } -- (void)sd_setImageLoadOperation:(id)operation forState:(UIControlState)state { - [self sd_setImageLoadOperation:operation forKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; -} +#pragma mark - Cancel - (void)sd_cancelImageLoadForState:(UIControlState)state { - [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; -} - -- (void)sd_setBackgroundImageLoadOperation:(id)operation forState:(UIControlState)state { - [self sd_setImageLoadOperation:operation forKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; + [self sd_cancelImageLoadOperationWithKey:imageOperationKeyForState(state)]; } - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state { - [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; + [self sd_cancelImageLoadOperationWithKey:backgroundImageOperationKeyForState(state)]; } -- (SDStateImageURLDictionary *)imageURLStorage { +#pragma mark - Private + +- (SDStateImageURLDictionary *)sd_imageURLStorage { SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); if (!storage) { storage = [NSMutableDictionary dictionary]; diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h similarity index 85% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h index 8f8df86..708c37b 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h @@ -1,13 +1,11 @@ /* * This file is part of the SDWebImage package. * (c) Olivier Poitrey - * (c) james * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -#import #import "SDWebImageCompat.h" @interface UIImage (ForceDecode) diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m new file mode 100644 index 0000000..ee55aee --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m @@ -0,0 +1,30 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIImage+ForceDecode.h" +#import "SDWebImageCodersManager.h" + +@implementation UIImage (ForceDecode) + ++ (UIImage *)decodedImageWithImage:(UIImage *)image { + if (!image) { + return nil; + } + NSData *tempData; + return [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&tempData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}]; +} + ++ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image { + if (!image) { + return nil; + } + NSData *tempData; + return [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&tempData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(YES)}]; +} + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.h old mode 100755 new mode 100644 similarity index 69% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.h index 479d572..a3a6646 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.h @@ -12,12 +12,13 @@ @interface UIImage (GIF) /** - * Compatibility method - creates an animated UIImage from an NSData, it will only contain the 1st frame image + * Creates an animated UIImage from an NSData. + * For static GIF, will create an UIImage with `images` array set to nil. For animated GIF, will create an UIImage with valid `images` array. */ + (UIImage *)sd_animatedGIFWithData:(NSData *)data; /** - * Checks if an UIImage instance is a GIF. Will use the `images` array + * Checks if an UIImage instance is a GIF. Will use the `images` array. */ - (BOOL)isGIF; diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.m new file mode 100644 index 0000000..6fbca7a --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.m @@ -0,0 +1,27 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Laurin Brandner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIImage+GIF.h" +#import "SDWebImageGIFCoder.h" +#import "NSImage+WebCache.h" + +@implementation UIImage (GIF) + ++ (UIImage *)sd_animatedGIFWithData:(NSData *)data { + if (!data) { + return nil; + } + return [[SDWebImageGIFCoder sharedCoder] decodedImageWithData:data]; +} + +- (BOOL)isGIF { + return (self.images != nil); +} + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h new file mode 100644 index 0000000..9ecf5b9 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h @@ -0,0 +1,23 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" + +@interface UIImage (MemoryCacheCost) + +/** + The memory cache cost for specify image used by image cache. The cost function is the pixles count held in memory. + If you set some associated object to `UIImage`, you can set the custom value to indicate the memory cost. + + For `UIImage`, this method return the single frame pixles count when `image.images` is nil for static image. Retuen full frame pixels count when `image.images` is not nil for animated image. + For `NSImage`, this method return the single frame pixels count because `NSImage` does not store all frames in memory. + @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. + */ +@property (assign, nonatomic) NSUInteger sd_memoryCost; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m new file mode 100644 index 0000000..6f1375d --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m @@ -0,0 +1,38 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIImage+MemoryCacheCost.h" +#import "objc/runtime.h" + +FOUNDATION_STATIC_INLINE NSUInteger SDMemoryCacheCostForImage(UIImage *image) { +#if SD_MAC + return image.size.height * image.size.width; +#elif SD_UIKIT || SD_WATCH + NSUInteger imageSize = image.size.height * image.size.width * image.scale * image.scale; + return image.images ? (imageSize * image.images.count) : imageSize; +#endif +} + +@implementation UIImage (MemoryCacheCost) + +- (NSUInteger)sd_memoryCost { + NSNumber *value = objc_getAssociatedObject(self, @selector(sd_memoryCost)); + NSUInteger memoryCost; + if (value != nil) { + memoryCost = [value unsignedIntegerValue]; + } else { + memoryCost = SDMemoryCacheCostForImage(self); + } + return memoryCost; +} + +- (void)setSd_memoryCost:(NSUInteger)sd_memoryCost { + objc_setAssociatedObject(self, @selector(sd_memoryCost), @(sd_memoryCost), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h new file mode 100644 index 0000000..5c6f473 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h @@ -0,0 +1,37 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" +#import "NSData+ImageContentType.h" + +@interface UIImage (MultiFormat) + +/** + * UIKit: + * For static image format, this value is always 0. + * For animated image format, 0 means infinite looping. + * @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. + * AppKit: + * NSImage currently only support animated via GIF imageRep unlike UIImage. + * The getter of this property will get the loop count from GIF imageRep + * The setter of this property will set the loop count from GIF imageRep + */ +@property (nonatomic, assign) NSUInteger sd_imageLoopCount; + +/** + * The image format represent the original compressed image data format. + * 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. + * @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. + */ +@property (nonatomic, assign) SDImageFormat sd_imageFormat; + ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data; +- (nullable NSData *)sd_imageData; +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat; + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m new file mode 100644 index 0000000..d3198d2 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m @@ -0,0 +1,95 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIImage+MultiFormat.h" +#import "NSImage+WebCache.h" +#import "SDWebImageCodersManager.h" +#import "objc/runtime.h" + +@implementation UIImage (MultiFormat) + +#if SD_MAC +- (NSUInteger)sd_imageLoopCount { + NSUInteger imageLoopCount = 0; + for (NSImageRep *rep in self.representations) { + if ([rep isKindOfClass:[NSBitmapImageRep class]]) { + NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)rep; + imageLoopCount = [[bitmapRep valueForProperty:NSImageLoopCount] unsignedIntegerValue]; + break; + } + } + return imageLoopCount; +} + +- (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount { + for (NSImageRep *rep in self.representations) { + if ([rep isKindOfClass:[NSBitmapImageRep class]]) { + NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)rep; + [bitmapRep setProperty:NSImageLoopCount withValue:@(sd_imageLoopCount)]; + break; + } + } +} + +#else + +- (NSUInteger)sd_imageLoopCount { + NSUInteger imageLoopCount = 0; + NSNumber *value = objc_getAssociatedObject(self, @selector(sd_imageLoopCount)); + if ([value isKindOfClass:[NSNumber class]]) { + imageLoopCount = value.unsignedIntegerValue; + } + return imageLoopCount; +} + +- (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount { + NSNumber *value = @(sd_imageLoopCount); + objc_setAssociatedObject(self, @selector(sd_imageLoopCount), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} +#endif + +- (SDImageFormat)sd_imageFormat { + SDImageFormat imageFormat = SDImageFormatUndefined; + NSNumber *value = objc_getAssociatedObject(self, @selector(sd_imageFormat)); + if ([value isKindOfClass:[NSNumber class]]) { + imageFormat = value.integerValue; + return imageFormat; + } + // Check CGImage's UTType, may return nil for non-Image/IO based image +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + if (&CGImageGetUTType != NULL) { + CFStringRef uttype = CGImageGetUTType(self.CGImage); + imageFormat = [NSData sd_imageFormatFromUTType:uttype]; + } +#pragma clang diagnostic pop + return imageFormat; +} + +- (void)setSd_imageFormat:(SDImageFormat)sd_imageFormat { + objc_setAssociatedObject(self, @selector(sd_imageFormat), @(sd_imageFormat), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data { + return [[SDWebImageCodersManager sharedInstance] decodedImageWithData:data]; +} + +- (nullable NSData *)sd_imageData { + return [self sd_imageDataAsFormat:SDImageFormatUndefined]; +} + +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat { + NSData *imageData = nil; + if (self) { + imageData = [[SDWebImageCodersManager sharedInstance] encodedDataWithImage:self format:imageFormat]; + } + return imageData; +} + + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h similarity index 96% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h index ceb71c2..c806e5f 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h @@ -24,7 +24,7 @@ * * @param url The url for the image. */ -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -35,7 +35,7 @@ * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options; + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; /** * Set the imageView `highlightedImage` with an `url`. @@ -50,7 +50,7 @@ * The fourth parameter is the original image url. */ - (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - completed:(nullable SDExternalCompletionBlock)completedBlock; + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; /** * Set the imageView `highlightedImage` with an `url` and custom options. diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m similarity index 100% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+WebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h similarity index 86% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+WebCache.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h index b1d954f..d2992cb 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+WebCache.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h @@ -7,9 +7,6 @@ */ #import "SDWebImageCompat.h" - -#if SD_UIKIT || SD_MAC - #import "SDWebImageManager.h" /** @@ -30,8 +27,7 @@ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] - autorelease]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; } // Here we use the provided sd_setImageWithURL: method to load the web image @@ -54,7 +50,7 @@ * * @param url The url for the image. */ -- (void)sd_setImageWithURL:(nullable NSURL *)url; +- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url` and a placeholder. @@ -66,7 +62,7 @@ * @see sd_setImageWithURL:placeholderImage:options: */ - (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder; + placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -79,7 +75,7 @@ */ - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options; + options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url`. @@ -111,7 +107,7 @@ */ - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock; + completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -155,7 +151,9 @@ completed:(nullable SDExternalCompletionBlock)completedBlock; /** - * Set the imageView `image` with an `url` and optionally a placeholder image. + * Set the imageView `image` with an `url` and custom options. The placeholder image is from previous cached image and will use the provided one instead if the query failed. + * This method was designed to ensure that placeholder and query cache process happened in the same runloop to avoid flashing on cell during two `setImage:` call. But it's really misunderstanding and deprecated. + * This can be done by using `sd_setImageWithURL:` with `SDWebImageQueryDiskSync`. But take care that if the memory cache missed, query disk cache synchronously may reduce the frame rate * * The download is asynchronous and cached. * @@ -169,12 +167,13 @@ * is nil and the second parameter may contain an NSError. The third parameter is a Boolean * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. + * @deprecated consider using `SDWebImageQueryDiskSync` options with `sd_setImageWithURL:` instead */ - (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; + completed:(nullable SDExternalCompletionBlock)completedBlock __deprecated_msg("This method is misunderstanding and deprecated, consider using `SDWebImageQueryDiskSync` options with `sd_setImageWithURL:` instead"); #if SD_UIKIT @@ -192,5 +191,3 @@ #endif @end - -#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+WebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m similarity index 62% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+WebCache.m rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m index 81f687e..1baea5d 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImageView+WebCache.m +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m @@ -7,9 +7,6 @@ */ #import "UIImageView+WebCache.h" - -#if SD_UIKIT || SD_MAC - #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" #import "UIView+WebCache.h" @@ -71,22 +68,30 @@ - (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url - (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; - __weak __typeof(self)wself = self; - - NSMutableArray> *operationsArray = [[NSMutableArray alloc] init]; - - for (NSURL *logoImageURL in arrayOfURLs) { - id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; + NSPointerArray *operationsArray = [self sd_animationOperationArray]; + + [arrayOfURLs enumerateObjectsUsingBlock:^(NSURL *logoImageURL, NSUInteger idx, BOOL * _Nonnull stop) { + __weak __typeof(self) wself = self; + id operation = [[SDWebImageManager sharedManager] loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + __strong typeof(wself) sself = wself; + if (!sself) return; dispatch_main_async_safe(^{ - __strong UIImageView *sself = wself; [sself stopAnimating]; if (sself && image) { NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; if (!currentImages) { currentImages = [[NSMutableArray alloc] init]; } - [currentImages addObject:image]; + + // We know what index objects should be at when they are returned so + // we will put the object at the index, filling any empty indexes + // with the image that was returned too "early". These images will + // be overwritten. (does not require additional sorting datastructure) + while ([currentImages count] < idx) { + [currentImages addObject:image]; + } + + currentImages[idx] = image; sself.animationImages = currentImages; [sself setNeedsLayout]; @@ -94,17 +99,41 @@ - (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { [sself startAnimating]; }); }]; - [operationsArray addObject:operation]; - } + @synchronized (self) { + [operationsArray addPointer:(__bridge void *)(operation)]; + } + }]; +} - [self sd_setImageLoadOperation:[operationsArray copy] forKey:@"UIImageViewAnimationImages"]; +static char animationLoadOperationKey; + +// element is weak because operation instance is retained by SDWebImageManager's runningOperations property +// we should use lock to keep thread-safe because these method may not be acessed from main queue +- (NSPointerArray *)sd_animationOperationArray { + @synchronized(self) { + NSPointerArray *operationsArray = objc_getAssociatedObject(self, &animationLoadOperationKey); + if (operationsArray) { + return operationsArray; + } + operationsArray = [NSPointerArray weakObjectsPointerArray]; + objc_setAssociatedObject(self, &animationLoadOperationKey, operationsArray, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return operationsArray; + } } - (void)sd_cancelCurrentAnimationImagesLoad { - [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimationImages"]; + NSPointerArray *operationsArray = [self sd_animationOperationArray]; + if (operationsArray) { + @synchronized (self) { + for (id operation in operationsArray) { + if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) { + [operation cancel]; + } + } + operationsArray.count = 0; + } + } } #endif @end - -#endif diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.h new file mode 100644 index 0000000..5cf40ca --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.h @@ -0,0 +1,140 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" +#import "SDWebImageManager.h" +#import "SDWebImageTransition.h" + +/** + A Dispatch group to maintain setImageBlock and completionBlock. This key should be used only internally and may be changed in the future. (dispatch_group_t) + */ +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageInternalSetImageGroupKey; +/** + A SDWebImageManager instance to control the image download and cache process using in UIImageView+WebCache category and likes. If not provided, use the shared manager (SDWebImageManager) + */ +FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageExternalCustomManagerKey; +/** + The value specify that the image progress unit count cannot be determined because the progressBlock is not been called. + */ +FOUNDATION_EXPORT const int64_t SDWebImageProgressUnitCountUnknown; /* 1LL */ + +typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable imageData); +typedef void(^SDInternalSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL); + +@interface UIView (WebCache) + +/** + * Get the current image URL. + * + * @note Note that because of the limitations of categories this property can get out of sync if you use setImage: directly. + */ +- (nullable NSURL *)sd_imageURL; + +/** + * The current image loading progress associated to the view. The unit count is the received size and excepted size of download. + * The `totalUnitCount` and `completedUnitCount` will be reset to 0 after a new image loading start (change from current queue). And they will be set to `SDWebImageProgressUnitCountUnknown` if the progressBlock not been called but the image loading success to mark the progress finished (change from main queue). + * @note You can use Key-Value Observing on the progress, but you should take care that the change to progress is from a background queue during download(the same as progressBlock). If you want to using KVO and update the UI, make sure to dispatch on the main queue. And it's recommand to use some KVO libs like KVOController because it's more safe and easy to use. + * @note The getter will create a progress instance if the value is nil. You can also set a custom progress instance and let it been updated during image loading + * @note Note that because of the limitations of categories this property can get out of sync if you update the progress directly. + */ +@property (nonatomic, strong, null_resettable) NSProgress *sd_imageProgress; + +/** + * Set the imageView `image` with an `url` and optionally a placeholder image. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param operationKey A string to be used as the operation key. If nil, will use the class name + * @param setImageBlock Block used for custom set image code + * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url` and optionally a placeholder image. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param operationKey A string to be used as the operation key. If nil, will use the class name + * @param setImageBlock Block used for custom set image code + * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + * @param context A context with extra information to perform specify changes or processes. + */ +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock + context:(nullable NSDictionary *)context; + +/** + * Cancel the current image load + */ +- (void)sd_cancelCurrentImageLoad; + +#if SD_UIKIT || SD_MAC + +#pragma mark - Image Transition + +/** + The image transition when image load finished. See `SDWebImageTransition`. + If you specify nil, do not do transition. Defautls to nil. + */ +@property (nonatomic, strong, nullable) SDWebImageTransition *sd_imageTransition; + +#if SD_UIKIT + +#pragma mark - Activity indicator + +/** + * Show activity UIActivityIndicatorView + */ +- (void)sd_setShowActivityIndicatorView:(BOOL)show; + +/** + * set desired UIActivityIndicatorViewStyle + * + * @param style The style of the UIActivityIndicatorView + */ +- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style; + +- (BOOL)sd_showActivityIndicatorView; +- (void)sd_addActivityIndicator; +- (void)sd_removeActivityIndicator; + +#endif + +#endif + +@end diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.m new file mode 100644 index 0000000..1ebd3e7 --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.m @@ -0,0 +1,385 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIView+WebCache.h" +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" + +NSString * const SDWebImageInternalSetImageGroupKey = @"internalSetImageGroup"; +NSString * const SDWebImageExternalCustomManagerKey = @"externalCustomManager"; + +const int64_t SDWebImageProgressUnitCountUnknown = 1LL; + +static char imageURLKey; + +#if SD_UIKIT +static char TAG_ACTIVITY_INDICATOR; +static char TAG_ACTIVITY_STYLE; +static char TAG_ACTIVITY_SHOW; +#endif + +@implementation UIView (WebCache) + +- (nullable NSURL *)sd_imageURL { + return objc_getAssociatedObject(self, &imageURLKey); +} + +- (NSProgress *)sd_imageProgress { + NSProgress *progress = objc_getAssociatedObject(self, @selector(sd_imageProgress)); + if (!progress) { + progress = [[NSProgress alloc] initWithParent:nil userInfo:nil]; + self.sd_imageProgress = progress; + } + return progress; +} + +- (void)setSd_imageProgress:(NSProgress *)sd_imageProgress { + objc_setAssociatedObject(self, @selector(sd_imageProgress), sd_imageProgress, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + return [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options operationKey:operationKey setImageBlock:setImageBlock progress:progressBlock completed:completedBlock context:nil]; +} + +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock + context:(nullable NSDictionary *)context { + SDInternalSetImageBlock internalSetImageBlock; + if (setImageBlock) { + internalSetImageBlock = ^(UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + if (setImageBlock) { + setImageBlock(image, imageData); + } + }; + } + [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options operationKey:operationKey internalSetImageBlock:internalSetImageBlock progress:progressBlock completed:completedBlock context:context]; +} + +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + internalSetImageBlock:(nullable SDInternalSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock + context:(nullable NSDictionary *)context { + NSString *validOperationKey = operationKey ?: NSStringFromClass([self class]); + [self sd_cancelImageLoadOperationWithKey:validOperationKey]; + objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + dispatch_group_t group = context[SDWebImageInternalSetImageGroupKey]; + if (!(options & SDWebImageDelayPlaceholder)) { + if (group) { + dispatch_group_enter(group); + } + dispatch_main_async_safe(^{ + [self sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock cacheType:SDImageCacheTypeNone imageURL:url]; + }); + } + + if (url) { +#if SD_UIKIT + // check if activityView is enabled or not + if ([self sd_showActivityIndicatorView]) { + [self sd_addActivityIndicator]; + } +#endif + + // reset the progress + self.sd_imageProgress.totalUnitCount = 0; + self.sd_imageProgress.completedUnitCount = 0; + + SDWebImageManager *manager = [context objectForKey:SDWebImageExternalCustomManagerKey]; + if (!manager) { + manager = [SDWebImageManager sharedManager]; + } + + __weak __typeof(self)wself = self; + SDWebImageDownloaderProgressBlock combinedProgressBlock = ^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { + wself.sd_imageProgress.totalUnitCount = expectedSize; + wself.sd_imageProgress.completedUnitCount = receivedSize; + if (progressBlock) { + progressBlock(receivedSize, expectedSize, targetURL); + } + }; + id operation = [manager loadImageWithURL:url options:options progress:combinedProgressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + __strong __typeof (wself) sself = wself; + if (!sself) { return; } +#if SD_UIKIT + [sself sd_removeActivityIndicator]; +#endif + // if the progress not been updated, mark it to complete state + if (finished && !error && sself.sd_imageProgress.totalUnitCount == 0 && sself.sd_imageProgress.completedUnitCount == 0) { + sself.sd_imageProgress.totalUnitCount = SDWebImageProgressUnitCountUnknown; + sself.sd_imageProgress.completedUnitCount = SDWebImageProgressUnitCountUnknown; + } + BOOL shouldCallCompletedBlock = finished || (options & SDWebImageAvoidAutoSetImage); + BOOL shouldNotSetImage = ((image && (options & SDWebImageAvoidAutoSetImage)) || + (!image && !(options & SDWebImageDelayPlaceholder))); + SDWebImageNoParamsBlock callCompletedBlockClojure = ^{ + if (!sself) { return; } + if (!shouldNotSetImage) { + [sself sd_setNeedsLayout]; + } + if (completedBlock && shouldCallCompletedBlock) { + completedBlock(image, error, cacheType, url); + } + }; + + // case 1a: we got an image, but the SDWebImageAvoidAutoSetImage flag is set + // OR + // case 1b: we got no image and the SDWebImageDelayPlaceholder is not set + if (shouldNotSetImage) { + dispatch_main_async_safe(callCompletedBlockClojure); + return; + } + + UIImage *targetImage = nil; + NSData *targetData = nil; + if (image) { + // case 2a: we got an image and the SDWebImageAvoidAutoSetImage is not set + targetImage = image; + targetData = data; + } else if (options & SDWebImageDelayPlaceholder) { + // case 2b: we got no image and the SDWebImageDelayPlaceholder flag is set + targetImage = placeholder; + targetData = nil; + } + +#if SD_UIKIT || SD_MAC + // check whether we should use the image transition + SDWebImageTransition *transition = nil; + if (finished && (options & SDWebImageForceTransition || cacheType == SDImageCacheTypeNone)) { + transition = sself.sd_imageTransition; + } +#endif + dispatch_main_async_safe(^{ + if (group) { + dispatch_group_enter(group); + } +#if SD_UIKIT || SD_MAC + [sself sd_setImage:targetImage imageData:targetData basedOnClassOrViaCustomSetImageBlock:setImageBlock transition:transition cacheType:cacheType imageURL:imageURL]; +#else + [sself sd_setImage:targetImage imageData:targetData basedOnClassOrViaCustomSetImageBlock:setImageBlock cacheType:cacheType imageURL:imageURL]; +#endif + if (group) { + // compatible code for FLAnimatedImage, because we assume completedBlock called after image was set. This will be removed in 5.x + BOOL shouldUseGroup = [objc_getAssociatedObject(group, &SDWebImageInternalSetImageGroupKey) boolValue]; + if (shouldUseGroup) { + dispatch_group_notify(group, dispatch_get_main_queue(), callCompletedBlockClojure); + } else { + callCompletedBlockClojure(); + } + } else { + callCompletedBlockClojure(); + } + }); + }]; + [self sd_setImageLoadOperation:operation forKey:validOperationKey]; + } else { + dispatch_main_async_safe(^{ +#if SD_UIKIT + [self sd_removeActivityIndicator]; +#endif + if (completedBlock) { + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_cancelCurrentImageLoad { + [self sd_cancelImageLoadOperationWithKey:NSStringFromClass([self class])]; +} + +- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDInternalSetImageBlock)setImageBlock cacheType:(SDImageCacheType)cacheType imageURL:(NSURL *)imageURL { +#if SD_UIKIT || SD_MAC + [self sd_setImage:image imageData:imageData basedOnClassOrViaCustomSetImageBlock:setImageBlock transition:nil cacheType:cacheType imageURL:imageURL]; +#else + // watchOS does not support view transition. Simplify the logic + if (setImageBlock) { + setImageBlock(image, imageData, cacheType, imageURL); + } else if ([self isKindOfClass:[UIImageView class]]) { + UIImageView *imageView = (UIImageView *)self; + [imageView setImage:image]; + } +#endif +} + +#if SD_UIKIT || SD_MAC +- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDInternalSetImageBlock)setImageBlock transition:(SDWebImageTransition *)transition cacheType:(SDImageCacheType)cacheType imageURL:(NSURL *)imageURL { + UIView *view = self; + SDInternalSetImageBlock finalSetImageBlock; + if (setImageBlock) { + finalSetImageBlock = setImageBlock; + } else if ([view isKindOfClass:[UIImageView class]]) { + UIImageView *imageView = (UIImageView *)view; + finalSetImageBlock = ^(UIImage *setImage, NSData *setImageData, SDImageCacheType setCacheType, NSURL *setImageURL) { + imageView.image = setImage; + }; + } +#if SD_UIKIT + else if ([view isKindOfClass:[UIButton class]]) { + UIButton *button = (UIButton *)view; + finalSetImageBlock = ^(UIImage *setImage, NSData *setImageData, SDImageCacheType setCacheType, NSURL *setImageURL) { + [button setImage:setImage forState:UIControlStateNormal]; + }; + } +#endif + + if (transition) { +#if SD_UIKIT + [UIView transitionWithView:view duration:0 options:0 animations:^{ + // 0 duration to let UIKit render placeholder and prepares block + if (transition.prepares) { + transition.prepares(view, image, imageData, cacheType, imageURL); + } + } completion:^(BOOL finished) { + [UIView transitionWithView:view duration:transition.duration options:transition.animationOptions animations:^{ + if (finalSetImageBlock && !transition.avoidAutoSetImage) { + finalSetImageBlock(image, imageData, cacheType, imageURL); + } + if (transition.animations) { + transition.animations(view, image); + } + } completion:transition.completion]; + }]; +#elif SD_MAC + [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull prepareContext) { + // 0 duration to let AppKit render placeholder and prepares block + prepareContext.duration = 0; + if (transition.prepares) { + transition.prepares(view, image, imageData, cacheType, imageURL); + } + } completionHandler:^{ + [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) { + context.duration = transition.duration; + context.timingFunction = transition.timingFunction; + context.allowsImplicitAnimation = (transition.animationOptions & SDWebImageAnimationOptionAllowsImplicitAnimation); + if (finalSetImageBlock && !transition.avoidAutoSetImage) { + finalSetImageBlock(image, imageData, cacheType, imageURL); + } + if (transition.animations) { + transition.animations(view, image); + } + } completionHandler:^{ + if (transition.completion) { + transition.completion(YES); + } + }]; + }]; +#endif + } else { + if (finalSetImageBlock) { + finalSetImageBlock(image, imageData, cacheType, imageURL); + } + } +} +#endif + +- (void)sd_setNeedsLayout { +#if SD_UIKIT + [self setNeedsLayout]; +#elif SD_MAC + [self setNeedsLayout:YES]; +#elif SD_WATCH + // Do nothing because WatchKit automatically layout the view after property change +#endif +} + +#if SD_UIKIT || SD_MAC + +#pragma mark - Image Transition +- (SDWebImageTransition *)sd_imageTransition { + return objc_getAssociatedObject(self, @selector(sd_imageTransition)); +} + +- (void)setSd_imageTransition:(SDWebImageTransition *)sd_imageTransition { + objc_setAssociatedObject(self, @selector(sd_imageTransition), sd_imageTransition, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#if SD_UIKIT + +#pragma mark - Activity indicator +- (UIActivityIndicatorView *)activityIndicator { + return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); +} + +- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { + objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); +} + +- (void)sd_setShowActivityIndicatorView:(BOOL)show { + objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); +} + +- (BOOL)sd_showActivityIndicatorView { + return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; +} + +- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ + objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); +} + +- (int)sd_getIndicatorStyle{ + return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; +} + +- (void)sd_addActivityIndicator { + dispatch_main_async_safe(^{ + if (!self.activityIndicator) { + self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self sd_getIndicatorStyle]]; + self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; + + [self addSubview:self.activityIndicator]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterX + multiplier:1.0 + constant:0.0]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterY + multiplier:1.0 + constant:0.0]]; + } + [self.activityIndicator startAnimating]; + }); +} + +- (void)sd_removeActivityIndicator { + dispatch_main_async_safe(^{ + if (self.activityIndicator) { + [self.activityIndicator removeFromSuperview]; + self.activityIndicator = nil; + } + }); +} + +#endif + +#endif + +@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.h b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h similarity index 61% rename from DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.h rename to DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h index f5e95fa..0be284b 100644 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.h +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h @@ -7,20 +7,19 @@ */ #import "SDWebImageCompat.h" +#import "SDWebImageOperation.h" -#if SD_UIKIT || SD_MAC - -#import "SDWebImageManager.h" - +// These methods are used to support canceling for UIView image loading, it's designed to be used internal but not external. +// 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. @interface UIView (WebCacheOperation) /** - * Set the image load operation (storage in a UIView based dictionary) + * Set the image load operation (storage in a UIView based weak map table) * * @param operation the operation * @param key key for storing the operation */ -- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key; +- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key; /** * Cancel all operations for the current UIView and key @@ -37,5 +36,3 @@ - (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key; @end - -#endif diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m new file mode 100644 index 0000000..cd769be --- /dev/null +++ b/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m @@ -0,0 +1,73 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIView+WebCacheOperation.h" +#import "objc/runtime.h" + +static char loadOperationKey; + +// key is copy, value is weak because operation instance is retained by SDWebImageManager's runningOperations property +// we should use lock to keep thread-safe because these method may not be acessed from main queue +typedef NSMapTable> SDOperationsDictionary; + +@implementation UIView (WebCacheOperation) + +- (SDOperationsDictionary *)sd_operationDictionary { + @synchronized(self) { + SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); + if (operations) { + return operations; + } + operations = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0]; + objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return operations; + } +} + +- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key { + if (key) { + [self sd_cancelImageLoadOperationWithKey:key]; + if (operation) { + SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; + @synchronized (self) { + [operationDictionary setObject:operation forKey:key]; + } + } + } +} + +- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { + if (key) { + // Cancel in progress downloader from queue + SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; + id operation; + + @synchronized (self) { + operation = [operationDictionary objectForKey:key]; + } + if (operation) { + if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) { + [operation cancel]; + } + @synchronized (self) { + [operationDictionary removeObjectForKey:key]; + } + } + } +} + +- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key { + if (key) { + SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; + @synchronized (self) { + [operationDictionary removeObjectForKey:key]; + } + } +} + +@end diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m new file mode 100644 index 0000000..343e6b0 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FLAnimatedImage : NSObject +@end +@implementation PodsDummy_FLAnimatedImage +@end diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h new file mode 100644 index 0000000..3ae0cae --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h @@ -0,0 +1,18 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FLAnimatedImage.h" +#import "FLAnimatedImageView.h" + +FOUNDATION_EXPORT double FLAnimatedImageVersionNumber; +FOUNDATION_EXPORT const unsigned char FLAnimatedImageVersionString[]; + diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap new file mode 100644 index 0000000..0c6f2e3 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap @@ -0,0 +1,6 @@ +framework module FLAnimatedImage { + umbrella header "FLAnimatedImage-umbrella.h" + + export * + module * { export * } +} diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig new file mode 100644 index 0000000..2fd6000 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = -framework "CoreGraphics" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FLAnimatedImage +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/Info.plist b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/Info.plist new file mode 100644 index 0000000..b8236f1 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/FLAnimatedImage/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.12 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Info.plist b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown new file mode 100644 index 0000000..439e121 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown @@ -0,0 +1,52 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## FLAnimatedImage + +The MIT License (MIT) + +Copyright (c) 2014-2016 Flipboard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +## SDWebImage + +Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Generated by CocoaPods - https://cocoapods.org diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist new file mode 100644 index 0000000..03bad00 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist @@ -0,0 +1,90 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014-2016 Flipboard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + FLAnimatedImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + License + MIT + Title + SDWebImage + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m new file mode 100644 index 0000000..724fd01 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_DKCarousel : NSObject +@end +@implementation PodsDummy_Pods_DKCarousel +@end diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh new file mode 100755 index 0000000..345301f --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h new file mode 100644 index 0000000..74be18f --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_DKCarouselVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_DKCarouselVersionString[]; + diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig new file mode 100644 index 0000000..194983a --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FLAnimatedImage" -framework "SDWebImage" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap new file mode 100644 index 0000000..6beff9a --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap @@ -0,0 +1,6 @@ +framework module Pods_DKCarousel { + umbrella header "Pods-DKCarousel-umbrella.h" + + export * + module * { export * } +} diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig new file mode 100644 index 0000000..194983a --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FLAnimatedImage" -framework "SDWebImage" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/Info.plist b/DKCarousel/Pods/Target Support Files/SDWebImage/Info.plist new file mode 100644 index 0000000..e42667b --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/SDWebImage/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 4.4.6 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m new file mode 100644 index 0000000..86d2b5f --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SDWebImage : NSObject +@end +@implementation PodsDummy_SDWebImage +@end diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h new file mode 100644 index 0000000..2e7fb7e --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h @@ -0,0 +1,45 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "NSButton+WebCache.h" +#import "NSData+ImageContentType.h" +#import "NSImage+WebCache.h" +#import "SDAnimatedImageRep.h" +#import "SDImageCache.h" +#import "SDImageCacheConfig.h" +#import "SDWebImageCoder.h" +#import "SDWebImageCoderHelper.h" +#import "SDWebImageCodersManager.h" +#import "SDWebImageCompat.h" +#import "SDWebImageDownloader.h" +#import "SDWebImageDownloaderOperation.h" +#import "SDWebImageFrame.h" +#import "SDWebImageGIFCoder.h" +#import "SDWebImageImageIOCoder.h" +#import "SDWebImageManager.h" +#import "SDWebImageOperation.h" +#import "SDWebImagePrefetcher.h" +#import "SDWebImageTransition.h" +#import "UIButton+WebCache.h" +#import "UIImage+ForceDecode.h" +#import "UIImage+GIF.h" +#import "UIImage+MemoryCacheCost.h" +#import "UIImage+MultiFormat.h" +#import "UIImageView+HighlightedWebCache.h" +#import "UIImageView+WebCache.h" +#import "UIView+WebCache.h" +#import "UIView+WebCacheOperation.h" +#import "FLAnimatedImageView+WebCache.h" + +FOUNDATION_EXPORT double SDWebImageVersionNumber; +FOUNDATION_EXPORT const unsigned char SDWebImageVersionString[]; + diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap new file mode 100644 index 0000000..91545be --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap @@ -0,0 +1,6 @@ +framework module SDWebImage { + umbrella header "SDWebImage-umbrella.h" + + export * + module * { export * } +} diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig new file mode 100644 index 0000000..99759bf --- /dev/null +++ b/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = -framework "ImageIO" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/SDWebImage +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/DKCarouselView.podspec b/DKCarouselView.podspec index 79dc4d3..ae631fd 100644 --- a/DKCarouselView.podspec +++ b/DKCarouselView.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.platform = :ios, "7.0" s.source = { :git => "https://github.com/zhangao0086/DKCarouselView.git", :tag => s.version.to_s } - s.source_files = "DKCarouselView/*.{h,m}" + s.source_files = "DKCarousel/DKCarouselView/*.{h,m}" s.frameworks = "Foundation", "UIKit" s.requires_arc = true s.dependency "SDWebImage/GIF", '~> 4.1' From 9042714d5803bdbb7ba637ea4f46907caccb9369 Mon Sep 17 00:00:00 2001 From: Carles Roig Date: Fri, 29 Mar 2019 15:36:29 +0100 Subject: [PATCH 2/4] Remove void warning --- DKCarousel/DKCarouselView/DKCarouselView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DKCarousel/DKCarouselView/DKCarouselView.m b/DKCarousel/DKCarouselView/DKCarouselView.m index ac3074f..47a7aa0 100644 --- a/DKCarousel/DKCarouselView/DKCarouselView.m +++ b/DKCarousel/DKCarouselView/DKCarouselView.m @@ -10,7 +10,7 @@ #import "DKCarouselView.h" #import "FLAnimatedImageView+WebCache.h" -typedef void(^DKCarouselViewTapBlock)(); +typedef void(^DKCarouselViewTapBlock)(void); @interface DKClickableImageView : FLAnimatedImageView From c0432833c72bbcb8568f9003d078167a219ac8be Mon Sep 17 00:00:00 2001 From: Carles Roig Date: Thu, 4 Apr 2019 12:58:56 +0200 Subject: [PATCH 3/4] Unify demo project with framework --- DKCarousel/Podfile | 7 - DKCarousel/Podfile.lock | 22 - DKCarousel/Pods/Manifest.lock | 22 - .../Pods/Pods.xcodeproj/project.pbxproj | 1078 -------------- .../Pods-DKCarousel/Pods-DKCarousel-dummy.m | 5 - .../Pods-DKCarousel/Pods-DKCarousel.modulemap | 6 - DKCarouselView.podspec | 10 +- .../DKCarouselView.xcodeproj}/project.pbxproj | 66 +- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcschemes/DKCarouselView.xcscheme | 80 ++ .../contents.xcworkspacedata | 5 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../DKCarouselView}/DKCarousel.h | 0 .../DKCarouselView/DKCarouselView.h | 0 .../DKCarouselView/DKCarouselView.m | 0 .../DKCarouselView}/Info.plist | 0 .../project.pbxproj | 537 +++++++ .../contents.xcworkspacedata | 0 .../DKCarouselViewDemo/AppDelegate.h | 0 .../DKCarouselViewDemo/AppDelegate.m | 0 .../Base.lproj/LaunchScreen.xib | 0 .../Base.lproj/Main.storyboard | 0 .../AppIcon.appiconset/Contents.json | 0 .../DefaultImage.imageset/Contents.json | 0 .../DefaultImage.imageset/photo_default_0.png | Bin .../DKCarouselViewDemo/Info.plist | 0 .../DKCarouselViewDemo/ViewController.h | 0 .../DKCarouselViewDemo/ViewController.m | 2 +- .../DKCarouselViewDemo/main.m | 0 .../DKCarouselViewDemoTests.m | 0 .../DKCarouselViewDemoTests/Info.plist | 0 DKCarouselView/Podfile | 14 + DKCarouselView/Podfile.lock | 36 + .../Pods/DKCarouselView}/LICENSE | 3 +- DKCarouselView/Pods/DKCarouselView/README.md | 131 ++ .../FLAnimatedImage/FLAnimatedImage.h | 0 .../FLAnimatedImage/FLAnimatedImage.m | 0 .../FLAnimatedImage/FLAnimatedImageView.h | 0 .../FLAnimatedImage/FLAnimatedImageView.m | 0 .../Pods/FLAnimatedImage/LICENSE | 0 .../Pods/FLAnimatedImage/README.md | 0 .../DKCarouselView.podspec.json | 34 + DKCarouselView/Pods/Manifest.lock | 36 + .../Pods/Pods.xcodeproj/project.pbxproj | 1248 +++++++++++++++++ .../Pods/SDWebImage/LICENSE | 0 .../Pods/SDWebImage/README.md | 0 .../FLAnimatedImageView+WebCache.h | 0 .../FLAnimatedImageView+WebCache.m | 0 .../SDWebImage/SDWebImage/NSButton+WebCache.h | 0 .../SDWebImage/SDWebImage/NSButton+WebCache.m | 0 .../SDWebImage/NSData+ImageContentType.h | 0 .../SDWebImage/NSData+ImageContentType.m | 0 .../SDWebImage/SDWebImage/NSImage+WebCache.h | 0 .../SDWebImage/SDWebImage/NSImage+WebCache.m | 0 .../SDWebImage/SDAnimatedImageRep.h | 0 .../SDWebImage/SDAnimatedImageRep.m | 0 .../Pods/SDWebImage/SDWebImage/SDImageCache.h | 0 .../Pods/SDWebImage/SDWebImage/SDImageCache.m | 0 .../SDWebImage/SDImageCacheConfig.h | 0 .../SDWebImage/SDImageCacheConfig.m | 0 .../SDWebImage/SDWebImage/SDWebImageCoder.h | 0 .../SDWebImage/SDWebImage/SDWebImageCoder.m | 0 .../SDWebImage/SDWebImageCoderHelper.h | 0 .../SDWebImage/SDWebImageCoderHelper.m | 0 .../SDWebImage/SDWebImageCodersManager.h | 0 .../SDWebImage/SDWebImageCodersManager.m | 0 .../SDWebImage/SDWebImage/SDWebImageCompat.h | 0 .../SDWebImage/SDWebImage/SDWebImageCompat.m | 0 .../SDWebImage/SDWebImageDownloader.h | 0 .../SDWebImage/SDWebImageDownloader.m | 0 .../SDWebImageDownloaderOperation.h | 0 .../SDWebImageDownloaderOperation.m | 0 .../SDWebImage/SDWebImage/SDWebImageFrame.h | 0 .../SDWebImage/SDWebImage/SDWebImageFrame.m | 0 .../SDWebImage/SDWebImageGIFCoder.h | 0 .../SDWebImage/SDWebImageGIFCoder.m | 0 .../SDWebImage/SDWebImageImageIOCoder.h | 0 .../SDWebImage/SDWebImageImageIOCoder.m | 0 .../SDWebImage/SDWebImage/SDWebImageManager.h | 0 .../SDWebImage/SDWebImage/SDWebImageManager.m | 0 .../SDWebImage/SDWebImageOperation.h | 0 .../SDWebImage/SDWebImagePrefetcher.h | 0 .../SDWebImage/SDWebImagePrefetcher.m | 0 .../SDWebImage/SDWebImageTransition.h | 0 .../SDWebImage/SDWebImageTransition.m | 0 .../SDWebImage/SDWebImage/UIButton+WebCache.h | 0 .../SDWebImage/SDWebImage/UIButton+WebCache.m | 0 .../SDWebImage/UIImage+ForceDecode.h | 0 .../SDWebImage/UIImage+ForceDecode.m | 0 .../Pods/SDWebImage/SDWebImage/UIImage+GIF.h | 0 .../Pods/SDWebImage/SDWebImage/UIImage+GIF.m | 0 .../SDWebImage/UIImage+MemoryCacheCost.h | 0 .../SDWebImage/UIImage+MemoryCacheCost.m | 0 .../SDWebImage/UIImage+MultiFormat.h | 0 .../SDWebImage/UIImage+MultiFormat.m | 0 .../UIImageView+HighlightedWebCache.h | 0 .../UIImageView+HighlightedWebCache.m | 0 .../SDWebImage/UIImageView+WebCache.h | 0 .../SDWebImage/UIImageView+WebCache.m | 0 .../SDWebImage/SDWebImage/UIView+WebCache.h | 0 .../SDWebImage/SDWebImage/UIView+WebCache.m | 0 .../SDWebImage/UIView+WebCacheOperation.h | 0 .../SDWebImage/UIView+WebCacheOperation.m | 0 .../FLAnimatedImage/FLAnimatedImage-dummy.m | 0 .../FLAnimatedImage-prefix.pch | 0 .../FLAnimatedImage-umbrella.h | 0 .../FLAnimatedImage/FLAnimatedImage.modulemap | 0 .../FLAnimatedImage/FLAnimatedImage.xcconfig | 0 .../FLAnimatedImage/Info.plist | 0 .../Pods-DKCarouselView}/Info.plist | 0 ...s-DKCarouselView-acknowledgements.markdown | 0 ...Pods-DKCarouselView-acknowledgements.plist | 0 .../Pods-DKCarouselView-dummy.m | 5 + .../Pods-DKCarouselView-resources.sh | 0 .../Pods-DKCarouselView-umbrella.h | 4 +- .../Pods-DKCarouselView.debug.xcconfig | 0 .../Pods-DKCarouselView.modulemap | 6 + .../Pods-DKCarouselView.release.xcconfig | 0 .../Pods-DKCarouselViewDemo/Info.plist | 26 + ...CarouselViewDemo-acknowledgements.markdown | 78 ++ ...-DKCarouselViewDemo-acknowledgements.plist | 122 ++ .../Pods-DKCarouselViewDemo-dummy.m | 5 + .../Pods-DKCarouselViewDemo-frameworks.sh | 155 ++ .../Pods-DKCarouselViewDemo-resources.sh | 118 ++ .../Pods-DKCarouselViewDemo-umbrella.h | 16 + .../Pods-DKCarouselViewDemo.debug.xcconfig | 9 + .../Pods-DKCarouselViewDemo.modulemap | 6 + .../Pods-DKCarouselViewDemo.release.xcconfig | 9 + .../SDWebImage/Info.plist | 0 .../SDWebImage/SDWebImage-dummy.m | 0 .../SDWebImage/SDWebImage-prefix.pch | 0 .../SDWebImage/SDWebImage-umbrella.h | 0 .../SDWebImage/SDWebImage.modulemap | 0 .../SDWebImage/SDWebImage.xcconfig | 0 .../project.pbxproj | 627 --------- .../xcschemes/DKCarouselViewDemo.xcscheme | 110 -- .../xcschemes/xcschememanagement.plist | 27 - .../FLAnimatedImage/FLAnimatedImage.h | 84 -- .../FLAnimatedImage/FLAnimatedImage.m | 816 ----------- .../FLAnimatedImage/FLAnimatedImageView.h | 36 - .../FLAnimatedImage/FLAnimatedImageView.m | 437 ------ .../FLAnimatedImage/README.md | 103 -- DKCarouselViewDemo/SDWebImage/.DS_Store | Bin 6148 -> 0 bytes .../FLAnimatedImageView+WebCache.m | 71 - .../SDWebImage/NSData+ImageContentType.m | 46 - .../SDWebImage/SDImageCacheConfig.h | 40 - .../SDWebImage/SDImageCacheConfig.m | 26 - .../SDWebImage/SDWebImage/SDWebImageDecoder.m | 279 ---- .../SDWebImage/SDWebImageDownloader.m | 315 ----- .../SDWebImage/SDWebImage/UIImage+GIF.m | 60 - .../SDWebImage/UIImage+MultiFormat.h | 18 - .../SDWebImage/UIImage+MultiFormat.m | 161 --- .../SDWebImage/SDWebImage/UIView+WebCache.h | 82 -- .../SDWebImage/SDWebImage/UIView+WebCache.m | 200 --- .../SDWebImage/UIView+WebCacheOperation.m | 68 - 156 files changed, 2715 insertions(+), 4792 deletions(-) delete mode 100644 DKCarousel/Podfile delete mode 100644 DKCarousel/Podfile.lock delete mode 100644 DKCarousel/Pods/Manifest.lock delete mode 100644 DKCarousel/Pods/Pods.xcodeproj/project.pbxproj delete mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m delete mode 100644 DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap rename {DKCarousel/DKCarousel.xcodeproj => DKCarouselView/DKCarouselView.xcodeproj}/project.pbxproj (82%) rename {DKCarousel/DKCarousel.xcodeproj => DKCarouselView/DKCarouselView.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) rename {DKCarousel/DKCarousel.xcodeproj => DKCarouselView/DKCarouselView.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 DKCarouselView/DKCarouselView.xcodeproj/xcshareddata/xcschemes/DKCarouselView.xcscheme rename {DKCarousel/DKCarousel.xcworkspace => DKCarouselView/DKCarouselView.xcworkspace}/contents.xcworkspacedata (54%) rename {DKCarousel/DKCarousel.xcworkspace => DKCarouselView/DKCarouselView.xcworkspace}/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {DKCarousel/DKCarousel => DKCarouselView/DKCarouselView}/DKCarousel.h (100%) rename {DKCarousel => DKCarouselView}/DKCarouselView/DKCarouselView.h (100%) rename {DKCarousel => DKCarouselView}/DKCarouselView/DKCarouselView.m (100%) rename {DKCarousel/DKCarousel => DKCarouselView/DKCarouselView}/Info.plist (100%) create mode 100644 DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/AppDelegate.h (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/AppDelegate.m (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/Base.lproj/LaunchScreen.xib (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/Base.lproj/Main.storyboard (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/Contents.json (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/photo_default_0.png (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/Info.plist (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/ViewController.h (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/ViewController.m (97%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemo/main.m (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemoTests/DKCarouselViewDemoTests.m (100%) rename {DKCarouselViewDemo => DKCarouselView/DKCarouselViewDemo}/DKCarouselViewDemoTests/Info.plist (100%) create mode 100644 DKCarouselView/Podfile create mode 100644 DKCarouselView/Podfile.lock rename {DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage => DKCarouselView/Pods/DKCarouselView}/LICENSE (96%) create mode 100644 DKCarouselView/Pods/DKCarouselView/README.md rename {DKCarousel => DKCarouselView}/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h (100%) rename {DKCarousel => DKCarouselView}/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m (100%) rename {DKCarousel => DKCarouselView}/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h (100%) rename {DKCarousel => DKCarouselView}/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m (100%) rename {DKCarousel => DKCarouselView}/Pods/FLAnimatedImage/LICENSE (100%) rename {DKCarousel => DKCarouselView}/Pods/FLAnimatedImage/README.md (100%) create mode 100644 DKCarouselView/Pods/Local Podspecs/DKCarouselView.podspec.json create mode 100644 DKCarouselView/Pods/Manifest.lock create mode 100644 DKCarouselView/Pods/Pods.xcodeproj/project.pbxproj rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/LICENSE (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/README.md (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDImageCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDImageCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageManager.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageManager.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+GIF.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+GIF.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIView+WebCache.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIView+WebCache.m (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h (100%) rename {DKCarousel => DKCarouselView}/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/FLAnimatedImage/Info.plist (100%) rename {DKCarousel/Pods/Target Support Files/Pods-DKCarousel => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView}/Info.plist (100%) rename DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-acknowledgements.markdown (100%) rename DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-acknowledgements.plist (100%) create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-dummy.m rename DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-resources.sh (100%) rename DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-umbrella.h (59%) rename DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.debug.xcconfig (100%) create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.modulemap rename DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig => DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.release.xcconfig (100%) create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Info.plist create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.markdown create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.plist create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-dummy.m create mode 100755 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-frameworks.sh create mode 100755 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-resources.sh create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-umbrella.h create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.debug.xcconfig create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.modulemap create mode 100644 DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.release.xcconfig rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/SDWebImage/Info.plist (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap (100%) rename {DKCarousel => DKCarouselView}/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig (100%) delete mode 100644 DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj delete mode 100644 DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/DKCarouselViewDemo.xcscheme delete mode 100644 DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h delete mode 100755 DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m delete mode 100644 DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h delete mode 100755 DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m delete mode 100644 DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/README.md delete mode 100644 DKCarouselViewDemo/SDWebImage/.DS_Store delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.h delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.m delete mode 100755 DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.h delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.h delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.m delete mode 100644 DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.m diff --git a/DKCarousel/Podfile b/DKCarousel/Podfile deleted file mode 100644 index 2cb0831..0000000 --- a/DKCarousel/Podfile +++ /dev/null @@ -1,7 +0,0 @@ -platform :ios, '10.0' - -target 'DKCarousel' do - use_frameworks! - - pod 'SDWebImage/GIF', '~> 4.4.6' -end diff --git a/DKCarousel/Podfile.lock b/DKCarousel/Podfile.lock deleted file mode 100644 index fb76916..0000000 --- a/DKCarousel/Podfile.lock +++ /dev/null @@ -1,22 +0,0 @@ -PODS: - - FLAnimatedImage (1.0.12) - - SDWebImage/Core (4.4.6) - - SDWebImage/GIF (4.4.6): - - FLAnimatedImage (~> 1.0) - - SDWebImage/Core - -DEPENDENCIES: - - SDWebImage/GIF (~> 4.4.6) - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - FLAnimatedImage - - SDWebImage - -SPEC CHECKSUMS: - FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 - SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8 - -PODFILE CHECKSUM: 9ffa18d50389a68e01dcafffe4901cf8ed7bfbfc - -COCOAPODS: 1.5.3 diff --git a/DKCarousel/Pods/Manifest.lock b/DKCarousel/Pods/Manifest.lock deleted file mode 100644 index fb76916..0000000 --- a/DKCarousel/Pods/Manifest.lock +++ /dev/null @@ -1,22 +0,0 @@ -PODS: - - FLAnimatedImage (1.0.12) - - SDWebImage/Core (4.4.6) - - SDWebImage/GIF (4.4.6): - - FLAnimatedImage (~> 1.0) - - SDWebImage/Core - -DEPENDENCIES: - - SDWebImage/GIF (~> 4.4.6) - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - FLAnimatedImage - - SDWebImage - -SPEC CHECKSUMS: - FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 - SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8 - -PODFILE CHECKSUM: 9ffa18d50389a68e01dcafffe4901cf8ed7bfbfc - -COCOAPODS: 1.5.3 diff --git a/DKCarousel/Pods/Pods.xcodeproj/project.pbxproj b/DKCarousel/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 8dfaaed..0000000 --- a/DKCarousel/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1078 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 00BF318007F3FDE4503CFEC6E6B2E801 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 4231531A9137F4E79E78BB2C2C76898A /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 01694DCABA19FDA7C6DD921AE868963D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 371B238ADFC370BC40FD190FD5870536 /* UIView+WebCache.m */; }; - 0B0EDBF59FA39518C1CC02008B1F84ED /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = AE85BDDE5F734A2AE28C4A6130D92547 /* SDWebImagePrefetcher.m */; }; - 0B941CA235E004C81CD56E890A7A8171 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 409464D2B2B4EFA2622321607A6F5DA8 /* SDWebImageDownloaderOperation.m */; }; - 12595EF47FC1C733100BC2C0B88C9093 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F29FC38F6A36312246531CD851FA59A /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1FBFB43EC7DA59FB18CDBA03408AB86E /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D599E1002F580DF9738F7FC6CE4F5885 /* FLAnimatedImageView.m */; }; - 2E288437A6F67FD4FF8215C987E54F88 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4153D1BE7FCB88E74F62BE3556D33C42 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 346BE6511A6E1868CAA684B80785D8F9 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 9374B87CB47A98A05B607DD8B111B6B0 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37683685A8F221EF5AEBF5E1FC11528A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; - 40FFA995F90ADA0185C698A957719D35 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 05DABF84567A3F4B1A54A850BB7A7A0E /* FLAnimatedImageView+WebCache.m */; }; - 4317EE9D0C8B3FBF99538A0B8F08AA1D /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 08F2F73420BB03711A9455FF322DB239 /* SDWebImage-dummy.m */; }; - 488A11D9DEF80B0E1532D703A55879A0 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B13079EB7D56F3081F4F1EBF76B29700 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4CB4D92809B2AA5F1456CB4DF7E8BD05 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C515DD4C015DD03CF907F7109E0AE379 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F4431724A6BE7921E909B76B30622AD /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 544A231727ED681481C3308656285A40 /* SDAnimatedImageRep.m */; }; - 5102533DDA86BE8A790574ACE7726ADD /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0299C4447BBCFCFD1EEF516F6E0C51 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 52AD8BCF52689C95FEEAF2968B6EABCA /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 59CBAAA5DCCE9CD1C2E2A31EC4ADBA21 /* NSButton+WebCache.m */; }; - 58368E2EACFD57926C10CAB844D42079 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C5D7D0D29CEBDF3629A43287BEAD7EF8 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 599408CC9A5C972DAA581163B5CCD474 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C80C7169485C78A8FB3774B6C3011A66 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5A25550CE5C78941F415582C30570F1E /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = BBC4C3DE2D01959CBD2C3C2AED3192C0 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5DF3480D9AEF5BF93EF11586B8D0CCF2 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EF1487F1FA034DC88C85EC4E2588656 /* FLAnimatedImage.m */; }; - 5F8FCC2A45C88021CC5AD07AFA61393E /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 94BE1B4027CED8E1A96D01DE4E34190B /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 608ABF2A50DB814CD4053DFCD3612294 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 671984BE5CBC2FC15120C58F765C3BF7 /* SDWebImageCompat.m */; }; - 60C3A6815BF3333C0B1864C92494FD5B /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 37E7087EB455FD0BE6EC709E394E3843 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 60DA3E7437BCD83DFCAE883D2B6AD01C /* Pods-DKCarousel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A07E691D79AA3CA8A53BFEC1402C053E /* Pods-DKCarousel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6108DC38584D05DDBF0F414EF2F96332 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8172349406BF607864DCA508A0C2CD81 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 65BB7B9FAC4B30DE8F2D145C49DB0A64 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */; }; - 680598B16E9326432052824B043EDE70 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B154A47491EE184BBD622216D9667D63 /* SDWebImageCoder.m */; }; - 68067E1C56B32A872D4032DCDE402648 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC9A6170571E46E470C31C3F81972F6 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6ABBC58BC116248D3CCB700B7F5517EC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */; }; - 6F3AB91C5C8DAFC1414AE74D29B05284 /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D330C3455B2AA45353146EBADC7B3D /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 75181D45237495C4546863D55B20F423 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 03BCD4F7412D29C790D875518EB9BDB0 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 767378DDDC904F25183FF796033C41B8 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E3CCF92515ED79162F7669787ACF37D /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7FF0EA413B8290ECC767EAFD5F2246C4 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0362B729AD32373CE39059538D257466 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 839E45F1E5351F89ED6E55B7944C324E /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F8349097D9A5679FC40FAE1FC68658EA /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 85C82D82ED8E0DB1FA47F2EF548F5EE6 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 457CA61DEBD817929AFDB1551DFE02E2 /* UIImageView+HighlightedWebCache.m */; }; - 895EBCDB3CA408FE058207AABA69F469 /* FLAnimatedImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */; }; - 8B399633E4730A9DB94007B451B472DB /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DD5F836DA6E634D9F5FE666C9F8E2A9A /* FLAnimatedImage-dummy.m */; }; - 917B055DED8553A042FFB8270AF6ECD7 /* FLAnimatedImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 41F1E15197F35D063D69CE9F8F3CED2E /* FLAnimatedImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 927DFB5AE39B748421280C2DB0A7E691 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; - 979358C6AB3E7B079FA0911D8A6DF935 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E07F455A6B1BA1FC716A7B4A43FE3377 /* SDImageCache.m */; }; - 985BAAD0E3A2E8F6DAB14861D7BCF563 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = B2A9C76F159ED9103E688088E58420F6 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 988BEAF9FCFD9005783CFC20E346DEDA /* Pods-DKCarousel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 53619EBE68F92C93A4EEBEDF664AB584 /* Pods-DKCarousel-dummy.m */; }; - 9FA89DD2AC8FF13040B62C92663CD03E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; - A017BB3F34B335A09931AF5DB6D7A0B4 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 773555182E21D8A3679C7C90E1EF3563 /* UIView+WebCacheOperation.m */; }; - A2EEDC55A2ADD551065D93ED1D383209 /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 58D4057F422BE99BCCF1EE0D9CDDD9E6 /* SDWebImageFrame.m */; }; - A36DBDC77CBFE146D24B895983A87D23 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F22EE02A6DB47765BF2A823EA615D4BA /* NSImage+WebCache.m */; }; - A6F325C78AFD5E791D0EFE5AE158619B /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = FEE00317BE36521F1867804BAAB8A63C /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A9BCDA06A9BDDCE320C3473945142669 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 090A869784A3882A851A3C12A79E408F /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADCB25DC5E0441F1C6083A0FFDA58C05 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = EA39C992BBCA42674FE200F05756DC3A /* SDImageCacheConfig.m */; }; - AEA088F547F7127B8444535947E41266 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 20C15A9443A34949E898C18CB82A62B1 /* UIImageView+WebCache.m */; }; - AF6046114A754E87B8B73F6B29F2300B /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 62D03A2FF95D2EA892A264D0797A9F5A /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B1B886593479D51C41D68CE92E573165 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AA6C66FEA57DFA256BD74C2B34528A30 /* SDWebImageManager.m */; }; - B4685B0685F92653D65D0711422588B9 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */; }; - B9A7B3D46ED64E027200D8F4BED1DB47 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B2BDCD5C7C9EE08EDFB4A0D02CD9DED /* SDWebImageCoderHelper.m */; }; - B9A9297D4E466BC7A26561D489CCCB18 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = ED02DC4347DC467E2C93818DAF343B1C /* UIImage+ForceDecode.m */; }; - BA9D44A4F8505B811FD1BEF2353F34FF /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F7B369FFCECB5FFC6236792625985B3 /* SDWebImageTransition.m */; }; - BCB4449748E8412BDD41B224F623E2F8 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FC3DD24F2A1B822F96A8826F674A9BE /* SDWebImageDownloader.m */; }; - BFE1C3249FECD36570D6886F3758F439 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 905B702AEF7D6C52AB581D823172944A /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C21177D72EA8AAC9539B0354FF31D507 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */; }; - C387AED040D8F26D154E009E2B5D5B3F /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 920952FCA400C8B538F77E60A5AE6DB0 /* SDWebImageImageIOCoder.m */; }; - C59DB52176A6F9AAB659A35317CB5063 /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 23BF51CF91104CA0B747171BEB3FA674 /* SDWebImageGIFCoder.m */; }; - C80F8E2DB0D91A307A9D3E00314E9B7C /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A221F26E740E35F1E0D363A6F8174C0 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CADFAC55CB1A7D7610EEB90885F7B819 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D26AC1F8E21C1B23BE805CD4C1F616E5 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CB1AECF2685F098CC6909D2DD1E4EDB3 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E542B3187E6DE1B0FB002029D6CB710 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D549BF6578C94E97F71A11AFB030FC28 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F4B987EE891198285C5A0B8B611DB92 /* SDWebImageCodersManager.m */; }; - D627C609086BE54E816CD890D088EF1F /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 90ADD45194ED509B2A5B344949B1327C /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D7E6480375C2331805C4A26BF974C634 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D44BF7B4354373018A4C0402645D0D /* UIImage+MultiFormat.m */; }; - DB65D31C5E1593210A6E37984CC6E631 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */; }; - E0EC5605A5759836E76694734CF8ADC3 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = C65D4968684ABF36D18C281BB3D43F42 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA4F6C84A1B56BB82CE64DB663C6C3D9 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 308AD6A1D6A227339B722EFE3D53DCDB /* UIImage+MemoryCacheCost.m */; }; - F397EC1A46A485148C625D6FA7FB48EC /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7BFBE8559B59D91856B14439A87C62 /* UIButton+WebCache.m */; }; - F5D4C755FE134BEE4A75259FAD6FB4F7 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = AB89D3C579D0CD39F4E06F4805D7C5E3 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F8535EACB0181489EA345B730B0D5700 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = C87E9B431210720964D06632F9BAC5D0 /* NSData+ImageContentType.m */; }; - F8FA1D3BDAF9B51135B4D06EADCE2512 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EEF994C89F18E41A3421A46F6FD0696 /* UIImage+GIF.m */; }; - F983D42E75EE2A3C377938A2C601351B /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BDE467BECA3E353E924DC4462C03A87C /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FE95088D0F3289DFF3A6CC9810A3190C /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 07F8A486A30DEA9143A7BA38AB5E815E /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - A28112AA74905695BE5C135878CD0179 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; - remoteInfo = FLAnimatedImage; - }; - D5555B4336EB0478D8F982DF77E982A8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; - remoteInfo = FLAnimatedImage; - }; - DFDB804C521FB0E7B735F5A44C2BFA21 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = FDACDAA5A280970DEB90D48EFF8F3CE4; - remoteInfo = SDWebImage; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 0362B729AD32373CE39059538D257466 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = ""; }; - 03BCD4F7412D29C790D875518EB9BDB0 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; - 05DABF84567A3F4B1A54A850BB7A7A0E /* FLAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FLAnimatedImageView+WebCache.m"; path = "SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m"; sourceTree = ""; }; - 07F8A486A30DEA9143A7BA38AB5E815E /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; - 08F2F73420BB03711A9455FF322DB239 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - 090A869784A3882A851A3C12A79E408F /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; - 134249D719D81F64E7B58ADD6308FE68 /* FLAnimatedImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FLAnimatedImage.framework; path = FLAnimatedImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 16AEB5580179917F06830AA96141A76A /* Pods-DKCarousel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarousel.release.xcconfig"; sourceTree = ""; }; - 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 1E8D97F07DB5C3CD4D129AC82B8C67F0 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; - 20C15A9443A34949E898C18CB82A62B1 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; - 23BF51CF91104CA0B747171BEB3FA674 /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = ""; }; - 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 2A221F26E740E35F1E0D363A6F8174C0 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = ""; }; - 2D055FC7D9743DFB69367C3C69E37C8B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2E3CCF92515ED79162F7669787ACF37D /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; - 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; - 2EF1487F1FA034DC88C85EC4E2588656 /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = FLAnimatedImage/FLAnimatedImage.m; sourceTree = ""; }; - 2F7B369FFCECB5FFC6236792625985B3 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = ""; }; - 308AD6A1D6A227339B722EFE3D53DCDB /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; - 34D44BF7B4354373018A4C0402645D0D /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; - 371B238ADFC370BC40FD190FD5870536 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; - 37E7087EB455FD0BE6EC709E394E3843 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; - 3B0299C4447BBCFCFD1EEF516F6E0C51 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = ""; }; - 407D61E55487DF7879D4517B07430646 /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; - 409464D2B2B4EFA2622321607A6F5DA8 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 40B991E2AFD43CC265D73AFA788CED97 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 4153D1BE7FCB88E74F62BE3556D33C42 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; - 41F1E15197F35D063D69CE9F8F3CED2E /* FLAnimatedImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-umbrella.h"; sourceTree = ""; }; - 4231531A9137F4E79E78BB2C2C76898A /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; - 457CA61DEBD817929AFDB1551DFE02E2 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 50E48431B8800CECB8187F64DEE14AA1 /* Pods-DKCarousel-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-DKCarousel-acknowledgements.plist"; sourceTree = ""; }; - 53619EBE68F92C93A4EEBEDF664AB584 /* Pods-DKCarousel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-DKCarousel-dummy.m"; sourceTree = ""; }; - 544A231727ED681481C3308656285A40 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = ""; }; - 55758D04877F6AF242496736E30F2CA3 /* Pods-DKCarousel-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-DKCarousel-acknowledgements.markdown"; sourceTree = ""; }; - 58543F2AE0107973ABF307F099BAE243 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 58D4057F422BE99BCCF1EE0D9CDDD9E6 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = ""; }; - 59CBAAA5DCCE9CD1C2E2A31EC4ADBA21 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = ""; }; - 5B2BDCD5C7C9EE08EDFB4A0D02CD9DED /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; - 5CF87D2050EDC9D97CDB653AD3CEFA8F /* Pods-DKCarousel-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-DKCarousel-resources.sh"; sourceTree = ""; }; - 5F29FC38F6A36312246531CD851FA59A /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = FLAnimatedImage/FLAnimatedImageView.h; sourceTree = ""; }; - 62D03A2FF95D2EA892A264D0797A9F5A /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = ""; }; - 667E22D82B0714C0153726872D0EDC75 /* FLAnimatedImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FLAnimatedImage.modulemap; sourceTree = ""; }; - 671984BE5CBC2FC15120C58F765C3BF7 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; - 6FC3DD24F2A1B822F96A8826F674A9BE /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; - 773555182E21D8A3679C7C90E1EF3563 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 7CC9A6170571E46E470C31C3F81972F6 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; - 7E542B3187E6DE1B0FB002029D6CB710 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - 7F4B987EE891198285C5A0B8B611DB92 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = ""; }; - 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 8172349406BF607864DCA508A0C2CD81 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 82CFD8E7BE9A7A34D69E6F2DADFC0FCB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8EEF994C89F18E41A3421A46F6FD0696 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; - 905B702AEF7D6C52AB581D823172944A /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; - 90ADD45194ED509B2A5B344949B1327C /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; - 90D99221153313D696DAE515B1743122 /* Pods_DKCarousel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_DKCarousel.framework; path = "Pods-DKCarousel.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 920952FCA400C8B538F77E60A5AE6DB0 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = ""; }; - 9374B87CB47A98A05B607DD8B111B6B0 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 94BE1B4027CED8E1A96D01DE4E34190B /* FLAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FLAnimatedImageView+WebCache.h"; path = "SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h"; sourceTree = ""; }; - A07E691D79AA3CA8A53BFEC1402C053E /* Pods-DKCarousel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-DKCarousel-umbrella.h"; sourceTree = ""; }; - A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FLAnimatedImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AA6C66FEA57DFA256BD74C2B34528A30 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; - AB89D3C579D0CD39F4E06F4805D7C5E3 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; - AE85BDDE5F734A2AE28C4A6130D92547 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; - AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; - B13079EB7D56F3081F4F1EBF76B29700 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; - B154A47491EE184BBD622216D9667D63 /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = ""; }; - B2A9C76F159ED9103E688088E58420F6 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; - BBC4C3DE2D01959CBD2C3C2AED3192C0 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; - BDE467BECA3E353E924DC4462C03A87C /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; - C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - C515DD4C015DD03CF907F7109E0AE379 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; - C5D7D0D29CEBDF3629A43287BEAD7EF8 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; - C65D4968684ABF36D18C281BB3D43F42 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = ""; }; - C80C7169485C78A8FB3774B6C3011A66 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; - C87E9B431210720964D06632F9BAC5D0 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; - C9D330C3455B2AA45353146EBADC7B3D /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = ""; }; - CA7BFBE8559B59D91856B14439A87C62 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; - D26AC1F8E21C1B23BE805CD4C1F616E5 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; - D599E1002F580DF9738F7FC6CE4F5885 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = FLAnimatedImage/FLAnimatedImageView.m; sourceTree = ""; }; - DD5F836DA6E634D9F5FE666C9F8E2A9A /* FLAnimatedImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImage-dummy.m"; sourceTree = ""; }; - E07F455A6B1BA1FC716A7B4A43FE3377 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; - E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FLAnimatedImage.xcconfig; sourceTree = ""; }; - EA39C992BBCA42674FE200F05756DC3A /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; - ED02DC4347DC467E2C93818DAF343B1C /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = ""; }; - F0CB75D04B39C940232FAE1695C00D93 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F22EE02A6DB47765BF2A823EA615D4BA /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; - F266CFB241C8F84152F4C18CA5E9C0A2 /* Pods-DKCarousel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarousel.debug.xcconfig"; sourceTree = ""; }; - F8349097D9A5679FC40FAE1FC68658EA /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = ""; }; - FC58BBCA470D1BD56CA08BB74258875A /* Pods-DKCarousel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-DKCarousel.modulemap"; sourceTree = ""; }; - FEE00317BE36521F1867804BAAB8A63C /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = FLAnimatedImage/FLAnimatedImage.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - B65FC58BCB37CC2E7BDA74ABE175C140 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 895EBCDB3CA408FE058207AABA69F469 /* FLAnimatedImage.framework in Frameworks */, - 927DFB5AE39B748421280C2DB0A7E691 /* Foundation.framework in Frameworks */, - B4685B0685F92653D65D0711422588B9 /* ImageIO.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E3E8AABE9277C746E87843CF848268D6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6ABBC58BC116248D3CCB700B7F5517EC /* CoreGraphics.framework in Frameworks */, - 37683685A8F221EF5AEBF5E1FC11528A /* Foundation.framework in Frameworks */, - 65BB7B9FAC4B30DE8F2D145C49DB0A64 /* ImageIO.framework in Frameworks */, - DB65D31C5E1593210A6E37984CC6E631 /* MobileCoreServices.framework in Frameworks */, - C21177D72EA8AAC9539B0354FF31D507 /* QuartzCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E7FC25EC16625ED9CC67405659ECEDB6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FA89DD2AC8FF13040B62C92663CD03E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 228564F9635395E16BF9C2000D47B257 /* Products */ = { - isa = PBXGroup; - children = ( - 134249D719D81F64E7B58ADD6308FE68 /* FLAnimatedImage.framework */, - 90D99221153313D696DAE515B1743122 /* Pods_DKCarousel.framework */, - F0CB75D04B39C940232FAE1695C00D93 /* SDWebImage.framework */, - ); - name = Products; - sourceTree = ""; - }; - 2BC98F924C9DD4EAE6E190C639F3512A /* Core */ = { - isa = PBXGroup; - children = ( - C515DD4C015DD03CF907F7109E0AE379 /* NSButton+WebCache.h */, - 59CBAAA5DCCE9CD1C2E2A31EC4ADBA21 /* NSButton+WebCache.m */, - 37E7087EB455FD0BE6EC709E394E3843 /* NSData+ImageContentType.h */, - C87E9B431210720964D06632F9BAC5D0 /* NSData+ImageContentType.m */, - 90ADD45194ED509B2A5B344949B1327C /* NSImage+WebCache.h */, - F22EE02A6DB47765BF2A823EA615D4BA /* NSImage+WebCache.m */, - 2A221F26E740E35F1E0D363A6F8174C0 /* SDAnimatedImageRep.h */, - 544A231727ED681481C3308656285A40 /* SDAnimatedImageRep.m */, - 07F8A486A30DEA9143A7BA38AB5E815E /* SDImageCache.h */, - E07F455A6B1BA1FC716A7B4A43FE3377 /* SDImageCache.m */, - AB89D3C579D0CD39F4E06F4805D7C5E3 /* SDImageCacheConfig.h */, - EA39C992BBCA42674FE200F05756DC3A /* SDImageCacheConfig.m */, - F8349097D9A5679FC40FAE1FC68658EA /* SDWebImageCoder.h */, - B154A47491EE184BBD622216D9667D63 /* SDWebImageCoder.m */, - BBC4C3DE2D01959CBD2C3C2AED3192C0 /* SDWebImageCoderHelper.h */, - 5B2BDCD5C7C9EE08EDFB4A0D02CD9DED /* SDWebImageCoderHelper.m */, - 0362B729AD32373CE39059538D257466 /* SDWebImageCodersManager.h */, - 7F4B987EE891198285C5A0B8B611DB92 /* SDWebImageCodersManager.m */, - 4231531A9137F4E79E78BB2C2C76898A /* SDWebImageCompat.h */, - 671984BE5CBC2FC15120C58F765C3BF7 /* SDWebImageCompat.m */, - 4153D1BE7FCB88E74F62BE3556D33C42 /* SDWebImageDownloader.h */, - 6FC3DD24F2A1B822F96A8826F674A9BE /* SDWebImageDownloader.m */, - 7E542B3187E6DE1B0FB002029D6CB710 /* SDWebImageDownloaderOperation.h */, - 409464D2B2B4EFA2622321607A6F5DA8 /* SDWebImageDownloaderOperation.m */, - 62D03A2FF95D2EA892A264D0797A9F5A /* SDWebImageFrame.h */, - 58D4057F422BE99BCCF1EE0D9CDDD9E6 /* SDWebImageFrame.m */, - 3B0299C4447BBCFCFD1EEF516F6E0C51 /* SDWebImageGIFCoder.h */, - 23BF51CF91104CA0B747171BEB3FA674 /* SDWebImageGIFCoder.m */, - C9D330C3455B2AA45353146EBADC7B3D /* SDWebImageImageIOCoder.h */, - 920952FCA400C8B538F77E60A5AE6DB0 /* SDWebImageImageIOCoder.m */, - BDE467BECA3E353E924DC4462C03A87C /* SDWebImageManager.h */, - AA6C66FEA57DFA256BD74C2B34528A30 /* SDWebImageManager.m */, - 7CC9A6170571E46E470C31C3F81972F6 /* SDWebImageOperation.h */, - 03BCD4F7412D29C790D875518EB9BDB0 /* SDWebImagePrefetcher.h */, - AE85BDDE5F734A2AE28C4A6130D92547 /* SDWebImagePrefetcher.m */, - 9374B87CB47A98A05B607DD8B111B6B0 /* SDWebImageTransition.h */, - 2F7B369FFCECB5FFC6236792625985B3 /* SDWebImageTransition.m */, - 905B702AEF7D6C52AB581D823172944A /* UIButton+WebCache.h */, - CA7BFBE8559B59D91856B14439A87C62 /* UIButton+WebCache.m */, - C65D4968684ABF36D18C281BB3D43F42 /* UIImage+ForceDecode.h */, - ED02DC4347DC467E2C93818DAF343B1C /* UIImage+ForceDecode.m */, - B2A9C76F159ED9103E688088E58420F6 /* UIImage+GIF.h */, - 8EEF994C89F18E41A3421A46F6FD0696 /* UIImage+GIF.m */, - 2E3CCF92515ED79162F7669787ACF37D /* UIImage+MemoryCacheCost.h */, - 308AD6A1D6A227339B722EFE3D53DCDB /* UIImage+MemoryCacheCost.m */, - 090A869784A3882A851A3C12A79E408F /* UIImage+MultiFormat.h */, - 34D44BF7B4354373018A4C0402645D0D /* UIImage+MultiFormat.m */, - 8172349406BF607864DCA508A0C2CD81 /* UIImageView+HighlightedWebCache.h */, - 457CA61DEBD817929AFDB1551DFE02E2 /* UIImageView+HighlightedWebCache.m */, - C80C7169485C78A8FB3774B6C3011A66 /* UIImageView+WebCache.h */, - 20C15A9443A34949E898C18CB82A62B1 /* UIImageView+WebCache.m */, - D26AC1F8E21C1B23BE805CD4C1F616E5 /* UIView+WebCache.h */, - 371B238ADFC370BC40FD190FD5870536 /* UIView+WebCache.m */, - B13079EB7D56F3081F4F1EBF76B29700 /* UIView+WebCacheOperation.h */, - 773555182E21D8A3679C7C90E1EF3563 /* UIView+WebCacheOperation.m */, - ); - name = Core; - sourceTree = ""; - }; - 4A45998E6329B695CE49FEE17FA4455E /* iOS */ = { - isa = PBXGroup; - children = ( - 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */, - 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */, - C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */, - AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */, - 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */, - ); - name = iOS; - sourceTree = ""; - }; - 53F2E7074946C3D4042EA7FF1FCC34C5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */, - 4A45998E6329B695CE49FEE17FA4455E /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - 731CF02C49A3D1852FA89710E5E9AF0D /* Support Files */ = { - isa = PBXGroup; - children = ( - 667E22D82B0714C0153726872D0EDC75 /* FLAnimatedImage.modulemap */, - E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */, - DD5F836DA6E634D9F5FE666C9F8E2A9A /* FLAnimatedImage-dummy.m */, - 407D61E55487DF7879D4517B07430646 /* FLAnimatedImage-prefix.pch */, - 41F1E15197F35D063D69CE9F8F3CED2E /* FLAnimatedImage-umbrella.h */, - 2D055FC7D9743DFB69367C3C69E37C8B /* Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/FLAnimatedImage"; - sourceTree = ""; - }; - 7DB346D0F39D3F0E887471402A8071AB = { - isa = PBXGroup; - children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 53F2E7074946C3D4042EA7FF1FCC34C5 /* Frameworks */, - 83A775CC6468D2E99CE0107CA02D076C /* Pods */, - 228564F9635395E16BF9C2000D47B257 /* Products */, - 7E0FBE6377098D444A8E1F89428B5B19 /* Targets Support Files */, - ); - sourceTree = ""; - }; - 7E0FBE6377098D444A8E1F89428B5B19 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - F6AFBA8AF3C1BC2D02BF5F08EE6B5883 /* Pods-DKCarousel */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 83A775CC6468D2E99CE0107CA02D076C /* Pods */ = { - isa = PBXGroup; - children = ( - 90BD147E9543DA6D2770A6D6CFA6A8CD /* FLAnimatedImage */, - F33AF4030906C8597A44E730B5B59C56 /* SDWebImage */, - ); - name = Pods; - sourceTree = ""; - }; - 90BD147E9543DA6D2770A6D6CFA6A8CD /* FLAnimatedImage */ = { - isa = PBXGroup; - children = ( - FEE00317BE36521F1867804BAAB8A63C /* FLAnimatedImage.h */, - 2EF1487F1FA034DC88C85EC4E2588656 /* FLAnimatedImage.m */, - 5F29FC38F6A36312246531CD851FA59A /* FLAnimatedImageView.h */, - D599E1002F580DF9738F7FC6CE4F5885 /* FLAnimatedImageView.m */, - 731CF02C49A3D1852FA89710E5E9AF0D /* Support Files */, - ); - name = FLAnimatedImage; - path = FLAnimatedImage; - sourceTree = ""; - }; - F33AF4030906C8597A44E730B5B59C56 /* SDWebImage */ = { - isa = PBXGroup; - children = ( - 2BC98F924C9DD4EAE6E190C639F3512A /* Core */, - FB64E2111E105AB2BB3A5C42ED205C10 /* GIF */, - F8539DEE76243EA00F78F01297530D4E /* Support Files */, - ); - name = SDWebImage; - path = SDWebImage; - sourceTree = ""; - }; - F6AFBA8AF3C1BC2D02BF5F08EE6B5883 /* Pods-DKCarousel */ = { - isa = PBXGroup; - children = ( - 58543F2AE0107973ABF307F099BAE243 /* Info.plist */, - FC58BBCA470D1BD56CA08BB74258875A /* Pods-DKCarousel.modulemap */, - 55758D04877F6AF242496736E30F2CA3 /* Pods-DKCarousel-acknowledgements.markdown */, - 50E48431B8800CECB8187F64DEE14AA1 /* Pods-DKCarousel-acknowledgements.plist */, - 53619EBE68F92C93A4EEBEDF664AB584 /* Pods-DKCarousel-dummy.m */, - 5CF87D2050EDC9D97CDB653AD3CEFA8F /* Pods-DKCarousel-resources.sh */, - A07E691D79AA3CA8A53BFEC1402C053E /* Pods-DKCarousel-umbrella.h */, - F266CFB241C8F84152F4C18CA5E9C0A2 /* Pods-DKCarousel.debug.xcconfig */, - 16AEB5580179917F06830AA96141A76A /* Pods-DKCarousel.release.xcconfig */, - ); - name = "Pods-DKCarousel"; - path = "Target Support Files/Pods-DKCarousel"; - sourceTree = ""; - }; - F8539DEE76243EA00F78F01297530D4E /* Support Files */ = { - isa = PBXGroup; - children = ( - 82CFD8E7BE9A7A34D69E6F2DADFC0FCB /* Info.plist */, - 1E8D97F07DB5C3CD4D129AC82B8C67F0 /* SDWebImage.modulemap */, - 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */, - 08F2F73420BB03711A9455FF322DB239 /* SDWebImage-dummy.m */, - 40B991E2AFD43CC265D73AFA788CED97 /* SDWebImage-prefix.pch */, - C5D7D0D29CEBDF3629A43287BEAD7EF8 /* SDWebImage-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/SDWebImage"; - sourceTree = ""; - }; - FB64E2111E105AB2BB3A5C42ED205C10 /* GIF */ = { - isa = PBXGroup; - children = ( - 94BE1B4027CED8E1A96D01DE4E34190B /* FLAnimatedImageView+WebCache.h */, - 05DABF84567A3F4B1A54A850BB7A7A0E /* FLAnimatedImageView+WebCache.m */, - ); - name = GIF; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - AE4A388285280643929986BBD32FF3FC /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 60DA3E7437BCD83DFCAE883D2B6AD01C /* Pods-DKCarousel-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA45B052E5F343E83C5AB425CA5E1475 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 5F8FCC2A45C88021CC5AD07AFA61393E /* FLAnimatedImageView+WebCache.h in Headers */, - 4CB4D92809B2AA5F1456CB4DF7E8BD05 /* NSButton+WebCache.h in Headers */, - 60C3A6815BF3333C0B1864C92494FD5B /* NSData+ImageContentType.h in Headers */, - D627C609086BE54E816CD890D088EF1F /* NSImage+WebCache.h in Headers */, - C80F8E2DB0D91A307A9D3E00314E9B7C /* SDAnimatedImageRep.h in Headers */, - FE95088D0F3289DFF3A6CC9810A3190C /* SDImageCache.h in Headers */, - F5D4C755FE134BEE4A75259FAD6FB4F7 /* SDImageCacheConfig.h in Headers */, - 58368E2EACFD57926C10CAB844D42079 /* SDWebImage-umbrella.h in Headers */, - 839E45F1E5351F89ED6E55B7944C324E /* SDWebImageCoder.h in Headers */, - 5A25550CE5C78941F415582C30570F1E /* SDWebImageCoderHelper.h in Headers */, - 7FF0EA413B8290ECC767EAFD5F2246C4 /* SDWebImageCodersManager.h in Headers */, - 00BF318007F3FDE4503CFEC6E6B2E801 /* SDWebImageCompat.h in Headers */, - 2E288437A6F67FD4FF8215C987E54F88 /* SDWebImageDownloader.h in Headers */, - CB1AECF2685F098CC6909D2DD1E4EDB3 /* SDWebImageDownloaderOperation.h in Headers */, - AF6046114A754E87B8B73F6B29F2300B /* SDWebImageFrame.h in Headers */, - 5102533DDA86BE8A790574ACE7726ADD /* SDWebImageGIFCoder.h in Headers */, - 6F3AB91C5C8DAFC1414AE74D29B05284 /* SDWebImageImageIOCoder.h in Headers */, - F983D42E75EE2A3C377938A2C601351B /* SDWebImageManager.h in Headers */, - 68067E1C56B32A872D4032DCDE402648 /* SDWebImageOperation.h in Headers */, - 75181D45237495C4546863D55B20F423 /* SDWebImagePrefetcher.h in Headers */, - 346BE6511A6E1868CAA684B80785D8F9 /* SDWebImageTransition.h in Headers */, - BFE1C3249FECD36570D6886F3758F439 /* UIButton+WebCache.h in Headers */, - E0EC5605A5759836E76694734CF8ADC3 /* UIImage+ForceDecode.h in Headers */, - 985BAAD0E3A2E8F6DAB14861D7BCF563 /* UIImage+GIF.h in Headers */, - 767378DDDC904F25183FF796033C41B8 /* UIImage+MemoryCacheCost.h in Headers */, - A9BCDA06A9BDDCE320C3473945142669 /* UIImage+MultiFormat.h in Headers */, - 6108DC38584D05DDBF0F414EF2F96332 /* UIImageView+HighlightedWebCache.h in Headers */, - 599408CC9A5C972DAA581163B5CCD474 /* UIImageView+WebCache.h in Headers */, - CADFAC55CB1A7D7610EEB90885F7B819 /* UIView+WebCache.h in Headers */, - 488A11D9DEF80B0E1532D703A55879A0 /* UIView+WebCacheOperation.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F88CF70F4B003F3D138F3C8B26BA08B6 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 917B055DED8553A042FFB8270AF6ECD7 /* FLAnimatedImage-umbrella.h in Headers */, - A6F325C78AFD5E791D0EFE5AE158619B /* FLAnimatedImage.h in Headers */, - 12595EF47FC1C733100BC2C0B88C9093 /* FLAnimatedImageView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 01FB2A7EB38E581715F8A49DEDB51A26 /* Pods-DKCarousel */ = { - isa = PBXNativeTarget; - buildConfigurationList = 44011EE3382DC7E009BB11E3B9A96219 /* Build configuration list for PBXNativeTarget "Pods-DKCarousel" */; - buildPhases = ( - AE4A388285280643929986BBD32FF3FC /* Headers */, - E7F983F5D76DCDD4C7DD116674916661 /* Sources */, - E7FC25EC16625ED9CC67405659ECEDB6 /* Frameworks */, - F5C3DA06FE23185A4C97F0127FA53474 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 2F81E815D12B38E059763934F60EEF55 /* PBXTargetDependency */, - A934CB6C91FFF8FD44CCFF9C283C461B /* PBXTargetDependency */, - ); - name = "Pods-DKCarousel"; - productName = "Pods-DKCarousel"; - productReference = 90D99221153313D696DAE515B1743122 /* Pods_DKCarousel.framework */; - productType = "com.apple.product-type.framework"; - }; - 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = E8D6D562BB609396B62E386B9203F207 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */; - buildPhases = ( - F88CF70F4B003F3D138F3C8B26BA08B6 /* Headers */, - B462C08BC2B9EBB5DD37366BDB220EB2 /* Sources */, - E3E8AABE9277C746E87843CF848268D6 /* Frameworks */, - 83192590C22D6F86D62DB7E00D6473B4 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FLAnimatedImage; - productName = FLAnimatedImage; - productReference = 134249D719D81F64E7B58ADD6308FE68 /* FLAnimatedImage.framework */; - productType = "com.apple.product-type.framework"; - }; - FDACDAA5A280970DEB90D48EFF8F3CE4 /* SDWebImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5BD073F9B20C95685CEB2F39DB688E72 /* Build configuration list for PBXNativeTarget "SDWebImage" */; - buildPhases = ( - EA45B052E5F343E83C5AB425CA5E1475 /* Headers */, - 702615D4BF3E6D1CD06DEBD6AA03FBA8 /* Sources */, - B65FC58BCB37CC2E7BDA74ABE175C140 /* Frameworks */, - 646E79583F5DC980B936986D7C5ABD65 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4E3EC88C6DC78A69D1D61465173B3206 /* PBXTargetDependency */, - ); - name = SDWebImage; - productName = SDWebImage; - productReference = F0CB75D04B39C940232FAE1695C00D93 /* SDWebImage.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0930; - LastUpgradeCheck = 0930; - }; - buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 228564F9635395E16BF9C2000D47B257 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */, - 01FB2A7EB38E581715F8A49DEDB51A26 /* Pods-DKCarousel */, - FDACDAA5A280970DEB90D48EFF8F3CE4 /* SDWebImage */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 646E79583F5DC980B936986D7C5ABD65 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 83192590C22D6F86D62DB7E00D6473B4 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F5C3DA06FE23185A4C97F0127FA53474 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 702615D4BF3E6D1CD06DEBD6AA03FBA8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 40FFA995F90ADA0185C698A957719D35 /* FLAnimatedImageView+WebCache.m in Sources */, - 52AD8BCF52689C95FEEAF2968B6EABCA /* NSButton+WebCache.m in Sources */, - F8535EACB0181489EA345B730B0D5700 /* NSData+ImageContentType.m in Sources */, - A36DBDC77CBFE146D24B895983A87D23 /* NSImage+WebCache.m in Sources */, - 4F4431724A6BE7921E909B76B30622AD /* SDAnimatedImageRep.m in Sources */, - 979358C6AB3E7B079FA0911D8A6DF935 /* SDImageCache.m in Sources */, - ADCB25DC5E0441F1C6083A0FFDA58C05 /* SDImageCacheConfig.m in Sources */, - 4317EE9D0C8B3FBF99538A0B8F08AA1D /* SDWebImage-dummy.m in Sources */, - 680598B16E9326432052824B043EDE70 /* SDWebImageCoder.m in Sources */, - B9A7B3D46ED64E027200D8F4BED1DB47 /* SDWebImageCoderHelper.m in Sources */, - D549BF6578C94E97F71A11AFB030FC28 /* SDWebImageCodersManager.m in Sources */, - 608ABF2A50DB814CD4053DFCD3612294 /* SDWebImageCompat.m in Sources */, - BCB4449748E8412BDD41B224F623E2F8 /* SDWebImageDownloader.m in Sources */, - 0B941CA235E004C81CD56E890A7A8171 /* SDWebImageDownloaderOperation.m in Sources */, - A2EEDC55A2ADD551065D93ED1D383209 /* SDWebImageFrame.m in Sources */, - C59DB52176A6F9AAB659A35317CB5063 /* SDWebImageGIFCoder.m in Sources */, - C387AED040D8F26D154E009E2B5D5B3F /* SDWebImageImageIOCoder.m in Sources */, - B1B886593479D51C41D68CE92E573165 /* SDWebImageManager.m in Sources */, - 0B0EDBF59FA39518C1CC02008B1F84ED /* SDWebImagePrefetcher.m in Sources */, - BA9D44A4F8505B811FD1BEF2353F34FF /* SDWebImageTransition.m in Sources */, - F397EC1A46A485148C625D6FA7FB48EC /* UIButton+WebCache.m in Sources */, - B9A9297D4E466BC7A26561D489CCCB18 /* UIImage+ForceDecode.m in Sources */, - F8FA1D3BDAF9B51135B4D06EADCE2512 /* UIImage+GIF.m in Sources */, - EA4F6C84A1B56BB82CE64DB663C6C3D9 /* UIImage+MemoryCacheCost.m in Sources */, - D7E6480375C2331805C4A26BF974C634 /* UIImage+MultiFormat.m in Sources */, - 85C82D82ED8E0DB1FA47F2EF548F5EE6 /* UIImageView+HighlightedWebCache.m in Sources */, - AEA088F547F7127B8444535947E41266 /* UIImageView+WebCache.m in Sources */, - 01694DCABA19FDA7C6DD921AE868963D /* UIView+WebCache.m in Sources */, - A017BB3F34B335A09931AF5DB6D7A0B4 /* UIView+WebCacheOperation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B462C08BC2B9EBB5DD37366BDB220EB2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8B399633E4730A9DB94007B451B472DB /* FLAnimatedImage-dummy.m in Sources */, - 5DF3480D9AEF5BF93EF11586B8D0CCF2 /* FLAnimatedImage.m in Sources */, - 1FBFB43EC7DA59FB18CDBA03408AB86E /* FLAnimatedImageView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E7F983F5D76DCDD4C7DD116674916661 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 988BEAF9FCFD9005783CFC20E346DEDA /* Pods-DKCarousel-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 2F81E815D12B38E059763934F60EEF55 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FLAnimatedImage; - target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; - targetProxy = D5555B4336EB0478D8F982DF77E982A8 /* PBXContainerItemProxy */; - }; - 4E3EC88C6DC78A69D1D61465173B3206 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FLAnimatedImage; - target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; - targetProxy = A28112AA74905695BE5C135878CD0179 /* PBXContainerItemProxy */; - }; - A934CB6C91FFF8FD44CCFF9C283C461B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = FDACDAA5A280970DEB90D48EFF8F3CE4 /* SDWebImage */; - targetProxy = DFDB804C521FB0E7B735F5A44C2BFA21 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 04C9EF523A8424E548450DD3386A6878 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 6F3E26A41B304A061BD9CBB706CD4FF7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FLAnimatedImage/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap"; - PRODUCT_MODULE_NAME = FLAnimatedImage; - PRODUCT_NAME = FLAnimatedImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 8DDFA5FA8D4131BFD96E5E26F3672644 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - B786DD3F087DCFD4FB65A6F5A4ABB75C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F266CFB241C8F84152F4C18CA5E9C0A2 /* Pods-DKCarousel.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-DKCarousel/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - BAC6BF0742FF41F5E14D36666616C21F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2E42DB4A409A56FD84EDF350527CD360 /* SDWebImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - CC596AE083F27CF33C8D676970ABED96 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 16AEB5580179917F06830AA96141A76A /* Pods-DKCarousel.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-DKCarousel/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - D5F759C82752B2EB010DB3CD3D69707C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - F871B6326C8F63EA427875B0840AAD42 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E8D5409087CBAC928BA0EFAD3D750856 /* FLAnimatedImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FLAnimatedImage/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap"; - PRODUCT_MODULE_NAME = FLAnimatedImage; - PRODUCT_NAME = FLAnimatedImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8DDFA5FA8D4131BFD96E5E26F3672644 /* Debug */, - D5F759C82752B2EB010DB3CD3D69707C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 44011EE3382DC7E009BB11E3B9A96219 /* Build configuration list for PBXNativeTarget "Pods-DKCarousel" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B786DD3F087DCFD4FB65A6F5A4ABB75C /* Debug */, - CC596AE083F27CF33C8D676970ABED96 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5BD073F9B20C95685CEB2F39DB688E72 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BAC6BF0742FF41F5E14D36666616C21F /* Debug */, - 04C9EF523A8424E548450DD3386A6878 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E8D6D562BB609396B62E386B9203F207 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F871B6326C8F63EA427875B0840AAD42 /* Debug */, - 6F3E26A41B304A061BD9CBB706CD4FF7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; -} diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m deleted file mode 100644 index 724fd01..0000000 --- a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_DKCarousel : NSObject -@end -@implementation PodsDummy_Pods_DKCarousel -@end diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap b/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap deleted file mode 100644 index 6beff9a..0000000 --- a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_DKCarousel { - umbrella header "Pods-DKCarousel-umbrella.h" - - export * - module * { export * } -} diff --git a/DKCarouselView.podspec b/DKCarouselView.podspec index ae631fd..97e39e3 100644 --- a/DKCarouselView.podspec +++ b/DKCarouselView.podspec @@ -1,14 +1,14 @@ Pod::Spec.new do |s| s.name = "DKCarouselView" - s.version = "1.5" + s.version = "1.4.12" s.summary = "DKCarouselView is a automatically & circular infinite(or not) scrolling view.The view auto paging/pause can be specified as well. Support also GIFs" s.homepage = "https://github.com/zhangao0086/DKCarouselView" s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "Bannings" => "zhangao0086@gmail.com" } - s.platform = :ios, "7.0" - s.source = { :git => "https://github.com/zhangao0086/DKCarouselView.git", - :tag => s.version.to_s } - s.source_files = "DKCarousel/DKCarouselView/*.{h,m}" + s.platform = :ios, "9.0" + s.source = { :git => "https://github.com/CRoig/DKCarouselView.git", + :branch => "develop" } + s.source_files = "DKCarouselView/DKCarouselView/DKCarouselView/*.{h,m}" s.frameworks = "Foundation", "UIKit" s.requires_arc = true s.dependency "SDWebImage/GIF", '~> 4.1' diff --git a/DKCarousel/DKCarousel.xcodeproj/project.pbxproj b/DKCarouselView/DKCarouselView.xcodeproj/project.pbxproj similarity index 82% rename from DKCarousel/DKCarousel.xcodeproj/project.pbxproj rename to DKCarouselView/DKCarouselView.xcodeproj/project.pbxproj index 343f41b..b32b157 100644 --- a/DKCarousel/DKCarousel.xcodeproj/project.pbxproj +++ b/DKCarouselView/DKCarouselView.xcodeproj/project.pbxproj @@ -7,21 +7,21 @@ objects = { /* Begin PBXBuildFile section */ + C1DD1FC564E95B70D90B6862 /* Pods_DKCarouselView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58C23AD9C2887D2CFF1CC378 /* Pods_DKCarouselView.framework */; }; D3379755224E5CD800FECA2C /* DKCarousel.h in Headers */ = {isa = PBXBuildFile; fileRef = D3379753224E5CD800FECA2C /* DKCarousel.h */; settings = {ATTRIBUTES = (Public, ); }; }; D3379762224E5D0700FECA2C /* DKCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = D337975C224E5D0700FECA2C /* DKCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; }; D3379763224E5D0700FECA2C /* DKCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3379761224E5D0700FECA2C /* DKCarouselView.m */; }; - FA81D53C02A5AA1E494B8181 /* Pods_DKCarousel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E43D9031CEB4F7602ECC92D9 /* Pods_DKCarousel.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 5DE2A3C3BA628E7F48AB2F3E /* Pods-DKCarousel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarousel.release.xcconfig"; path = "Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig"; sourceTree = ""; }; - D3379750224E5CD800FECA2C /* DKCarousel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DKCarousel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 19BBA7CEEC1540B8B5859BD2 /* Pods-DKCarouselView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarouselView.release.xcconfig"; path = "Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.release.xcconfig"; sourceTree = ""; }; + 58C23AD9C2887D2CFF1CC378 /* Pods_DKCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DKCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8046EC481C84FFE3DB977E68 /* Pods-DKCarouselView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarouselView.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.debug.xcconfig"; sourceTree = ""; }; + D3379750224E5CD800FECA2C /* DKCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DKCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D3379753224E5CD800FECA2C /* DKCarousel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DKCarousel.h; sourceTree = ""; }; D3379754224E5CD800FECA2C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D337975C224E5D0700FECA2C /* DKCarouselView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKCarouselView.h; sourceTree = ""; }; D3379761224E5D0700FECA2C /* DKCarouselView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKCarouselView.m; sourceTree = ""; }; - E43D9031CEB4F7602ECC92D9 /* Pods_DKCarousel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DKCarousel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F24E7895BE32CF0D478F6B34 /* Pods-DKCarousel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarousel.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -29,18 +29,18 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FA81D53C02A5AA1E494B8181 /* Pods_DKCarousel.framework in Frameworks */, + C1DD1FC564E95B70D90B6862 /* Pods_DKCarouselView.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 59CF3ADD6889341DB6CA468C /* Pods */ = { + C233D762D1BC5EB333164F55 /* Pods */ = { isa = PBXGroup; children = ( - F24E7895BE32CF0D478F6B34 /* Pods-DKCarousel.debug.xcconfig */, - 5DE2A3C3BA628E7F48AB2F3E /* Pods-DKCarousel.release.xcconfig */, + 8046EC481C84FFE3DB977E68 /* Pods-DKCarouselView.debug.xcconfig */, + 19BBA7CEEC1540B8B5859BD2 /* Pods-DKCarouselView.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -48,34 +48,26 @@ D3379746224E5CD800FECA2C = { isa = PBXGroup; children = ( - D3379752224E5CD800FECA2C /* DKCarousel */, D337975B224E5D0700FECA2C /* DKCarouselView */, D3379751224E5CD800FECA2C /* Products */, - 59CF3ADD6889341DB6CA468C /* Pods */, DE995186006EE044F8482CB3 /* Frameworks */, + C233D762D1BC5EB333164F55 /* Pods */, ); sourceTree = ""; }; D3379751224E5CD800FECA2C /* Products */ = { isa = PBXGroup; children = ( - D3379750224E5CD800FECA2C /* DKCarousel.framework */, + D3379750224E5CD800FECA2C /* DKCarouselView.framework */, ); name = Products; sourceTree = ""; }; - D3379752224E5CD800FECA2C /* DKCarousel */ = { + D337975B224E5D0700FECA2C /* DKCarouselView */ = { isa = PBXGroup; children = ( D3379753224E5CD800FECA2C /* DKCarousel.h */, D3379754224E5CD800FECA2C /* Info.plist */, - ); - path = DKCarousel; - sourceTree = ""; - }; - D337975B224E5D0700FECA2C /* DKCarouselView */ = { - isa = PBXGroup; - children = ( D337975C224E5D0700FECA2C /* DKCarouselView.h */, D3379761224E5D0700FECA2C /* DKCarouselView.m */, ); @@ -85,7 +77,7 @@ DE995186006EE044F8482CB3 /* Frameworks */ = { isa = PBXGroup; children = ( - E43D9031CEB4F7602ECC92D9 /* Pods_DKCarousel.framework */, + 58C23AD9C2887D2CFF1CC378 /* Pods_DKCarouselView.framework */, ); name = Frameworks; sourceTree = ""; @@ -105,9 +97,9 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - D337974F224E5CD800FECA2C /* DKCarousel */ = { + D337974F224E5CD800FECA2C /* DKCarouselView */ = { isa = PBXNativeTarget; - buildConfigurationList = D3379758224E5CD800FECA2C /* Build configuration list for PBXNativeTarget "DKCarousel" */; + buildConfigurationList = D3379758224E5CD800FECA2C /* Build configuration list for PBXNativeTarget "DKCarouselView" */; buildPhases = ( 204F6BBB6484E608995B25E4 /* [CP] Check Pods Manifest.lock */, D337974B224E5CD800FECA2C /* Headers */, @@ -119,9 +111,9 @@ ); dependencies = ( ); - name = DKCarousel; + name = DKCarouselView; productName = DKCarousel; - productReference = D3379750224E5CD800FECA2C /* DKCarousel.framework */; + productReference = D3379750224E5CD800FECA2C /* DKCarouselView.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -137,7 +129,7 @@ }; }; }; - buildConfigurationList = D337974A224E5CD800FECA2C /* Build configuration list for PBXProject "DKCarousel" */; + buildConfigurationList = D337974A224E5CD800FECA2C /* Build configuration list for PBXProject "DKCarouselView" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; @@ -149,7 +141,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - D337974F224E5CD800FECA2C /* DKCarousel */, + D337974F224E5CD800FECA2C /* DKCarouselView */, ); }; /* End PBXProject section */ @@ -180,7 +172,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-DKCarousel-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-DKCarouselView-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -253,7 +245,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; + INFOPLIST_FILE = DKCarouselView/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -311,7 +304,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; + INFOPLIST_FILE = DKCarouselView/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -325,7 +319,7 @@ }; D3379759224E5CD800FECA2C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F24E7895BE32CF0D478F6B34 /* Pods-DKCarousel.debug.xcconfig */; + baseConfigurationReference = 8046EC481C84FFE3DB977E68 /* Pods-DKCarouselView.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; @@ -333,7 +327,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = DKCarousel/Info.plist; + INFOPLIST_FILE = DKCarouselView/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -350,7 +344,7 @@ }; D337975A224E5CD800FECA2C /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5DE2A3C3BA628E7F48AB2F3E /* Pods-DKCarousel.release.xcconfig */; + baseConfigurationReference = 19BBA7CEEC1540B8B5859BD2 /* Pods-DKCarouselView.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; @@ -358,7 +352,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = DKCarousel/Info.plist; + INFOPLIST_FILE = DKCarouselView/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -376,7 +370,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - D337974A224E5CD800FECA2C /* Build configuration list for PBXProject "DKCarousel" */ = { + D337974A224E5CD800FECA2C /* Build configuration list for PBXProject "DKCarouselView" */ = { isa = XCConfigurationList; buildConfigurations = ( D3379756224E5CD800FECA2C /* Debug */, @@ -385,7 +379,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D3379758224E5CD800FECA2C /* Build configuration list for PBXNativeTarget "DKCarousel" */ = { + D3379758224E5CD800FECA2C /* Build configuration list for PBXNativeTarget "DKCarouselView" */ = { isa = XCConfigurationList; buildConfigurations = ( D3379759224E5CD800FECA2C /* Debug */, diff --git a/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DKCarouselView/DKCarouselView.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to DKCarouselView/DKCarouselView.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DKCarouselView/DKCarouselView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from DKCarousel/DKCarousel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to DKCarouselView/DKCarouselView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/DKCarouselView/DKCarouselView.xcodeproj/xcshareddata/xcschemes/DKCarouselView.xcscheme b/DKCarouselView/DKCarouselView.xcodeproj/xcshareddata/xcschemes/DKCarouselView.xcscheme new file mode 100644 index 0000000..1009b13 --- /dev/null +++ b/DKCarouselView/DKCarouselView.xcodeproj/xcshareddata/xcschemes/DKCarouselView.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata b/DKCarouselView/DKCarouselView.xcworkspace/contents.xcworkspacedata similarity index 54% rename from DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata rename to DKCarouselView/DKCarouselView.xcworkspace/contents.xcworkspacedata index 6cc7385..9a215db 100644 --- a/DKCarousel/DKCarousel.xcworkspace/contents.xcworkspacedata +++ b/DKCarouselView/DKCarouselView.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,10 @@ + location = "group:DKCarouselView.xcodeproj"> + + diff --git a/DKCarousel/DKCarousel.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DKCarouselView/DKCarouselView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from DKCarousel/DKCarousel.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to DKCarouselView/DKCarouselView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/DKCarousel/DKCarousel/DKCarousel.h b/DKCarouselView/DKCarouselView/DKCarousel.h similarity index 100% rename from DKCarousel/DKCarousel/DKCarousel.h rename to DKCarouselView/DKCarouselView/DKCarousel.h diff --git a/DKCarousel/DKCarouselView/DKCarouselView.h b/DKCarouselView/DKCarouselView/DKCarouselView.h similarity index 100% rename from DKCarousel/DKCarouselView/DKCarouselView.h rename to DKCarouselView/DKCarouselView/DKCarouselView.h diff --git a/DKCarousel/DKCarouselView/DKCarouselView.m b/DKCarouselView/DKCarouselView/DKCarouselView.m similarity index 100% rename from DKCarousel/DKCarouselView/DKCarouselView.m rename to DKCarouselView/DKCarouselView/DKCarouselView.m diff --git a/DKCarousel/DKCarousel/Info.plist b/DKCarouselView/DKCarouselView/Info.plist similarity index 100% rename from DKCarousel/DKCarousel/Info.plist rename to DKCarouselView/DKCarouselView/Info.plist diff --git a/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1d4597e --- /dev/null +++ b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj @@ -0,0 +1,537 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2D2F25A43D4B2711650C46E8 /* Pods_DKCarouselViewDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D91FA904EB50FF90B5D5D87 /* Pods_DKCarouselViewDemo.framework */; }; + 9C1EE03E1A13A6AF00BC502F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE03D1A13A6AF00BC502F /* main.m */; }; + 9C1EE0411A13A6AF00BC502F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0401A13A6AF00BC502F /* AppDelegate.m */; }; + 9C1EE0441A13A6AF00BC502F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0431A13A6AF00BC502F /* ViewController.m */; }; + 9C1EE0471A13A6AF00BC502F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C1EE0451A13A6AF00BC502F /* Main.storyboard */; }; + 9C1EE0491A13A6AF00BC502F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9C1EE0481A13A6AF00BC502F /* Images.xcassets */; }; + 9C1EE04C1A13A6AF00BC502F /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9C1EE04A1A13A6AF00BC502F /* LaunchScreen.xib */; }; + 9C1EE0581A13A6AF00BC502F /* DKCarouselViewDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0571A13A6AF00BC502F /* DKCarouselViewDemoTests.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 9C1EE0521A13A6AF00BC502F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9C1EE0301A13A6AF00BC502F /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9C1EE0371A13A6AF00BC502F; + remoteInfo = DKCarouselViewDemo; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1D91FA904EB50FF90B5D5D87 /* Pods_DKCarouselViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DKCarouselViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5EED0FD833D2CC43BF1B6093 /* Pods-DKCarouselViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarouselViewDemo.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.debug.xcconfig"; sourceTree = ""; }; + 9C1EE0381A13A6AF00BC502F /* DKCarouselViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DKCarouselViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9C1EE03C1A13A6AF00BC502F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9C1EE03D1A13A6AF00BC502F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 9C1EE03F1A13A6AF00BC502F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 9C1EE0401A13A6AF00BC502F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9C1EE0421A13A6AF00BC502F /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 9C1EE0431A13A6AF00BC502F /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 9C1EE0461A13A6AF00BC502F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 9C1EE0481A13A6AF00BC502F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 9C1EE04B1A13A6AF00BC502F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 9C1EE0511A13A6AF00BC502F /* DKCarouselViewDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DKCarouselViewDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 9C1EE0561A13A6AF00BC502F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9C1EE0571A13A6AF00BC502F /* DKCarouselViewDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DKCarouselViewDemoTests.m; sourceTree = ""; }; + F63DC2E560ADC2A8B3A7B0CE /* Pods-DKCarouselViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DKCarouselViewDemo.release.xcconfig"; path = "../Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9C1EE0351A13A6AF00BC502F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D2F25A43D4B2711650C46E8 /* Pods_DKCarouselViewDemo.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9C1EE04E1A13A6AF00BC502F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9C1EE02F1A13A6AF00BC502F = { + isa = PBXGroup; + children = ( + 9C1EE03A1A13A6AF00BC502F /* DKCarouselViewDemo */, + 9C1EE0541A13A6AF00BC502F /* DKCarouselViewDemoTests */, + 9C1EE0391A13A6AF00BC502F /* Products */, + E2E87F6F96D97EA874815F03 /* Pods */, + B2932884F4505FD80D2A23F9 /* Frameworks */, + ); + sourceTree = ""; + }; + 9C1EE0391A13A6AF00BC502F /* Products */ = { + isa = PBXGroup; + children = ( + 9C1EE0381A13A6AF00BC502F /* DKCarouselViewDemo.app */, + 9C1EE0511A13A6AF00BC502F /* DKCarouselViewDemoTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 9C1EE03A1A13A6AF00BC502F /* DKCarouselViewDemo */ = { + isa = PBXGroup; + children = ( + 9C1EE03F1A13A6AF00BC502F /* AppDelegate.h */, + 9C1EE0401A13A6AF00BC502F /* AppDelegate.m */, + 9C1EE0421A13A6AF00BC502F /* ViewController.h */, + 9C1EE0431A13A6AF00BC502F /* ViewController.m */, + 9C1EE0451A13A6AF00BC502F /* Main.storyboard */, + 9C1EE0481A13A6AF00BC502F /* Images.xcassets */, + 9C1EE04A1A13A6AF00BC502F /* LaunchScreen.xib */, + 9C1EE03B1A13A6AF00BC502F /* Supporting Files */, + ); + path = DKCarouselViewDemo; + sourceTree = ""; + }; + 9C1EE03B1A13A6AF00BC502F /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9C1EE03C1A13A6AF00BC502F /* Info.plist */, + 9C1EE03D1A13A6AF00BC502F /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 9C1EE0541A13A6AF00BC502F /* DKCarouselViewDemoTests */ = { + isa = PBXGroup; + children = ( + 9C1EE0571A13A6AF00BC502F /* DKCarouselViewDemoTests.m */, + 9C1EE0551A13A6AF00BC502F /* Supporting Files */, + ); + path = DKCarouselViewDemoTests; + sourceTree = ""; + }; + 9C1EE0551A13A6AF00BC502F /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9C1EE0561A13A6AF00BC502F /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + B2932884F4505FD80D2A23F9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1D91FA904EB50FF90B5D5D87 /* Pods_DKCarouselViewDemo.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E2E87F6F96D97EA874815F03 /* Pods */ = { + isa = PBXGroup; + children = ( + 5EED0FD833D2CC43BF1B6093 /* Pods-DKCarouselViewDemo.debug.xcconfig */, + F63DC2E560ADC2A8B3A7B0CE /* Pods-DKCarouselViewDemo.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 9C1EE0371A13A6AF00BC502F /* DKCarouselViewDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9C1EE05B1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemo" */; + buildPhases = ( + 45372AEE186AF00908500F1F /* [CP] Check Pods Manifest.lock */, + 9C1EE0341A13A6AF00BC502F /* Sources */, + 9C1EE0351A13A6AF00BC502F /* Frameworks */, + 9C1EE0361A13A6AF00BC502F /* Resources */, + 0C95CB66D6D63A7FC0FEDEAD /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DKCarouselViewDemo; + productName = DKCarouselViewDemo; + productReference = 9C1EE0381A13A6AF00BC502F /* DKCarouselViewDemo.app */; + productType = "com.apple.product-type.application"; + }; + 9C1EE0501A13A6AF00BC502F /* DKCarouselViewDemoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9C1EE05E1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemoTests" */; + buildPhases = ( + 9C1EE04D1A13A6AF00BC502F /* Sources */, + 9C1EE04E1A13A6AF00BC502F /* Frameworks */, + 9C1EE04F1A13A6AF00BC502F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 9C1EE0531A13A6AF00BC502F /* PBXTargetDependency */, + ); + name = DKCarouselViewDemoTests; + productName = DKCarouselViewDemoTests; + productReference = 9C1EE0511A13A6AF00BC502F /* DKCarouselViewDemoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9C1EE0301A13A6AF00BC502F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = zhangao; + TargetAttributes = { + 9C1EE0371A13A6AF00BC502F = { + CreatedOnToolsVersion = 6.1; + }; + 9C1EE0501A13A6AF00BC502F = { + CreatedOnToolsVersion = 6.1; + TestTargetID = 9C1EE0371A13A6AF00BC502F; + }; + }; + }; + buildConfigurationList = 9C1EE0331A13A6AF00BC502F /* Build configuration list for PBXProject "DKCarouselViewDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 9C1EE02F1A13A6AF00BC502F; + productRefGroup = 9C1EE0391A13A6AF00BC502F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9C1EE0371A13A6AF00BC502F /* DKCarouselViewDemo */, + 9C1EE0501A13A6AF00BC502F /* DKCarouselViewDemoTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 9C1EE0361A13A6AF00BC502F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9C1EE0471A13A6AF00BC502F /* Main.storyboard in Resources */, + 9C1EE04C1A13A6AF00BC502F /* LaunchScreen.xib in Resources */, + 9C1EE0491A13A6AF00BC502F /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9C1EE04F1A13A6AF00BC502F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0C95CB66D6D63A7FC0FEDEAD /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${SRCROOT}/../Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework", + "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + ); + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/../Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 45372AEE186AF00908500F1F /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-DKCarouselViewDemo-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 9C1EE0341A13A6AF00BC502F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9C1EE0441A13A6AF00BC502F /* ViewController.m in Sources */, + 9C1EE0411A13A6AF00BC502F /* AppDelegate.m in Sources */, + 9C1EE03E1A13A6AF00BC502F /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9C1EE04D1A13A6AF00BC502F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9C1EE0581A13A6AF00BC502F /* DKCarouselViewDemoTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 9C1EE0531A13A6AF00BC502F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9C1EE0371A13A6AF00BC502F /* DKCarouselViewDemo */; + targetProxy = 9C1EE0521A13A6AF00BC502F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 9C1EE0451A13A6AF00BC502F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 9C1EE0461A13A6AF00BC502F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 9C1EE04A1A13A6AF00BC502F /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 9C1EE04B1A13A6AF00BC502F /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 9C1EE0591A13A6AF00BC502F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 9C1EE05A1A13A6AF00BC502F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 9C1EE05C1A13A6AF00BC502F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5EED0FD833D2CC43BF1B6093 /* Pods-DKCarouselViewDemo.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = DKCarouselViewDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 9C1EE05D1A13A6AF00BC502F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F63DC2E560ADC2A8B3A7B0CE /* Pods-DKCarouselViewDemo.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = DKCarouselViewDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 9C1EE05F1A13A6AF00BC502F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = DKCarouselViewDemoTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DKCarouselViewDemo.app/DKCarouselViewDemo"; + }; + name = Debug; + }; + 9C1EE0601A13A6AF00BC502F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = DKCarouselViewDemoTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DKCarouselViewDemo.app/DKCarouselViewDemo"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9C1EE0331A13A6AF00BC502F /* Build configuration list for PBXProject "DKCarouselViewDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9C1EE0591A13A6AF00BC502F /* Debug */, + 9C1EE05A1A13A6AF00BC502F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9C1EE05B1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9C1EE05C1A13A6AF00BC502F /* Debug */, + 9C1EE05D1A13A6AF00BC502F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9C1EE05E1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9C1EE05F1A13A6AF00BC502F /* Debug */, + 9C1EE0601A13A6AF00BC502F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 9C1EE0301A13A6AF00BC502F /* Project object */; +} diff --git a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.h b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.h similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.h rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.h diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.m b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.m similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.m rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/AppDelegate.m diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/LaunchScreen.xib b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/LaunchScreen.xib similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/LaunchScreen.xib rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/LaunchScreen.xib diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/Main.storyboard b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/Main.storyboard similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/Main.storyboard rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Base.lproj/Main.storyboard diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/AppIcon.appiconset/Contents.json rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/Contents.json b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/Contents.json similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/Contents.json rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/Contents.json diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/photo_default_0.png b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/photo_default_0.png similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/photo_default_0.png rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Images.xcassets/DefaultImage.imageset/photo_default_0.png diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/Info.plist b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Info.plist similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/Info.plist rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/Info.plist diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.h b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.h similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/ViewController.h rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.h diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.m b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.m similarity index 97% rename from DKCarouselViewDemo/DKCarouselViewDemo/ViewController.m rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.m index 740a334..9596ce9 100644 --- a/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.m +++ b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/ViewController.m @@ -7,7 +7,7 @@ // #import "ViewController.h" -#import "DKCarouselView.h" +#import @interface ViewController () diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/main.m b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/main.m similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemo/main.m rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemo/main.m diff --git a/DKCarouselViewDemo/DKCarouselViewDemoTests/DKCarouselViewDemoTests.m b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemoTests/DKCarouselViewDemoTests.m similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemoTests/DKCarouselViewDemoTests.m rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemoTests/DKCarouselViewDemoTests.m diff --git a/DKCarouselViewDemo/DKCarouselViewDemoTests/Info.plist b/DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemoTests/Info.plist similarity index 100% rename from DKCarouselViewDemo/DKCarouselViewDemoTests/Info.plist rename to DKCarouselView/DKCarouselViewDemo/DKCarouselViewDemoTests/Info.plist diff --git a/DKCarouselView/Podfile b/DKCarouselView/Podfile new file mode 100644 index 0000000..f345599 --- /dev/null +++ b/DKCarouselView/Podfile @@ -0,0 +1,14 @@ +use_frameworks! +platform :ios, '9.0' + +workspace 'DKCarouselView' + +target 'DKCarouselView' do + project 'DKCarouselView.xcodeproj' + pod 'SDWebImage/GIF', '~> 4.4.6' +end + +target 'DKCarouselViewDemo' do + project 'DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj' + pod 'DKCarouselView', :git => 'https://github.com/CRoig/DKCarouselView', :branch => 'develop' +end diff --git a/DKCarouselView/Podfile.lock b/DKCarouselView/Podfile.lock new file mode 100644 index 0000000..65eeda6 --- /dev/null +++ b/DKCarouselView/Podfile.lock @@ -0,0 +1,36 @@ +PODS: + - DKCarouselView (1.4.12): + - SDWebImage/GIF (~> 4.1) + - FLAnimatedImage (1.0.12) + - SDWebImage/Core (4.4.6) + - SDWebImage/GIF (4.4.6): + - FLAnimatedImage (~> 1.0) + - SDWebImage/Core + +DEPENDENCIES: + - DKCarouselView (from `https://github.com/CRoig/DKCarouselView`, branch `develop`) + - SDWebImage/GIF (~> 4.4.6) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - FLAnimatedImage + - SDWebImage + +EXTERNAL SOURCES: + DKCarouselView: + :branch: develop + :git: https://github.com/CRoig/DKCarouselView + +CHECKOUT OPTIONS: + DKCarouselView: + :commit: 6132601d4ba317eff19b6aa4ca0b9488ba0d360c + :git: https://github.com/CRoig/DKCarouselView + +SPEC CHECKSUMS: + DKCarouselView: 1009b17b09a1c335cb8b6f810a3716a2c96a91fd + FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 + SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8 + +PODFILE CHECKSUM: da0c06f571e3931b94b7ce73cd068c9a9a201111 + +COCOAPODS: 1.5.3 diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/LICENSE b/DKCarouselView/Pods/DKCarouselView/LICENSE similarity index 96% rename from DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/LICENSE rename to DKCarouselView/Pods/DKCarouselView/LICENSE index 632653f..29967db 100644 --- a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/LICENSE +++ b/DKCarouselView/Pods/DKCarouselView/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2016 Flipboard +Copyright (c) 2014 Bannings Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/DKCarouselView/Pods/DKCarouselView/README.md b/DKCarouselView/Pods/DKCarouselView/README.md new file mode 100644 index 0000000..83f4009 --- /dev/null +++ b/DKCarouselView/Pods/DKCarouselView/README.md @@ -0,0 +1,131 @@ +# DKCarouselView +## infinite scrolling +![GIF](https://raw.githubusercontent.com/zhangao0086/DKCarouselView/master/preview.gif) + +## finite scrolling +![GIF](https://raw.githubusercontent.com/zhangao0086/DKCarouselView/master/preview3.gif) + +## custom view +![GIF](https://raw.githubusercontent.com/zhangao0086/DKCarouselView/master/preview4.gif) + +## adapting +![GIF](https://raw.githubusercontent.com/zhangao0086/DKCarouselView/master/preview2.gif) + +## Overview +DKCarouselView is a automatically & circular infinite(or not) scrolling view.The view auto paging/pause can be specified as well. Support also GIFs. + +## How To Get Started + +### Installation with CocoaPods + +``` bash +$ pod search DKCarouselView + +-> DKCarouselView (1.4.6) + A automatically & circular infinite scrolling view. + pod 'DKCarouselView', '~> 1.3.0' + - Homepage: https://github.com/zhangao0086/DKCarouselView + - Source: https://github.com/zhangao0086/DKCarouselView.git + - Versions: 1.0.1 [master repo] +``` + +Edit your Podfile and add DKCarouselView: + +``` bash +pod 'DKCarouselView', '~> x.x.x' +``` + +Add `#import "DKCarouselView.h"` to the top of classes that will use it. +##### Create instances (Also supports xib/storyboard) + +``` objective-c +DKCarouselView *carouselView = [[DKCarouselView alloc] initWithFrame:CGRectMake(0, 0, 320,220)]; +``` + +##### Setup items + +``` objective-c +NSArray *images = @[@"https://c1.staticflickr.com/9/8428/7855079606_5fc8852562_z.jpg", + @"http://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Parang_mountain_image_1.jpg/640px-Parang_mountain_image_1.jpg", + @"http://www.openjpeg.org/samples/Bretagne1.bmp", + @"http://blog.absolutvision.com/wp-content/uploads/2009/10/Gimp_2.6b.jpg", + @"http://tclhost.com/wptdglN.gif", + ]; +NSMutableArray *items = [NSMutableArray new]; +for (NSString *imageUrl in images) { + DKCarouselURLItem *urlAD = [DKCarouselURLItem new]; + urlAD.imageUrl = imageUrl; + + [items addObject:urlAD]; +} +[carouselView setItems:items]; +``` + +##### Auto paging for 5 seconds + +```objective-c +[carouselView setAutoPagingForInterval:5]; +``` + +##### Placeholder for online images + +```objective-c +carouselView.defaultImage = [UIImage imageNamed:@"DefaultImage"]; +``` + +##### Callback + +```objective-c +[self.carouselView setItemClickedBlock:^(DKCarouselItem *item, NSInteger index) { + NSLog(@"%zd",index); +}]; +``` + +```objective-c +[self.carouselView setItemPagedBlock:^(DKCarouselView *view, NSInteger index) { + NSLog(@"%@, %zd", view, index); +}]; +``` + +##### Finite or not + +```objective-c +// set infinite slide or not, defaults to NO. +@property (nonatomic, assign, getter = isFinite) BOOL finite; +``` + +##### Indicator style + +```objective-c +@property (nonatomic, strong) UIColor *indicatorTintColor; +@property (nonatomic, assign) CGPoint indicatorOffset; // default offset is CGPointZero, the indicator is centered horizontally. +@property (nonatomic, readonly) CGSize indicatorSize; // returns minimum size for given items. +``` + +##### DKCarouselURLItem Or DKCarouselViewItem + +```objective-c +/** + * Online Image + */ +@interface DKCarouselURLItem : DKCarouselItem + +@property (nonatomic, copy) NSString *imageUrl; + +@end + +/** + * Custom View + */ +@interface DKCarouselViewItem : DKCarouselItem + +@property (nonatomic, strong) UIView *view; + +@end +``` + +## License +This code is distributed under the terms and conditions of the MIT license + +## Special Thanks +jiyee \ No newline at end of file diff --git a/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h b/DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h similarity index 100% rename from DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h rename to DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h diff --git a/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m b/DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m similarity index 100% rename from DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m rename to DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m diff --git a/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h b/DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h similarity index 100% rename from DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h rename to DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h diff --git a/DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m b/DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m similarity index 100% rename from DKCarousel/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m rename to DKCarouselView/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m diff --git a/DKCarousel/Pods/FLAnimatedImage/LICENSE b/DKCarouselView/Pods/FLAnimatedImage/LICENSE similarity index 100% rename from DKCarousel/Pods/FLAnimatedImage/LICENSE rename to DKCarouselView/Pods/FLAnimatedImage/LICENSE diff --git a/DKCarousel/Pods/FLAnimatedImage/README.md b/DKCarouselView/Pods/FLAnimatedImage/README.md similarity index 100% rename from DKCarousel/Pods/FLAnimatedImage/README.md rename to DKCarouselView/Pods/FLAnimatedImage/README.md diff --git a/DKCarouselView/Pods/Local Podspecs/DKCarouselView.podspec.json b/DKCarouselView/Pods/Local Podspecs/DKCarouselView.podspec.json new file mode 100644 index 0000000..c7d5eb3 --- /dev/null +++ b/DKCarouselView/Pods/Local Podspecs/DKCarouselView.podspec.json @@ -0,0 +1,34 @@ +{ + "name": "DKCarouselView", + "version": "1.4.12", + "summary": "DKCarouselView is a automatically & circular infinite(or not) scrolling view.The view auto paging/pause can be specified as well. Support also GIFs", + "homepage": "https://github.com/zhangao0086/DKCarouselView", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "Bannings": "zhangao0086@gmail.com" + }, + "platforms": { + "ios": "9.0" + }, + "source": { + "git": "https://github.com/CRoig/DKCarouselView.git", + "branch": "develop" + }, + "source_files": "DKCarouselView/DKCarouselView/DKCarouselView/*.{h,m}", + "frameworks": [ + "Foundation", + "UIKit" + ], + "requires_arc": true, + "dependencies": { + "SDWebImage/GIF": [ + "~> 4.1" + ] + }, + "pod_target_xcconfig": { + "SWIFT_VERSION": "3.0" + } +} diff --git a/DKCarouselView/Pods/Manifest.lock b/DKCarouselView/Pods/Manifest.lock new file mode 100644 index 0000000..65eeda6 --- /dev/null +++ b/DKCarouselView/Pods/Manifest.lock @@ -0,0 +1,36 @@ +PODS: + - DKCarouselView (1.4.12): + - SDWebImage/GIF (~> 4.1) + - FLAnimatedImage (1.0.12) + - SDWebImage/Core (4.4.6) + - SDWebImage/GIF (4.4.6): + - FLAnimatedImage (~> 1.0) + - SDWebImage/Core + +DEPENDENCIES: + - DKCarouselView (from `https://github.com/CRoig/DKCarouselView`, branch `develop`) + - SDWebImage/GIF (~> 4.4.6) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - FLAnimatedImage + - SDWebImage + +EXTERNAL SOURCES: + DKCarouselView: + :branch: develop + :git: https://github.com/CRoig/DKCarouselView + +CHECKOUT OPTIONS: + DKCarouselView: + :commit: 6132601d4ba317eff19b6aa4ca0b9488ba0d360c + :git: https://github.com/CRoig/DKCarouselView + +SPEC CHECKSUMS: + DKCarouselView: 1009b17b09a1c335cb8b6f810a3716a2c96a91fd + FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 + SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8 + +PODFILE CHECKSUM: da0c06f571e3931b94b7ce73cd068c9a9a201111 + +COCOAPODS: 1.5.3 diff --git a/DKCarouselView/Pods/Pods.xcodeproj/project.pbxproj b/DKCarouselView/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5c29498 --- /dev/null +++ b/DKCarouselView/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1248 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 02554D054B57E3288BA964667CF3E370 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + 046CD7629DC68F2D169EA013FC3CBEB9 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3984D802F997B82C8838180A55FC5025 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09D0123563C863C40F5731D99B80E4A5 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FB14104CFE4D2168AF2F291981909F7 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09F03FF678019B99B3482E38202CDBC9 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C5DC7ABDC767C71B061DA3226AE6F2 /* SDImageCache.m */; }; + 0A551E471A7A5D18109984A8AEBB0488 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = BBCE66741CED572CF6DA2C1F16A97434 /* SDWebImageTransition.m */; }; + 0B8ACFAF49DB6CE4F65E7DDFD341B8D5 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E6CD2653E223771495CEBCF159769C50 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0BF6862CFEEB6770F424A79D9CF13E7F /* Pods-DKCarouselViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FAD1B8EDD1E35DB317E81287CA3C9AAF /* Pods-DKCarouselViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C6B53CE031A8A4232C907125D125555 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A53BE17D723463DC8D6805C51B990006 /* UIImage+GIF.m */; }; + 0D702FB019D392F05BA0BF4AA39AE960 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 08192D9444DBC2C63F9316BC18B5A9E4 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0F29AE452169BC071EC49BCB13B1CB01 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = AA12DB9536658FC8C539F59109FD5537 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 11A94D44EE82D1518C5245955F51D40D /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = B05A7BA198370A81324742217FB564CA /* SDWebImageDownloaderOperation.m */; }; + 12595EF47FC1C733100BC2C0B88C9093 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5D908EC2CF4264091B26B9DBC2F2D31 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14191C2764366B3CB02763B239E0E071 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E026ED8A9CADA1798F59F7031F1167FD /* SDWebImageManager.m */; }; + 183C4983E278074C75884959A04280EA /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F7C42A57E23A8B089BA70A1BD300AC0 /* SDAnimatedImageRep.m */; }; + 193BAEB85825FD2FE5DB5E1862E3E4EB /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = DF3A2B6118ECFAA0A07D836FD39169E4 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A907C8C9384B808FACA3F02C29BED3F /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 193B8FB8B8DF334D98FD963964BEB4A7 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D0617E37635BA8AD3B59788869AEEE3 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 7283D205A521BC5D2F0C1F6F146F458C /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F92E2516714B9ED24B9B0A60FF063A5 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4915AC8CF855B217D11DC320607D94F2 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FBFB43EC7DA59FB18CDBA03408AB86E /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 236B4FB639AB53D145F96FFE92B2ACFC /* FLAnimatedImageView.m */; }; + 2119917D07600C196268FADC888A08F7 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 309C1B503BDAC16F4CC7B2D62DD8D291 /* UIView+WebCacheOperation.m */; }; + 21BC2B4E024BAE6F33B5529B9AF5670C /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4487E4815A9CDD694D5CA96F5809D652 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 22B0402FE69A2A32AED96160023B60E4 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E2701CB2118EA35AC3FBB7FD4B0525 /* SDWebImageCoder.m */; }; + 23ABCD52A3944FD393D1F95476D04DAB /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 2912B1CD7019C46B19149B68E9A22DD7 /* UIImage+ForceDecode.m */; }; + 290AB0F7C48DA6CEF0E83695859BC124 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D63AEE54160201DF710E2E2ACFA8ED6C /* SDWebImageCodersManager.m */; }; + 2CC545A7A603EFDAFFC57C6E2554A008 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 96C69908204BC8B024E7CFE2F8890F87 /* UIView+WebCache.m */; }; + 3549EBDFDF0A444F629D58B2A6A2F727 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = FD37A9712EBB2F534B4826DA3A08461F /* SDWebImagePrefetcher.m */; }; + 355C27E067E4FC1E56F8CB86A7E0399F /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 90D13848603CB35024C013C581891DC0 /* SDWebImage-dummy.m */; }; + 36EFC0979F00E228CEC8BDAF2099F9D6 /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 38543E45061C0B5507AC02A4E3E9A242 /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37683685A8F221EF5AEBF5E1FC11528A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + 3770A46016293DF20348BFEA8942C00F /* FLAnimatedImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */; }; + 3BE3DE8C0C11560FF99F10B6CC190326 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 36DA0C05C256942B917B7B017999448D /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46F5153AB008B8A860DA447FB0730EA5 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 96C442611D6187612BB189A59BDD9F8F /* FLAnimatedImageView+WebCache.m */; }; + 4CFE9B633B11DC7FB150CD7C52805B18 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BFF52DF63580FB56F73298F56E0B08B6 /* UIButton+WebCache.m */; }; + 53D9BC2B24DEBFBCC251D714FDC9183D /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E18F6AD26949ADAF013CE6EF983A6F6 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 566A98B500DF2D9E57F0861B676E3A92 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8319A43E98A2E884650356DC6BB51D43 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5843BB5A1951AC1CE1FD19F5BFD0BA60 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FD75721F2C5D865398AA318322A8FB2 /* SDWebImageImageIOCoder.m */; }; + 5A3024E70AD71B758C1739951EA58142 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C441BB7E386F54D4C47A0D0F92F6D05 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5B79B271A5FE8F362D594E563D75FF07 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 33589591721CEA58761DCDD7082F16C8 /* NSData+ImageContentType.m */; }; + 5DF3480D9AEF5BF93EF11586B8D0CCF2 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 192A212023556B9C0AE8DCCDEE76A9BC /* FLAnimatedImage.m */; }; + 628A72E61E5F32C405036FD0BB62EE61 /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F46473C42BAFF7AE6791D50C3260951 /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 64AB44AD8A81EBA8F078D2F76AECCDDE /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B7ADCD27DE9C2181DB45E463D57978 /* UIImage+MemoryCacheCost.m */; }; + 65BB7B9FAC4B30DE8F2D145C49DB0A64 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */; }; + 6878533E52B3FFB5B004D4D8D1477E10 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + 69A3570A1E07AB797E9502D34B2603D6 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 286B033342C44F9AC48FA6312E6ADBB2 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6ABBC58BC116248D3CCB700B7F5517EC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */; }; + 7422444D3954DEAB153920B14EE0C93A /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = C4D24297A20ADE367829247A06EFB852 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 786DF793FFFDB169DEBA9F168A95E787 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */; }; + 798A8D3916B97ABDAC915DB03CABF0B7 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F02C0385DD1A17718DB773419CF1F3F9 /* NSButton+WebCache.m */; }; + 7CEA082E370B3AF974F7E9A41D637772 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = E01641B27F9E4151D86213FEE66CFA73 /* SDImageCacheConfig.m */; }; + 829BF9567EBCA1C971C4CAC821113977 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CF0AC04130C0D0F8950A2AA47CA00A6B /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 839745471F79E3A731EA3E8D2F376CCC /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A623C38A5E62EE3F3F7299CBC04FEF4B /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 872D53389BF29F93B43E2A4EF5732067 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 366002120A70BA79D523D9721456CB3F /* NSImage+WebCache.m */; }; + 87351703F7C0B44D5291A5DDFA66950F /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 29C76B319B024D8016AF9BFFBE466607 /* SDWebImageFrame.m */; }; + 8B399633E4730A9DB94007B451B472DB /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99275E42BF5CD3696CE33C5C5E6505 /* FLAnimatedImage-dummy.m */; }; + 917B055DED8553A042FFB8270AF6ECD7 /* FLAnimatedImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ADE01D6A07CF5BA67F2BBBCC9D1F182C /* FLAnimatedImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92BB3832F14D67215D5B5901AA6BF1C1 /* Pods-DKCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 56FD10491E623111531356840FB821B2 /* Pods-DKCarouselView-dummy.m */; }; + 97A7275FA65E2966CEE10175EDAD9679 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B53E918208B6AF327195A771AECF9E9 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9BA8B6F9C5521FB10EDD2EBBEC6C579E /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F7B8F1A903E6210544F4407F704A2503 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A2B6F17B7CF9C0C4171AFA49BC2DC703 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = FC8E49FEA29C80657DE0034375409640 /* SDWebImageDownloader.m */; }; + A4BC27AADD3A54A25905C7F8965FA5F0 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0D6C637629C54AF21936337A37C3E7 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6F325C78AFD5E791D0EFE5AE158619B /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = EFBA22E3F120F25952FF481A9819068D /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AB6489AD7884F56A8577373585B5264A /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7836161E5B38C4502924639B51FD81BC /* SDWebImageGIFCoder.m */; }; + AE5A525B69C36DA7A65B7EB2936A5F7F /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 23DAC468289E8335FF9663DF9E90D3C4 /* SDWebImageCompat.m */; }; + B0AD0C1A9D427FC8835D2A3162DFE7E7 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 9262AA4BD5B961734443E68C5A54FBEA /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B356D6FE092B27C221EB620D2ADA421E /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 83372DB5ECC77ED448DEFB96B62B60DA /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC4FE2B9065E8152154E74A9202B5EC8 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F6B5F832833A80F33C25A1C8D1E6FE /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C21177D72EA8AAC9539B0354FF31D507 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */; }; + C4760775EF7A80E5B22B46820BAFDD5E /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = F4A1C411326B82DB3FC3CBE776734D60 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C72331457258C871931EBCD6355F377C /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 628EE85850C5552F96919C5550B4BD67 /* SDWebImageCoderHelper.m */; }; + C895F90AC76E2420903827BB459CFEA3 /* Pods-DKCarouselViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B7AC908A5EA1E770B13C6E8E7C0895BF /* Pods-DKCarouselViewDemo-dummy.m */; }; + C9A26656D9E840E78D67DB42B30A03F6 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BBF6560CAB53882432BA63B9BFD38531 /* UIImageView+HighlightedWebCache.m */; }; + D044B8464D00570122225B86E43AB205 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C8AFC5F53E627FECD5751B3AB0B2F41 /* UIImage+MultiFormat.m */; }; + D2B9FD20A4D0679DB6CEC72BCF5ADA6F /* Pods-DKCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DA6C80792B2A9869A4081BAE001FB21 /* Pods-DKCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB65D31C5E1593210A6E37984CC6E631 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */; }; + DE0BFCDF6B281870616740A1594805BA /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B7BD189E4F3D31B8F4C965010B222A06 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E0E19A31E196F0978640AAA5B9B6CBD1 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = CAD1A66786704E614126661BBCFD7F57 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E852914E83E54FC4D6EB16ACE721BE4D /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C319AD7E54043A925A1E91AB72A74AC /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F21B782CDF65D59FB39B9CAA65C7C90D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */; }; + FACF14E2C3F2AA3F5CC3A8DC338D63C2 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6273B5112B99824EE0E6120E8C9777CB /* UIImageView+WebCache.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 5652353C9EAA9F91A1837CB969E5B535 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; + remoteInfo = FLAnimatedImage; + }; + B3A9C7C9078D9B901DD8743FC2D03E10 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; + remoteInfo = FLAnimatedImage; + }; + DB5C568CB62448AEFB666E6C5DF4B4A1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D7B7D274050D6277CAECA96F3CF6722; + remoteInfo = FLAnimatedImage; + }; + FA4A41752436D7205A2029359E5E9D57 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = B98786B4793785B197B72D9F89F64EB0; + remoteInfo = SDWebImage; + }; + FDB8EFFC2467FC352F427617B25A3CEC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = B98786B4793785B197B72D9F89F64EB0; + remoteInfo = SDWebImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 035F737EB2E024396A91216264A705D0 /* Pods-DKCarouselView-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-DKCarouselView-acknowledgements.markdown"; sourceTree = ""; }; + 08192D9444DBC2C63F9316BC18B5A9E4 /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; + 0DA6C80792B2A9869A4081BAE001FB21 /* Pods-DKCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-DKCarouselView-umbrella.h"; sourceTree = ""; }; + 0E3254871FBFF77E0E6A1DB9D50720C9 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0FD75721F2C5D865398AA318322A8FB2 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = ""; }; + 121E7B446F930788B5464623EE27D7D8 /* Pods-DKCarouselView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarouselView.debug.xcconfig"; sourceTree = ""; }; + 192A212023556B9C0AE8DCCDEE76A9BC /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = FLAnimatedImage/FLAnimatedImage.m; sourceTree = ""; }; + 193B8FB8B8DF334D98FD963964BEB4A7 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; + 1A8F80E7B461C73D5DDDE6B60074F660 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 1B53E918208B6AF327195A771AECF9E9 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; + 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 1C319AD7E54043A925A1E91AB72A74AC /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; + 1E18F6AD26949ADAF013CE6EF983A6F6 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; + 1F46473C42BAFF7AE6791D50C3260951 /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = ""; }; + 22396671EB2BD36E0CEA00DA84CDE883 /* Pods-DKCarouselView-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-DKCarouselView-acknowledgements.plist"; sourceTree = ""; }; + 232207FE3BC9B64552CA0F3838644A2E /* Pods_DKCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DKCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 236B4FB639AB53D145F96FFE92B2ACFC /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = FLAnimatedImage/FLAnimatedImageView.m; sourceTree = ""; }; + 23DAC468289E8335FF9663DF9E90D3C4 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; + 252A19DBEC5D919058922008A14C0B3A /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; + 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 286B033342C44F9AC48FA6312E6ADBB2 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = ""; }; + 288E3881DB97B622829EB35F8762DDC1 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; + 2912B1CD7019C46B19149B68E9A22DD7 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = ""; }; + 29C76B319B024D8016AF9BFFBE466607 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = ""; }; + 2C8AFC5F53E627FECD5751B3AB0B2F41 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; + 2D4AB8AC1E2EBB24BDC46D1FE60378BC /* Pods-DKCarouselViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarouselViewDemo.release.xcconfig"; sourceTree = ""; }; + 309C1B503BDAC16F4CC7B2D62DD8D291 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; + 320EF0A8DED532A6F447821AA2C10C24 /* Pods-DKCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-DKCarouselView.modulemap"; sourceTree = ""; }; + 33589591721CEA58761DCDD7082F16C8 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; + 366002120A70BA79D523D9721456CB3F /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; + 36DA0C05C256942B917B7B017999448D /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; + 38543E45061C0B5507AC02A4E3E9A242 /* FLAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FLAnimatedImageView+WebCache.h"; path = "SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h"; sourceTree = ""; }; + 3984D802F997B82C8838180A55FC5025 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = ""; }; + 4083382CFFDE5D5E27C028068EC04AC6 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4487E4815A9CDD694D5CA96F5809D652 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 4915AC8CF855B217D11DC320607D94F2 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; + 56FD10491E623111531356840FB821B2 /* Pods-DKCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-DKCarouselView-dummy.m"; sourceTree = ""; }; + 6273B5112B99824EE0E6120E8C9777CB /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + 628EE85850C5552F96919C5550B4BD67 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; + 6FB14104CFE4D2168AF2F291981909F7 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; + 7283D205A521BC5D2F0C1F6F146F458C /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; + 7836161E5B38C4502924639B51FD81BC /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = ""; }; + 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + 7F7C42A57E23A8B089BA70A1BD300AC0 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = ""; }; + 8319A43E98A2E884650356DC6BB51D43 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; + 83372DB5ECC77ED448DEFB96B62B60DA /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = ""; }; + 88C5DC7ABDC767C71B061DA3226AE6F2 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; + 8C441BB7E386F54D4C47A0D0F92F6D05 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; + 8EC71D3325B183A89EDAB85DC072114A /* FLAnimatedImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FLAnimatedImage.xcconfig; sourceTree = ""; }; + 905964D756F544C9E66151E8A5E890FA /* FLAnimatedImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FLAnimatedImage.modulemap; sourceTree = ""; }; + 90D13848603CB35024C013C581891DC0 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + 9262AA4BD5B961734443E68C5A54FBEA /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9462DB90C6E64892C0B0AD76E2D86BA5 /* Pods-DKCarouselViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-DKCarouselViewDemo-frameworks.sh"; sourceTree = ""; }; + 95D36950B0AD51E5F484827E7D3F3E55 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; + 96C442611D6187612BB189A59BDD9F8F /* FLAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FLAnimatedImageView+WebCache.m"; path = "SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m"; sourceTree = ""; }; + 96C69908204BC8B024E7CFE2F8890F87 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; + 9B9D701974EB1B979562C1EAB4BA7887 /* Pods-DKCarouselViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarouselViewDemo.debug.xcconfig"; sourceTree = ""; }; + A03D3A48AEA5586DFCD763471852FF86 /* Pods-DKCarouselViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-DKCarouselViewDemo.modulemap"; sourceTree = ""; }; + A1E2701CB2118EA35AC3FBB7FD4B0525 /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = ""; }; + A4640B009EF985D6B9D27596BEB83DC9 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A53BE17D723463DC8D6805C51B990006 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; + A623C38A5E62EE3F3F7299CBC04FEF4B /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = ""; }; + A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FLAnimatedImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AA12DB9536658FC8C539F59109FD5537 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = ""; }; + ADE01D6A07CF5BA67F2BBBCC9D1F182C /* FLAnimatedImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-umbrella.h"; sourceTree = ""; }; + AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + B05A7BA198370A81324742217FB564CA /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + B2B7ADCD27DE9C2181DB45E463D57978 /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; + B2BA7D5F59A54C6EAD64575FAA60D65D /* Pods_DKCarouselViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DKCarouselViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B7AC908A5EA1E770B13C6E8E7C0895BF /* Pods-DKCarouselViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-DKCarouselViewDemo-dummy.m"; sourceTree = ""; }; + B7BD189E4F3D31B8F4C965010B222A06 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + BBCE66741CED572CF6DA2C1F16A97434 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = ""; }; + BBF6560CAB53882432BA63B9BFD38531 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + BC99275E42BF5CD3696CE33C5C5E6505 /* FLAnimatedImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImage-dummy.m"; sourceTree = ""; }; + BFF52DF63580FB56F73298F56E0B08B6 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; + C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; + C2909D3BD91F76D7F24E81F5A1440031 /* Pods-DKCarouselViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-DKCarouselViewDemo-acknowledgements.plist"; sourceTree = ""; }; + C4D24297A20ADE367829247A06EFB852 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; + C5E3920B9124D9E77E421E8DBEF90C7F /* Pods-DKCarouselViewDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-DKCarouselViewDemo-resources.sh"; sourceTree = ""; }; + CAD1A66786704E614126661BBCFD7F57 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; + CF0AC04130C0D0F8950A2AA47CA00A6B /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; + D63AEE54160201DF710E2E2ACFA8ED6C /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = ""; }; + DB0D2A39BAA86C1436B0F6C3002E2361 /* FLAnimatedImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FLAnimatedImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DF3A2B6118ECFAA0A07D836FD39169E4 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + E01641B27F9E4151D86213FEE66CFA73 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; + E026ED8A9CADA1798F59F7031F1167FD /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; + E382554B4F84907C65C88FA6E978646F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E4F6B5F832833A80F33C25A1C8D1E6FE /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; + E5D908EC2CF4264091B26B9DBC2F2D31 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = FLAnimatedImage/FLAnimatedImageView.h; sourceTree = ""; }; + E6CD2653E223771495CEBCF159769C50 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; + EA1279C99D2AF12062FB4B99E302EC37 /* Pods-DKCarouselView-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-DKCarouselView-resources.sh"; sourceTree = ""; }; + EA67E604633C2960B1E1A5EF888AA803 /* Pods-DKCarouselViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-DKCarouselViewDemo-acknowledgements.markdown"; sourceTree = ""; }; + EFBA22E3F120F25952FF481A9819068D /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = FLAnimatedImage/FLAnimatedImage.h; sourceTree = ""; }; + F02C0385DD1A17718DB773419CF1F3F9 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = ""; }; + F31A38E332096600C2DC4D134DF4670D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F4A1C411326B82DB3FC3CBE776734D60 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = ""; }; + F7B8F1A903E6210544F4407F704A2503 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = ""; }; + FA0D6C637629C54AF21936337A37C3E7 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; + FAD1B8EDD1E35DB317E81287CA3C9AAF /* Pods-DKCarouselViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-DKCarouselViewDemo-umbrella.h"; sourceTree = ""; }; + FC8E49FEA29C80657DE0034375409640 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; + FD1FD88742FE8269A20D7E817946BBB1 /* Pods-DKCarouselView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DKCarouselView.release.xcconfig"; sourceTree = ""; }; + FD37A9712EBB2F534B4826DA3A08461F /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1EB1D38985C21CB6BD17ACF9EFF9FE0B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 02554D054B57E3288BA964667CF3E370 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5A3A9D3DA8E4CFA952EE975916E7D691 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3770A46016293DF20348BFEA8942C00F /* FLAnimatedImage.framework in Frameworks */, + F21B782CDF65D59FB39B9CAA65C7C90D /* Foundation.framework in Frameworks */, + 786DF793FFFDB169DEBA9F168A95E787 /* ImageIO.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AC2EDDF2D4B17FB68ACAB34883F5B527 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6878533E52B3FFB5B004D4D8D1477E10 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E3E8AABE9277C746E87843CF848268D6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6ABBC58BC116248D3CCB700B7F5517EC /* CoreGraphics.framework in Frameworks */, + 37683685A8F221EF5AEBF5E1FC11528A /* Foundation.framework in Frameworks */, + 65BB7B9FAC4B30DE8F2D145C49DB0A64 /* ImageIO.framework in Frameworks */, + DB65D31C5E1593210A6E37984CC6E631 /* MobileCoreServices.framework in Frameworks */, + C21177D72EA8AAC9539B0354FF31D507 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 221557F2D0E5E78B8D85C19B99425E5A /* Support Files */ = { + isa = PBXGroup; + children = ( + 905964D756F544C9E66151E8A5E890FA /* FLAnimatedImage.modulemap */, + 8EC71D3325B183A89EDAB85DC072114A /* FLAnimatedImage.xcconfig */, + BC99275E42BF5CD3696CE33C5C5E6505 /* FLAnimatedImage-dummy.m */, + 252A19DBEC5D919058922008A14C0B3A /* FLAnimatedImage-prefix.pch */, + ADE01D6A07CF5BA67F2BBBCC9D1F182C /* FLAnimatedImage-umbrella.h */, + E382554B4F84907C65C88FA6E978646F /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FLAnimatedImage"; + sourceTree = ""; + }; + 360D5122AFA7992E51907D1A53B051A4 /* DKCarouselView */ = { + isa = PBXGroup; + children = ( + ); + path = DKCarouselView; + sourceTree = ""; + }; + 46EB375AA338778C4E5DC97229582B15 /* Pods-DKCarouselView */ = { + isa = PBXGroup; + children = ( + 0E3254871FBFF77E0E6A1DB9D50720C9 /* Info.plist */, + 320EF0A8DED532A6F447821AA2C10C24 /* Pods-DKCarouselView.modulemap */, + 035F737EB2E024396A91216264A705D0 /* Pods-DKCarouselView-acknowledgements.markdown */, + 22396671EB2BD36E0CEA00DA84CDE883 /* Pods-DKCarouselView-acknowledgements.plist */, + 56FD10491E623111531356840FB821B2 /* Pods-DKCarouselView-dummy.m */, + EA1279C99D2AF12062FB4B99E302EC37 /* Pods-DKCarouselView-resources.sh */, + 0DA6C80792B2A9869A4081BAE001FB21 /* Pods-DKCarouselView-umbrella.h */, + 121E7B446F930788B5464623EE27D7D8 /* Pods-DKCarouselView.debug.xcconfig */, + FD1FD88742FE8269A20D7E817946BBB1 /* Pods-DKCarouselView.release.xcconfig */, + ); + name = "Pods-DKCarouselView"; + path = "Target Support Files/Pods-DKCarouselView"; + sourceTree = ""; + }; + 4A45998E6329B695CE49FEE17FA4455E /* iOS */ = { + isa = PBXGroup; + children = ( + 7F65485A5BCD6881A8791A2726E0FE78 /* CoreGraphics.framework */, + 1B593C65E11441390D0E91F1FE615D38 /* Foundation.framework */, + C23AC09E7A7F79FEA215F678493426E3 /* ImageIO.framework */, + AFB033E8F98E93AD25FDA54F50CD51F9 /* MobileCoreServices.framework */, + 275311E7CF51B824110C14B0CC91B71E /* QuartzCore.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 5253875430D6F8CA84C9BA41EFB30251 /* Support Files */ = { + isa = PBXGroup; + children = ( + A4640B009EF985D6B9D27596BEB83DC9 /* Info.plist */, + 288E3881DB97B622829EB35F8762DDC1 /* SDWebImage.modulemap */, + 95D36950B0AD51E5F484827E7D3F3E55 /* SDWebImage.xcconfig */, + 90D13848603CB35024C013C581891DC0 /* SDWebImage-dummy.m */, + 1A8F80E7B461C73D5DDDE6B60074F660 /* SDWebImage-prefix.pch */, + B7BD189E4F3D31B8F4C965010B222A06 /* SDWebImage-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; + sourceTree = ""; + }; + 53F2E7074946C3D4042EA7FF1FCC34C5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A880111DA6EEF227D589B5DAECEC190A /* FLAnimatedImage.framework */, + 4A45998E6329B695CE49FEE17FA4455E /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5C6A77B98CB853E85037EC77F0A913C9 /* Core */ = { + isa = PBXGroup; + children = ( + 6FB14104CFE4D2168AF2F291981909F7 /* NSButton+WebCache.h */, + F02C0385DD1A17718DB773419CF1F3F9 /* NSButton+WebCache.m */, + 4915AC8CF855B217D11DC320607D94F2 /* NSData+ImageContentType.h */, + 33589591721CEA58761DCDD7082F16C8 /* NSData+ImageContentType.m */, + 08192D9444DBC2C63F9316BC18B5A9E4 /* NSImage+WebCache.h */, + 366002120A70BA79D523D9721456CB3F /* NSImage+WebCache.m */, + AA12DB9536658FC8C539F59109FD5537 /* SDAnimatedImageRep.h */, + 7F7C42A57E23A8B089BA70A1BD300AC0 /* SDAnimatedImageRep.m */, + CF0AC04130C0D0F8950A2AA47CA00A6B /* SDImageCache.h */, + 88C5DC7ABDC767C71B061DA3226AE6F2 /* SDImageCache.m */, + E6CD2653E223771495CEBCF159769C50 /* SDImageCacheConfig.h */, + E01641B27F9E4151D86213FEE66CFA73 /* SDImageCacheConfig.m */, + 286B033342C44F9AC48FA6312E6ADBB2 /* SDWebImageCoder.h */, + A1E2701CB2118EA35AC3FBB7FD4B0525 /* SDWebImageCoder.m */, + 193B8FB8B8DF334D98FD963964BEB4A7 /* SDWebImageCoderHelper.h */, + 628EE85850C5552F96919C5550B4BD67 /* SDWebImageCoderHelper.m */, + A623C38A5E62EE3F3F7299CBC04FEF4B /* SDWebImageCodersManager.h */, + D63AEE54160201DF710E2E2ACFA8ED6C /* SDWebImageCodersManager.m */, + CAD1A66786704E614126661BBCFD7F57 /* SDWebImageCompat.h */, + 23DAC468289E8335FF9663DF9E90D3C4 /* SDWebImageCompat.m */, + E4F6B5F832833A80F33C25A1C8D1E6FE /* SDWebImageDownloader.h */, + FC8E49FEA29C80657DE0034375409640 /* SDWebImageDownloader.m */, + DF3A2B6118ECFAA0A07D836FD39169E4 /* SDWebImageDownloaderOperation.h */, + B05A7BA198370A81324742217FB564CA /* SDWebImageDownloaderOperation.m */, + 1F46473C42BAFF7AE6791D50C3260951 /* SDWebImageFrame.h */, + 29C76B319B024D8016AF9BFFBE466607 /* SDWebImageFrame.m */, + F7B8F1A903E6210544F4407F704A2503 /* SDWebImageGIFCoder.h */, + 7836161E5B38C4502924639B51FD81BC /* SDWebImageGIFCoder.m */, + 83372DB5ECC77ED448DEFB96B62B60DA /* SDWebImageImageIOCoder.h */, + 0FD75721F2C5D865398AA318322A8FB2 /* SDWebImageImageIOCoder.m */, + 9262AA4BD5B961734443E68C5A54FBEA /* SDWebImageManager.h */, + E026ED8A9CADA1798F59F7031F1167FD /* SDWebImageManager.m */, + 36DA0C05C256942B917B7B017999448D /* SDWebImageOperation.h */, + 7283D205A521BC5D2F0C1F6F146F458C /* SDWebImagePrefetcher.h */, + FD37A9712EBB2F534B4826DA3A08461F /* SDWebImagePrefetcher.m */, + F4A1C411326B82DB3FC3CBE776734D60 /* SDWebImageTransition.h */, + BBCE66741CED572CF6DA2C1F16A97434 /* SDWebImageTransition.m */, + 1C319AD7E54043A925A1E91AB72A74AC /* UIButton+WebCache.h */, + BFF52DF63580FB56F73298F56E0B08B6 /* UIButton+WebCache.m */, + 3984D802F997B82C8838180A55FC5025 /* UIImage+ForceDecode.h */, + 2912B1CD7019C46B19149B68E9A22DD7 /* UIImage+ForceDecode.m */, + 1B53E918208B6AF327195A771AECF9E9 /* UIImage+GIF.h */, + A53BE17D723463DC8D6805C51B990006 /* UIImage+GIF.m */, + FA0D6C637629C54AF21936337A37C3E7 /* UIImage+MemoryCacheCost.h */, + B2B7ADCD27DE9C2181DB45E463D57978 /* UIImage+MemoryCacheCost.m */, + C4D24297A20ADE367829247A06EFB852 /* UIImage+MultiFormat.h */, + 2C8AFC5F53E627FECD5751B3AB0B2F41 /* UIImage+MultiFormat.m */, + 4487E4815A9CDD694D5CA96F5809D652 /* UIImageView+HighlightedWebCache.h */, + BBF6560CAB53882432BA63B9BFD38531 /* UIImageView+HighlightedWebCache.m */, + 8319A43E98A2E884650356DC6BB51D43 /* UIImageView+WebCache.h */, + 6273B5112B99824EE0E6120E8C9777CB /* UIImageView+WebCache.m */, + 1E18F6AD26949ADAF013CE6EF983A6F6 /* UIView+WebCache.h */, + 96C69908204BC8B024E7CFE2F8890F87 /* UIView+WebCache.m */, + 8C441BB7E386F54D4C47A0D0F92F6D05 /* UIView+WebCacheOperation.h */, + 309C1B503BDAC16F4CC7B2D62DD8D291 /* UIView+WebCacheOperation.m */, + ); + name = Core; + sourceTree = ""; + }; + 6C8D9EE05AF092C24EBB4528B202F04D /* Pods */ = { + isa = PBXGroup; + children = ( + 360D5122AFA7992E51907D1A53B051A4 /* DKCarouselView */, + A5B5A877203185533EF09FB1927B5FE9 /* FLAnimatedImage */, + BC813CE03647A4413755B4C9363EE9AF /* SDWebImage */, + ); + name = Pods; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 53F2E7074946C3D4042EA7FF1FCC34C5 /* Frameworks */, + 6C8D9EE05AF092C24EBB4528B202F04D /* Pods */, + DF1B83A7A8F58ECAADBF992D5D7E4681 /* Products */, + CCACD9903EF82E9F2FEE6538F7F557F4 /* Targets Support Files */, + ); + sourceTree = ""; + }; + A5B5A877203185533EF09FB1927B5FE9 /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + EFBA22E3F120F25952FF481A9819068D /* FLAnimatedImage.h */, + 192A212023556B9C0AE8DCCDEE76A9BC /* FLAnimatedImage.m */, + E5D908EC2CF4264091B26B9DBC2F2D31 /* FLAnimatedImageView.h */, + 236B4FB639AB53D145F96FFE92B2ACFC /* FLAnimatedImageView.m */, + 221557F2D0E5E78B8D85C19B99425E5A /* Support Files */, + ); + path = FLAnimatedImage; + sourceTree = ""; + }; + BC813CE03647A4413755B4C9363EE9AF /* SDWebImage */ = { + isa = PBXGroup; + children = ( + 5C6A77B98CB853E85037EC77F0A913C9 /* Core */, + C378472B05A67DF67A3BBAAADFAFEFA9 /* GIF */, + 5253875430D6F8CA84C9BA41EFB30251 /* Support Files */, + ); + path = SDWebImage; + sourceTree = ""; + }; + C378472B05A67DF67A3BBAAADFAFEFA9 /* GIF */ = { + isa = PBXGroup; + children = ( + 38543E45061C0B5507AC02A4E3E9A242 /* FLAnimatedImageView+WebCache.h */, + 96C442611D6187612BB189A59BDD9F8F /* FLAnimatedImageView+WebCache.m */, + ); + name = GIF; + sourceTree = ""; + }; + CCACD9903EF82E9F2FEE6538F7F557F4 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 46EB375AA338778C4E5DC97229582B15 /* Pods-DKCarouselView */, + ECE59796B374A5AD3A59C61FBBE7B230 /* Pods-DKCarouselViewDemo */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + DF1B83A7A8F58ECAADBF992D5D7E4681 /* Products */ = { + isa = PBXGroup; + children = ( + DB0D2A39BAA86C1436B0F6C3002E2361 /* FLAnimatedImage.framework */, + 232207FE3BC9B64552CA0F3838644A2E /* Pods_DKCarouselView.framework */, + B2BA7D5F59A54C6EAD64575FAA60D65D /* Pods_DKCarouselViewDemo.framework */, + 4083382CFFDE5D5E27C028068EC04AC6 /* SDWebImage.framework */, + ); + name = Products; + sourceTree = ""; + }; + ECE59796B374A5AD3A59C61FBBE7B230 /* Pods-DKCarouselViewDemo */ = { + isa = PBXGroup; + children = ( + F31A38E332096600C2DC4D134DF4670D /* Info.plist */, + A03D3A48AEA5586DFCD763471852FF86 /* Pods-DKCarouselViewDemo.modulemap */, + EA67E604633C2960B1E1A5EF888AA803 /* Pods-DKCarouselViewDemo-acknowledgements.markdown */, + C2909D3BD91F76D7F24E81F5A1440031 /* Pods-DKCarouselViewDemo-acknowledgements.plist */, + B7AC908A5EA1E770B13C6E8E7C0895BF /* Pods-DKCarouselViewDemo-dummy.m */, + 9462DB90C6E64892C0B0AD76E2D86BA5 /* Pods-DKCarouselViewDemo-frameworks.sh */, + C5E3920B9124D9E77E421E8DBEF90C7F /* Pods-DKCarouselViewDemo-resources.sh */, + FAD1B8EDD1E35DB317E81287CA3C9AAF /* Pods-DKCarouselViewDemo-umbrella.h */, + 9B9D701974EB1B979562C1EAB4BA7887 /* Pods-DKCarouselViewDemo.debug.xcconfig */, + 2D4AB8AC1E2EBB24BDC46D1FE60378BC /* Pods-DKCarouselViewDemo.release.xcconfig */, + ); + name = "Pods-DKCarouselViewDemo"; + path = "Target Support Files/Pods-DKCarouselViewDemo"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 452EE0C92527DD0E72CDCB1A1183B9AA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0BF6862CFEEB6770F424A79D9CF13E7F /* Pods-DKCarouselViewDemo-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 98599B42297CB3ACAB00D7AC6708CE47 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D2B9FD20A4D0679DB6CEC72BCF5ADA6F /* Pods-DKCarouselView-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DF6D988542E0339156786A9FFCF524B7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 36EFC0979F00E228CEC8BDAF2099F9D6 /* FLAnimatedImageView+WebCache.h in Headers */, + 09D0123563C863C40F5731D99B80E4A5 /* NSButton+WebCache.h in Headers */, + 1F92E2516714B9ED24B9B0A60FF063A5 /* NSData+ImageContentType.h in Headers */, + 0D702FB019D392F05BA0BF4AA39AE960 /* NSImage+WebCache.h in Headers */, + 0F29AE452169BC071EC49BCB13B1CB01 /* SDAnimatedImageRep.h in Headers */, + 829BF9567EBCA1C971C4CAC821113977 /* SDImageCache.h in Headers */, + 0B8ACFAF49DB6CE4F65E7DDFD341B8D5 /* SDImageCacheConfig.h in Headers */, + DE0BFCDF6B281870616740A1594805BA /* SDWebImage-umbrella.h in Headers */, + 69A3570A1E07AB797E9502D34B2603D6 /* SDWebImageCoder.h in Headers */, + 1A907C8C9384B808FACA3F02C29BED3F /* SDWebImageCoderHelper.h in Headers */, + 839745471F79E3A731EA3E8D2F376CCC /* SDWebImageCodersManager.h in Headers */, + E0E19A31E196F0978640AAA5B9B6CBD1 /* SDWebImageCompat.h in Headers */, + BC4FE2B9065E8152154E74A9202B5EC8 /* SDWebImageDownloader.h in Headers */, + 193BAEB85825FD2FE5DB5E1862E3E4EB /* SDWebImageDownloaderOperation.h in Headers */, + 628A72E61E5F32C405036FD0BB62EE61 /* SDWebImageFrame.h in Headers */, + 9BA8B6F9C5521FB10EDD2EBBEC6C579E /* SDWebImageGIFCoder.h in Headers */, + B356D6FE092B27C221EB620D2ADA421E /* SDWebImageImageIOCoder.h in Headers */, + B0AD0C1A9D427FC8835D2A3162DFE7E7 /* SDWebImageManager.h in Headers */, + 3BE3DE8C0C11560FF99F10B6CC190326 /* SDWebImageOperation.h in Headers */, + 1D0617E37635BA8AD3B59788869AEEE3 /* SDWebImagePrefetcher.h in Headers */, + C4760775EF7A80E5B22B46820BAFDD5E /* SDWebImageTransition.h in Headers */, + E852914E83E54FC4D6EB16ACE721BE4D /* UIButton+WebCache.h in Headers */, + 046CD7629DC68F2D169EA013FC3CBEB9 /* UIImage+ForceDecode.h in Headers */, + 97A7275FA65E2966CEE10175EDAD9679 /* UIImage+GIF.h in Headers */, + A4BC27AADD3A54A25905C7F8965FA5F0 /* UIImage+MemoryCacheCost.h in Headers */, + 7422444D3954DEAB153920B14EE0C93A /* UIImage+MultiFormat.h in Headers */, + 21BC2B4E024BAE6F33B5529B9AF5670C /* UIImageView+HighlightedWebCache.h in Headers */, + 566A98B500DF2D9E57F0861B676E3A92 /* UIImageView+WebCache.h in Headers */, + 53D9BC2B24DEBFBCC251D714FDC9183D /* UIView+WebCache.h in Headers */, + 5A3024E70AD71B758C1739951EA58142 /* UIView+WebCacheOperation.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F88CF70F4B003F3D138F3C8B26BA08B6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 917B055DED8553A042FFB8270AF6ECD7 /* FLAnimatedImage-umbrella.h in Headers */, + A6F325C78AFD5E791D0EFE5AE158619B /* FLAnimatedImage.h in Headers */, + 12595EF47FC1C733100BC2C0B88C9093 /* FLAnimatedImageView.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2570B8E8388D7191678C5C06E51ECE49 /* Pods-DKCarouselViewDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = E3E7A749DDE6ADCEEABC2BB65DD6CDD7 /* Build configuration list for PBXNativeTarget "Pods-DKCarouselViewDemo" */; + buildPhases = ( + 452EE0C92527DD0E72CDCB1A1183B9AA /* Headers */, + 40488B6298516118DBFBB0BDF91992E8 /* Sources */, + AC2EDDF2D4B17FB68ACAB34883F5B527 /* Frameworks */, + D0763FEECBC1E101C195A0EE856598F1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 574839E2BDFB05B66C24781E6A67D5A9 /* PBXTargetDependency */, + B29F8138681D8F68E31671CED77F0F98 /* PBXTargetDependency */, + ); + name = "Pods-DKCarouselViewDemo"; + productName = "Pods-DKCarouselViewDemo"; + productReference = B2BA7D5F59A54C6EAD64575FAA60D65D /* Pods_DKCarouselViewDemo.framework */; + productType = "com.apple.product-type.framework"; + }; + 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = E8D6D562BB609396B62E386B9203F207 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */; + buildPhases = ( + F88CF70F4B003F3D138F3C8B26BA08B6 /* Headers */, + B462C08BC2B9EBB5DD37366BDB220EB2 /* Sources */, + E3E8AABE9277C746E87843CF848268D6 /* Frameworks */, + 83192590C22D6F86D62DB7E00D6473B4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FLAnimatedImage; + productName = FLAnimatedImage; + productReference = DB0D2A39BAA86C1436B0F6C3002E2361 /* FLAnimatedImage.framework */; + productType = "com.apple.product-type.framework"; + }; + 8A2517E5C0BA69D325C8BDAB4B441B7E /* Pods-DKCarouselView */ = { + isa = PBXNativeTarget; + buildConfigurationList = DCEB70ADF0153CDF79420E98EBA474DB /* Build configuration list for PBXNativeTarget "Pods-DKCarouselView" */; + buildPhases = ( + 98599B42297CB3ACAB00D7AC6708CE47 /* Headers */, + 3A9BC4B5DEF79C10776A0A8B87E92CE5 /* Sources */, + 1EB1D38985C21CB6BD17ACF9EFF9FE0B /* Frameworks */, + 9465849BA63408E7B79F449A53DCA0E7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 9F84F04C627C063044E0681F00A257C6 /* PBXTargetDependency */, + 003423FBD7FA8856B6C76411873ED63A /* PBXTargetDependency */, + ); + name = "Pods-DKCarouselView"; + productName = "Pods-DKCarouselView"; + productReference = 232207FE3BC9B64552CA0F3838644A2E /* Pods_DKCarouselView.framework */; + productType = "com.apple.product-type.framework"; + }; + B98786B4793785B197B72D9F89F64EB0 /* SDWebImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 51E87C1AE02C87CD4CCF5565EF42121E /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildPhases = ( + DF6D988542E0339156786A9FFCF524B7 /* Headers */, + 1C3B3625E662746810DB1775C5D58995 /* Sources */, + 5A3A9D3DA8E4CFA952EE975916E7D691 /* Frameworks */, + 1A5B9FE6C59741C88CC5F2BD328D2A72 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4F35006A7214D348F27C73314FEC61F3 /* PBXTargetDependency */, + ); + name = SDWebImage; + productName = SDWebImage; + productReference = 4083382CFFDE5D5E27C028068EC04AC6 /* SDWebImage.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 1020; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = DF1B83A7A8F58ECAADBF992D5D7E4681 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */, + 8A2517E5C0BA69D325C8BDAB4B441B7E /* Pods-DKCarouselView */, + 2570B8E8388D7191678C5C06E51ECE49 /* Pods-DKCarouselViewDemo */, + B98786B4793785B197B72D9F89F64EB0 /* SDWebImage */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1A5B9FE6C59741C88CC5F2BD328D2A72 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 83192590C22D6F86D62DB7E00D6473B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9465849BA63408E7B79F449A53DCA0E7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D0763FEECBC1E101C195A0EE856598F1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1C3B3625E662746810DB1775C5D58995 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 46F5153AB008B8A860DA447FB0730EA5 /* FLAnimatedImageView+WebCache.m in Sources */, + 798A8D3916B97ABDAC915DB03CABF0B7 /* NSButton+WebCache.m in Sources */, + 5B79B271A5FE8F362D594E563D75FF07 /* NSData+ImageContentType.m in Sources */, + 872D53389BF29F93B43E2A4EF5732067 /* NSImage+WebCache.m in Sources */, + 183C4983E278074C75884959A04280EA /* SDAnimatedImageRep.m in Sources */, + 09F03FF678019B99B3482E38202CDBC9 /* SDImageCache.m in Sources */, + 7CEA082E370B3AF974F7E9A41D637772 /* SDImageCacheConfig.m in Sources */, + 355C27E067E4FC1E56F8CB86A7E0399F /* SDWebImage-dummy.m in Sources */, + 22B0402FE69A2A32AED96160023B60E4 /* SDWebImageCoder.m in Sources */, + C72331457258C871931EBCD6355F377C /* SDWebImageCoderHelper.m in Sources */, + 290AB0F7C48DA6CEF0E83695859BC124 /* SDWebImageCodersManager.m in Sources */, + AE5A525B69C36DA7A65B7EB2936A5F7F /* SDWebImageCompat.m in Sources */, + A2B6F17B7CF9C0C4171AFA49BC2DC703 /* SDWebImageDownloader.m in Sources */, + 11A94D44EE82D1518C5245955F51D40D /* SDWebImageDownloaderOperation.m in Sources */, + 87351703F7C0B44D5291A5DDFA66950F /* SDWebImageFrame.m in Sources */, + AB6489AD7884F56A8577373585B5264A /* SDWebImageGIFCoder.m in Sources */, + 5843BB5A1951AC1CE1FD19F5BFD0BA60 /* SDWebImageImageIOCoder.m in Sources */, + 14191C2764366B3CB02763B239E0E071 /* SDWebImageManager.m in Sources */, + 3549EBDFDF0A444F629D58B2A6A2F727 /* SDWebImagePrefetcher.m in Sources */, + 0A551E471A7A5D18109984A8AEBB0488 /* SDWebImageTransition.m in Sources */, + 4CFE9B633B11DC7FB150CD7C52805B18 /* UIButton+WebCache.m in Sources */, + 23ABCD52A3944FD393D1F95476D04DAB /* UIImage+ForceDecode.m in Sources */, + 0C6B53CE031A8A4232C907125D125555 /* UIImage+GIF.m in Sources */, + 64AB44AD8A81EBA8F078D2F76AECCDDE /* UIImage+MemoryCacheCost.m in Sources */, + D044B8464D00570122225B86E43AB205 /* UIImage+MultiFormat.m in Sources */, + C9A26656D9E840E78D67DB42B30A03F6 /* UIImageView+HighlightedWebCache.m in Sources */, + FACF14E2C3F2AA3F5CC3A8DC338D63C2 /* UIImageView+WebCache.m in Sources */, + 2CC545A7A603EFDAFFC57C6E2554A008 /* UIView+WebCache.m in Sources */, + 2119917D07600C196268FADC888A08F7 /* UIView+WebCacheOperation.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3A9BC4B5DEF79C10776A0A8B87E92CE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92BB3832F14D67215D5B5901AA6BF1C1 /* Pods-DKCarouselView-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40488B6298516118DBFBB0BDF91992E8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C895F90AC76E2420903827BB459CFEA3 /* Pods-DKCarouselViewDemo-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B462C08BC2B9EBB5DD37366BDB220EB2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B399633E4730A9DB94007B451B472DB /* FLAnimatedImage-dummy.m in Sources */, + 5DF3480D9AEF5BF93EF11586B8D0CCF2 /* FLAnimatedImage.m in Sources */, + 1FBFB43EC7DA59FB18CDBA03408AB86E /* FLAnimatedImageView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 003423FBD7FA8856B6C76411873ED63A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = B98786B4793785B197B72D9F89F64EB0 /* SDWebImage */; + targetProxy = FA4A41752436D7205A2029359E5E9D57 /* PBXContainerItemProxy */; + }; + 4F35006A7214D348F27C73314FEC61F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FLAnimatedImage; + target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; + targetProxy = 5652353C9EAA9F91A1837CB969E5B535 /* PBXContainerItemProxy */; + }; + 574839E2BDFB05B66C24781E6A67D5A9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FLAnimatedImage; + target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; + targetProxy = B3A9C7C9078D9B901DD8743FC2D03E10 /* PBXContainerItemProxy */; + }; + 9F84F04C627C063044E0681F00A257C6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FLAnimatedImage; + target = 4D7B7D274050D6277CAECA96F3CF6722 /* FLAnimatedImage */; + targetProxy = DB5C568CB62448AEFB666E6C5DF4B4A1 /* PBXContainerItemProxy */; + }; + B29F8138681D8F68E31671CED77F0F98 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = B98786B4793785B197B72D9F89F64EB0 /* SDWebImage */; + targetProxy = FDB8EFFC2467FC352F427617B25A3CEC /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 3B3C8BE0F366EBC5071BE9BA5659C5E3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 95D36950B0AD51E5F484827E7D3F3E55 /* SDWebImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 50438841D464EAFE51FB012362262A57 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9B9D701974EB1B979562C1EAB4BA7887 /* Pods-DKCarouselViewDemo.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-DKCarouselViewDemo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 5B2F4BB3B57B430C53E4B71A3AF6E279 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FD1FD88742FE8269A20D7E817946BBB1 /* Pods-DKCarouselView.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-DKCarouselView/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 5DE19CECB206ACCCACF04D62F93FFDA6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 6F3E26A41B304A061BD9CBB706CD4FF7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8EC71D3325B183A89EDAB85DC072114A /* FLAnimatedImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FLAnimatedImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap"; + PRODUCT_MODULE_NAME = FLAnimatedImage; + PRODUCT_NAME = FLAnimatedImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 858D01EEFE984249A9581D18DBEA53F1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 88CBAF3B5F49325032174716642719C8 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 95D36950B0AD51E5F484827E7D3F3E55 /* SDWebImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D5AC7FD528B7BB856D14F032C29DC093 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2D4AB8AC1E2EBB24BDC46D1FE60378BC /* Pods-DKCarouselViewDemo.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-DKCarouselViewDemo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + D9DDE69770630B8A06E4EB23FDB14C22 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 121E7B446F930788B5464623EE27D7D8 /* Pods-DKCarouselView.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-DKCarouselView/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F871B6326C8F63EA427875B0840AAD42 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8EC71D3325B183A89EDAB85DC072114A /* FLAnimatedImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FLAnimatedImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap"; + PRODUCT_MODULE_NAME = FLAnimatedImage; + PRODUCT_NAME = FLAnimatedImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 858D01EEFE984249A9581D18DBEA53F1 /* Debug */, + 5DE19CECB206ACCCACF04D62F93FFDA6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 51E87C1AE02C87CD4CCF5565EF42121E /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 88CBAF3B5F49325032174716642719C8 /* Debug */, + 3B3C8BE0F366EBC5071BE9BA5659C5E3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DCEB70ADF0153CDF79420E98EBA474DB /* Build configuration list for PBXNativeTarget "Pods-DKCarouselView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D9DDE69770630B8A06E4EB23FDB14C22 /* Debug */, + 5B2F4BB3B57B430C53E4B71A3AF6E279 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E3E7A749DDE6ADCEEABC2BB65DD6CDD7 /* Build configuration list for PBXNativeTarget "Pods-DKCarouselViewDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 50438841D464EAFE51FB012362262A57 /* Debug */, + D5AC7FD528B7BB856D14F032C29DC093 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E8D6D562BB609396B62E386B9203F207 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F871B6326C8F63EA427875B0840AAD42 /* Debug */, + 6F3E26A41B304A061BD9CBB706CD4FF7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/DKCarousel/Pods/SDWebImage/LICENSE b/DKCarouselView/Pods/SDWebImage/LICENSE similarity index 100% rename from DKCarousel/Pods/SDWebImage/LICENSE rename to DKCarouselView/Pods/SDWebImage/LICENSE diff --git a/DKCarousel/Pods/SDWebImage/README.md b/DKCarouselView/Pods/SDWebImage/README.md similarity index 100% rename from DKCarousel/Pods/SDWebImage/README.md rename to DKCarouselView/Pods/SDWebImage/README.md diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDAnimatedImageRep.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageManager.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageManager.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageManager.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageManager.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageManager.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+GIF.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+GIF.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+GIF.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+GIF.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+GIF.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MemoryCacheCost.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCache.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCache.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCache.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCache.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCache.m diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h diff --git a/DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m b/DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m similarity index 100% rename from DKCarousel/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m rename to DKCarouselView/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m b/DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m similarity index 100% rename from DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m rename to DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch b/DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch similarity index 100% rename from DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch rename to DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h b/DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h similarity index 100% rename from DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h rename to DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap b/DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap similarity index 100% rename from DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap rename to DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig b/DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig similarity index 100% rename from DKCarousel/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig rename to DKCarouselView/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig diff --git a/DKCarousel/Pods/Target Support Files/FLAnimatedImage/Info.plist b/DKCarouselView/Pods/Target Support Files/FLAnimatedImage/Info.plist similarity index 100% rename from DKCarousel/Pods/Target Support Files/FLAnimatedImage/Info.plist rename to DKCarouselView/Pods/Target Support Files/FLAnimatedImage/Info.plist diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Info.plist b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Info.plist similarity index 100% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Info.plist rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Info.plist diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-acknowledgements.markdown similarity index 100% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.markdown rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-acknowledgements.markdown diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-acknowledgements.plist similarity index 100% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-acknowledgements.plist rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-acknowledgements.plist diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-dummy.m b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-dummy.m new file mode 100644 index 0000000..7edcece --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_DKCarouselView : NSObject +@end +@implementation PodsDummy_Pods_DKCarouselView +@end diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-resources.sh similarity index 100% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-resources.sh rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-resources.sh diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-umbrella.h similarity index 59% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-umbrella.h index 74be18f..3eef82f 100644 --- a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel-umbrella.h +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView-umbrella.h @@ -11,6 +11,6 @@ #endif -FOUNDATION_EXPORT double Pods_DKCarouselVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_DKCarouselVersionString[]; +FOUNDATION_EXPORT double Pods_DKCarouselViewVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_DKCarouselViewVersionString[]; diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.debug.xcconfig similarity index 100% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.debug.xcconfig rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.debug.xcconfig diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.modulemap b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.modulemap new file mode 100644 index 0000000..06f138f --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.modulemap @@ -0,0 +1,6 @@ +framework module Pods_DKCarouselView { + umbrella header "Pods-DKCarouselView-umbrella.h" + + export * + module * { export * } +} diff --git a/DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.release.xcconfig similarity index 100% rename from DKCarousel/Pods/Target Support Files/Pods-DKCarousel/Pods-DKCarousel.release.xcconfig rename to DKCarouselView/Pods/Target Support Files/Pods-DKCarouselView/Pods-DKCarouselView.release.xcconfig diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Info.plist b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.markdown b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.markdown new file mode 100644 index 0000000..f9ca065 --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.markdown @@ -0,0 +1,78 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## FLAnimatedImage + +The MIT License (MIT) + +Copyright (c) 2014-2016 Flipboard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +## SDWebImage + +Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +## DKCarouselView + +The MIT License (MIT) + +Copyright (c) 2014 Bannings + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Generated by CocoaPods - https://cocoapods.org diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.plist b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.plist new file mode 100644 index 0000000..aa18e52 --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-acknowledgements.plist @@ -0,0 +1,122 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014-2016 Flipboard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + FLAnimatedImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + License + MIT + Title + SDWebImage + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014 Bannings + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + License + MIT + Title + DKCarouselView + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-dummy.m b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-dummy.m new file mode 100644 index 0000000..5e56a52 --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_DKCarouselViewDemo : NSObject +@end +@implementation PodsDummy_Pods_DKCarouselViewDemo +@end diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-frameworks.sh b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-frameworks.sh new file mode 100755 index 0000000..448f07f --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-frameworks.sh @@ -0,0 +1,155 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-resources.sh b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-resources.sh new file mode 100755 index 0000000..345301f --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-resources.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-umbrella.h b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-umbrella.h new file mode 100644 index 0000000..d567e74 --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_DKCarouselViewDemoVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_DKCarouselViewDemoVersionString[]; + diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.debug.xcconfig b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.debug.xcconfig new file mode 100644 index 0000000..baf0b4e --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.debug.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FLAnimatedImage" -framework "Foundation" -framework "SDWebImage" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/.. +PODS_ROOT = ${SRCROOT}/../Pods diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.modulemap b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.modulemap new file mode 100644 index 0000000..4bd00ac --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.modulemap @@ -0,0 +1,6 @@ +framework module Pods_DKCarouselViewDemo { + umbrella header "Pods-DKCarouselViewDemo-umbrella.h" + + export * + module * { export * } +} diff --git a/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.release.xcconfig b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.release.xcconfig new file mode 100644 index 0000000..baf0b4e --- /dev/null +++ b/DKCarouselView/Pods/Target Support Files/Pods-DKCarouselViewDemo/Pods-DKCarouselViewDemo.release.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FLAnimatedImage" -framework "Foundation" -framework "SDWebImage" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/.. +PODS_ROOT = ${SRCROOT}/../Pods diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/Info.plist b/DKCarouselView/Pods/Target Support Files/SDWebImage/Info.plist similarity index 100% rename from DKCarousel/Pods/Target Support Files/SDWebImage/Info.plist rename to DKCarouselView/Pods/Target Support Files/SDWebImage/Info.plist diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m b/DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m similarity index 100% rename from DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m rename to DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch b/DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch similarity index 100% rename from DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch rename to DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h b/DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h similarity index 100% rename from DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h rename to DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap b/DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap similarity index 100% rename from DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap rename to DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap diff --git a/DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig b/DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig similarity index 100% rename from DKCarousel/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig rename to DKCarouselView/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig diff --git a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj b/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj deleted file mode 100644 index eaf0415..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,627 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 9C1EE03E1A13A6AF00BC502F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE03D1A13A6AF00BC502F /* main.m */; }; - 9C1EE0411A13A6AF00BC502F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0401A13A6AF00BC502F /* AppDelegate.m */; }; - 9C1EE0441A13A6AF00BC502F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0431A13A6AF00BC502F /* ViewController.m */; }; - 9C1EE0471A13A6AF00BC502F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C1EE0451A13A6AF00BC502F /* Main.storyboard */; }; - 9C1EE0491A13A6AF00BC502F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9C1EE0481A13A6AF00BC502F /* Images.xcassets */; }; - 9C1EE04C1A13A6AF00BC502F /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9C1EE04A1A13A6AF00BC502F /* LaunchScreen.xib */; }; - 9C1EE0581A13A6AF00BC502F /* DKCarouselViewDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0571A13A6AF00BC502F /* DKCarouselViewDemoTests.m */; }; - 9C1EE0951A13A6E300BC502F /* DKCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C1EE0941A13A6E300BC502F /* DKCarouselView.m */; }; - B5F263B21E969FBA0032AB98 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F2638E1E969FBA0032AB98 /* FLAnimatedImageView+WebCache.m */; }; - B5F263B31E969FBA0032AB98 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263901E969FBA0032AB98 /* NSData+ImageContentType.m */; }; - B5F263B41E969FBA0032AB98 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263921E969FBA0032AB98 /* NSImage+WebCache.m */; }; - B5F263B51E969FBA0032AB98 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263941E969FBA0032AB98 /* SDImageCache.m */; }; - B5F263B61E969FBA0032AB98 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263961E969FBA0032AB98 /* SDImageCacheConfig.m */; }; - B5F263B71E969FBA0032AB98 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263981E969FBA0032AB98 /* SDWebImageCompat.m */; }; - B5F263B81E969FBA0032AB98 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F2639A1E969FBA0032AB98 /* SDWebImageDecoder.m */; }; - B5F263B91E969FBA0032AB98 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F2639C1E969FBA0032AB98 /* SDWebImageDownloader.m */; }; - B5F263BA1E969FBA0032AB98 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F2639E1E969FBA0032AB98 /* SDWebImageDownloaderOperation.m */; }; - B5F263BB1E969FBA0032AB98 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263A01E969FBA0032AB98 /* SDWebImageManager.m */; }; - B5F263BC1E969FBA0032AB98 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263A31E969FBA0032AB98 /* SDWebImagePrefetcher.m */; }; - B5F263BD1E969FBA0032AB98 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263A51E969FBA0032AB98 /* UIButton+WebCache.m */; }; - B5F263BE1E969FBA0032AB98 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263A71E969FBA0032AB98 /* UIImage+GIF.m */; }; - B5F263BF1E969FBA0032AB98 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263A91E969FBA0032AB98 /* UIImage+MultiFormat.m */; }; - B5F263C01E969FBA0032AB98 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263AB1E969FBA0032AB98 /* UIImageView+HighlightedWebCache.m */; }; - B5F263C11E969FBA0032AB98 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263AD1E969FBA0032AB98 /* UIImageView+WebCache.m */; }; - B5F263C21E969FBA0032AB98 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263AF1E969FBA0032AB98 /* UIView+WebCache.m */; }; - B5F263C31E969FBA0032AB98 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263B11E969FBA0032AB98 /* UIView+WebCacheOperation.m */; }; - B5F263CC1E969FCA0032AB98 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263C71E969FCA0032AB98 /* FLAnimatedImage.m */; }; - B5F263CD1E969FCA0032AB98 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F263C91E969FCA0032AB98 /* FLAnimatedImageView.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 9C1EE0521A13A6AF00BC502F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9C1EE0301A13A6AF00BC502F /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9C1EE0371A13A6AF00BC502F; - remoteInfo = DKCarouselViewDemo; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 9C1EE0381A13A6AF00BC502F /* DKCarouselViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DKCarouselViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 9C1EE03C1A13A6AF00BC502F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9C1EE03D1A13A6AF00BC502F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 9C1EE03F1A13A6AF00BC502F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 9C1EE0401A13A6AF00BC502F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 9C1EE0421A13A6AF00BC502F /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 9C1EE0431A13A6AF00BC502F /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 9C1EE0461A13A6AF00BC502F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 9C1EE0481A13A6AF00BC502F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 9C1EE04B1A13A6AF00BC502F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 9C1EE0511A13A6AF00BC502F /* DKCarouselViewDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DKCarouselViewDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 9C1EE0561A13A6AF00BC502F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9C1EE0571A13A6AF00BC502F /* DKCarouselViewDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DKCarouselViewDemoTests.m; sourceTree = ""; }; - 9C1EE0621A13A6D600BC502F /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - 9C1EE0631A13A6D600BC502F /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 9C1EE0931A13A6E300BC502F /* DKCarouselView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKCarouselView.h; sourceTree = ""; }; - 9C1EE0941A13A6E300BC502F /* DKCarouselView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKCarouselView.m; sourceTree = ""; }; - B5F2638D1E969FBA0032AB98 /* FLAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImageView+WebCache.h"; sourceTree = ""; }; - B5F2638E1E969FBA0032AB98 /* FLAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImageView+WebCache.m"; sourceTree = ""; }; - B5F2638F1E969FBA0032AB98 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ImageContentType.h"; sourceTree = ""; }; - B5F263901E969FBA0032AB98 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ImageContentType.m"; sourceTree = ""; }; - B5F263911E969FBA0032AB98 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+WebCache.h"; sourceTree = ""; }; - B5F263921E969FBA0032AB98 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+WebCache.m"; sourceTree = ""; }; - B5F263931E969FBA0032AB98 /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCache.h; sourceTree = ""; }; - B5F263941E969FBA0032AB98 /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCache.m; sourceTree = ""; }; - B5F263951E969FBA0032AB98 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCacheConfig.h; sourceTree = ""; }; - B5F263961E969FBA0032AB98 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCacheConfig.m; sourceTree = ""; }; - B5F263971E969FBA0032AB98 /* SDWebImageCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageCompat.h; sourceTree = ""; }; - B5F263981E969FBA0032AB98 /* SDWebImageCompat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageCompat.m; sourceTree = ""; }; - B5F263991E969FBA0032AB98 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDecoder.h; sourceTree = ""; }; - B5F2639A1E969FBA0032AB98 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDecoder.m; sourceTree = ""; }; - B5F2639B1E969FBA0032AB98 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloader.h; sourceTree = ""; }; - B5F2639C1E969FBA0032AB98 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloader.m; sourceTree = ""; }; - B5F2639D1E969FBA0032AB98 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloaderOperation.h; sourceTree = ""; }; - B5F2639E1E969FBA0032AB98 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderOperation.m; sourceTree = ""; }; - B5F2639F1E969FBA0032AB98 /* SDWebImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageManager.h; sourceTree = ""; }; - B5F263A01E969FBA0032AB98 /* SDWebImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageManager.m; sourceTree = ""; }; - B5F263A11E969FBA0032AB98 /* SDWebImageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageOperation.h; sourceTree = ""; }; - B5F263A21E969FBA0032AB98 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImagePrefetcher.h; sourceTree = ""; }; - B5F263A31E969FBA0032AB98 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcher.m; sourceTree = ""; }; - B5F263A41E969FBA0032AB98 /* UIButton+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+WebCache.h"; sourceTree = ""; }; - B5F263A51E969FBA0032AB98 /* UIButton+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+WebCache.m"; sourceTree = ""; }; - B5F263A61E969FBA0032AB98 /* UIImage+GIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+GIF.h"; sourceTree = ""; }; - B5F263A71E969FBA0032AB98 /* UIImage+GIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+GIF.m"; sourceTree = ""; }; - B5F263A81E969FBA0032AB98 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+MultiFormat.h"; sourceTree = ""; }; - B5F263A91E969FBA0032AB98 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+MultiFormat.m"; sourceTree = ""; }; - B5F263AA1E969FBA0032AB98 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - B5F263AB1E969FBA0032AB98 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - B5F263AC1E969FBA0032AB98 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+WebCache.h"; sourceTree = ""; }; - B5F263AD1E969FBA0032AB98 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+WebCache.m"; sourceTree = ""; }; - B5F263AE1E969FBA0032AB98 /* UIView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+WebCache.h"; sourceTree = ""; }; - B5F263AF1E969FBA0032AB98 /* UIView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+WebCache.m"; sourceTree = ""; }; - B5F263B01E969FBA0032AB98 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+WebCacheOperation.h"; sourceTree = ""; }; - B5F263B11E969FBA0032AB98 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+WebCacheOperation.m"; sourceTree = ""; }; - B5F263C61E969FCA0032AB98 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; - B5F263C71E969FCA0032AB98 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; - B5F263C81E969FCA0032AB98 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; - B5F263C91E969FCA0032AB98 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; - B5F263CA1E969FCA0032AB98 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - B5F263CB1E969FCA0032AB98 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 9C1EE0351A13A6AF00BC502F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9C1EE04E1A13A6AF00BC502F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9C1EE02F1A13A6AF00BC502F = { - isa = PBXGroup; - children = ( - 9C1EE03A1A13A6AF00BC502F /* DKCarouselViewDemo */, - 9C1EE0541A13A6AF00BC502F /* DKCarouselViewDemoTests */, - 9C1EE0391A13A6AF00BC502F /* Products */, - ); - sourceTree = ""; - }; - 9C1EE0391A13A6AF00BC502F /* Products */ = { - isa = PBXGroup; - children = ( - 9C1EE0381A13A6AF00BC502F /* DKCarouselViewDemo.app */, - 9C1EE0511A13A6AF00BC502F /* DKCarouselViewDemoTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 9C1EE03A1A13A6AF00BC502F /* DKCarouselViewDemo */ = { - isa = PBXGroup; - children = ( - 9C1EE0611A13A6D600BC502F /* SDWebImage */, - B5F263C41E969FCA0032AB98 /* FLAnimatedImage */, - 9C1EE0921A13A6E300BC502F /* DKCarouselView */, - 9C1EE03F1A13A6AF00BC502F /* AppDelegate.h */, - 9C1EE0401A13A6AF00BC502F /* AppDelegate.m */, - 9C1EE0421A13A6AF00BC502F /* ViewController.h */, - 9C1EE0431A13A6AF00BC502F /* ViewController.m */, - 9C1EE0451A13A6AF00BC502F /* Main.storyboard */, - 9C1EE0481A13A6AF00BC502F /* Images.xcassets */, - 9C1EE04A1A13A6AF00BC502F /* LaunchScreen.xib */, - 9C1EE03B1A13A6AF00BC502F /* Supporting Files */, - ); - path = DKCarouselViewDemo; - sourceTree = ""; - }; - 9C1EE03B1A13A6AF00BC502F /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 9C1EE03C1A13A6AF00BC502F /* Info.plist */, - 9C1EE03D1A13A6AF00BC502F /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 9C1EE0541A13A6AF00BC502F /* DKCarouselViewDemoTests */ = { - isa = PBXGroup; - children = ( - 9C1EE0571A13A6AF00BC502F /* DKCarouselViewDemoTests.m */, - 9C1EE0551A13A6AF00BC502F /* Supporting Files */, - ); - path = DKCarouselViewDemoTests; - sourceTree = ""; - }; - 9C1EE0551A13A6AF00BC502F /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 9C1EE0561A13A6AF00BC502F /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 9C1EE0611A13A6D600BC502F /* SDWebImage */ = { - isa = PBXGroup; - children = ( - B5F2638B1E969FBA0032AB98 /* SDWebImage */, - 9C1EE0621A13A6D600BC502F /* LICENSE */, - 9C1EE0631A13A6D600BC502F /* README.md */, - ); - path = SDWebImage; - sourceTree = SOURCE_ROOT; - }; - 9C1EE0921A13A6E300BC502F /* DKCarouselView */ = { - isa = PBXGroup; - children = ( - 9C1EE0931A13A6E300BC502F /* DKCarouselView.h */, - 9C1EE0941A13A6E300BC502F /* DKCarouselView.m */, - ); - name = DKCarouselView; - path = ../../DKCarouselView; - sourceTree = ""; - }; - B5F2638B1E969FBA0032AB98 /* SDWebImage */ = { - isa = PBXGroup; - children = ( - B5F2638C1E969FBA0032AB98 /* FLAnimatedImage */, - B5F2638F1E969FBA0032AB98 /* NSData+ImageContentType.h */, - B5F263901E969FBA0032AB98 /* NSData+ImageContentType.m */, - B5F263911E969FBA0032AB98 /* NSImage+WebCache.h */, - B5F263921E969FBA0032AB98 /* NSImage+WebCache.m */, - B5F263931E969FBA0032AB98 /* SDImageCache.h */, - B5F263941E969FBA0032AB98 /* SDImageCache.m */, - B5F263951E969FBA0032AB98 /* SDImageCacheConfig.h */, - B5F263961E969FBA0032AB98 /* SDImageCacheConfig.m */, - B5F263971E969FBA0032AB98 /* SDWebImageCompat.h */, - B5F263981E969FBA0032AB98 /* SDWebImageCompat.m */, - B5F263991E969FBA0032AB98 /* SDWebImageDecoder.h */, - B5F2639A1E969FBA0032AB98 /* SDWebImageDecoder.m */, - B5F2639B1E969FBA0032AB98 /* SDWebImageDownloader.h */, - B5F2639C1E969FBA0032AB98 /* SDWebImageDownloader.m */, - B5F2639D1E969FBA0032AB98 /* SDWebImageDownloaderOperation.h */, - B5F2639E1E969FBA0032AB98 /* SDWebImageDownloaderOperation.m */, - B5F2639F1E969FBA0032AB98 /* SDWebImageManager.h */, - B5F263A01E969FBA0032AB98 /* SDWebImageManager.m */, - B5F263A11E969FBA0032AB98 /* SDWebImageOperation.h */, - B5F263A21E969FBA0032AB98 /* SDWebImagePrefetcher.h */, - B5F263A31E969FBA0032AB98 /* SDWebImagePrefetcher.m */, - B5F263A41E969FBA0032AB98 /* UIButton+WebCache.h */, - B5F263A51E969FBA0032AB98 /* UIButton+WebCache.m */, - B5F263A61E969FBA0032AB98 /* UIImage+GIF.h */, - B5F263A71E969FBA0032AB98 /* UIImage+GIF.m */, - B5F263A81E969FBA0032AB98 /* UIImage+MultiFormat.h */, - B5F263A91E969FBA0032AB98 /* UIImage+MultiFormat.m */, - B5F263AA1E969FBA0032AB98 /* UIImageView+HighlightedWebCache.h */, - B5F263AB1E969FBA0032AB98 /* UIImageView+HighlightedWebCache.m */, - B5F263AC1E969FBA0032AB98 /* UIImageView+WebCache.h */, - B5F263AD1E969FBA0032AB98 /* UIImageView+WebCache.m */, - B5F263AE1E969FBA0032AB98 /* UIView+WebCache.h */, - B5F263AF1E969FBA0032AB98 /* UIView+WebCache.m */, - B5F263B01E969FBA0032AB98 /* UIView+WebCacheOperation.h */, - B5F263B11E969FBA0032AB98 /* UIView+WebCacheOperation.m */, - ); - path = SDWebImage; - sourceTree = ""; - }; - B5F2638C1E969FBA0032AB98 /* FLAnimatedImage */ = { - isa = PBXGroup; - children = ( - B5F2638D1E969FBA0032AB98 /* FLAnimatedImageView+WebCache.h */, - B5F2638E1E969FBA0032AB98 /* FLAnimatedImageView+WebCache.m */, - ); - path = FLAnimatedImage; - sourceTree = ""; - }; - B5F263C41E969FCA0032AB98 /* FLAnimatedImage */ = { - isa = PBXGroup; - children = ( - B5F263C51E969FCA0032AB98 /* FLAnimatedImage */, - B5F263CA1E969FCA0032AB98 /* LICENSE */, - B5F263CB1E969FCA0032AB98 /* README.md */, - ); - path = FLAnimatedImage; - sourceTree = ""; - }; - B5F263C51E969FCA0032AB98 /* FLAnimatedImage */ = { - isa = PBXGroup; - children = ( - B5F263C61E969FCA0032AB98 /* FLAnimatedImage.h */, - B5F263C71E969FCA0032AB98 /* FLAnimatedImage.m */, - B5F263C81E969FCA0032AB98 /* FLAnimatedImageView.h */, - B5F263C91E969FCA0032AB98 /* FLAnimatedImageView.m */, - ); - path = FLAnimatedImage; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 9C1EE0371A13A6AF00BC502F /* DKCarouselViewDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9C1EE05B1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemo" */; - buildPhases = ( - 9C1EE0341A13A6AF00BC502F /* Sources */, - 9C1EE0351A13A6AF00BC502F /* Frameworks */, - 9C1EE0361A13A6AF00BC502F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DKCarouselViewDemo; - productName = DKCarouselViewDemo; - productReference = 9C1EE0381A13A6AF00BC502F /* DKCarouselViewDemo.app */; - productType = "com.apple.product-type.application"; - }; - 9C1EE0501A13A6AF00BC502F /* DKCarouselViewDemoTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9C1EE05E1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemoTests" */; - buildPhases = ( - 9C1EE04D1A13A6AF00BC502F /* Sources */, - 9C1EE04E1A13A6AF00BC502F /* Frameworks */, - 9C1EE04F1A13A6AF00BC502F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 9C1EE0531A13A6AF00BC502F /* PBXTargetDependency */, - ); - name = DKCarouselViewDemoTests; - productName = DKCarouselViewDemoTests; - productReference = 9C1EE0511A13A6AF00BC502F /* DKCarouselViewDemoTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 9C1EE0301A13A6AF00BC502F /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0810; - ORGANIZATIONNAME = zhangao; - TargetAttributes = { - 9C1EE0371A13A6AF00BC502F = { - CreatedOnToolsVersion = 6.1; - }; - 9C1EE0501A13A6AF00BC502F = { - CreatedOnToolsVersion = 6.1; - TestTargetID = 9C1EE0371A13A6AF00BC502F; - }; - }; - }; - buildConfigurationList = 9C1EE0331A13A6AF00BC502F /* Build configuration list for PBXProject "DKCarouselViewDemo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 9C1EE02F1A13A6AF00BC502F; - productRefGroup = 9C1EE0391A13A6AF00BC502F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 9C1EE0371A13A6AF00BC502F /* DKCarouselViewDemo */, - 9C1EE0501A13A6AF00BC502F /* DKCarouselViewDemoTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 9C1EE0361A13A6AF00BC502F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C1EE0471A13A6AF00BC502F /* Main.storyboard in Resources */, - 9C1EE04C1A13A6AF00BC502F /* LaunchScreen.xib in Resources */, - 9C1EE0491A13A6AF00BC502F /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9C1EE04F1A13A6AF00BC502F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 9C1EE0341A13A6AF00BC502F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C1EE0441A13A6AF00BC502F /* ViewController.m in Sources */, - B5F263C01E969FBA0032AB98 /* UIImageView+HighlightedWebCache.m in Sources */, - B5F263CC1E969FCA0032AB98 /* FLAnimatedImage.m in Sources */, - B5F263C21E969FBA0032AB98 /* UIView+WebCache.m in Sources */, - B5F263C11E969FBA0032AB98 /* UIImageView+WebCache.m in Sources */, - B5F263C31E969FBA0032AB98 /* UIView+WebCacheOperation.m in Sources */, - B5F263BB1E969FBA0032AB98 /* SDWebImageManager.m in Sources */, - B5F263B61E969FBA0032AB98 /* SDImageCacheConfig.m in Sources */, - B5F263BA1E969FBA0032AB98 /* SDWebImageDownloaderOperation.m in Sources */, - B5F263B41E969FBA0032AB98 /* NSImage+WebCache.m in Sources */, - B5F263BD1E969FBA0032AB98 /* UIButton+WebCache.m in Sources */, - B5F263CD1E969FCA0032AB98 /* FLAnimatedImageView.m in Sources */, - B5F263B21E969FBA0032AB98 /* FLAnimatedImageView+WebCache.m in Sources */, - B5F263BC1E969FBA0032AB98 /* SDWebImagePrefetcher.m in Sources */, - B5F263B91E969FBA0032AB98 /* SDWebImageDownloader.m in Sources */, - 9C1EE0411A13A6AF00BC502F /* AppDelegate.m in Sources */, - B5F263B81E969FBA0032AB98 /* SDWebImageDecoder.m in Sources */, - 9C1EE0951A13A6E300BC502F /* DKCarouselView.m in Sources */, - B5F263B31E969FBA0032AB98 /* NSData+ImageContentType.m in Sources */, - B5F263B71E969FBA0032AB98 /* SDWebImageCompat.m in Sources */, - 9C1EE03E1A13A6AF00BC502F /* main.m in Sources */, - B5F263B51E969FBA0032AB98 /* SDImageCache.m in Sources */, - B5F263BF1E969FBA0032AB98 /* UIImage+MultiFormat.m in Sources */, - B5F263BE1E969FBA0032AB98 /* UIImage+GIF.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9C1EE04D1A13A6AF00BC502F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C1EE0581A13A6AF00BC502F /* DKCarouselViewDemoTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 9C1EE0531A13A6AF00BC502F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9C1EE0371A13A6AF00BC502F /* DKCarouselViewDemo */; - targetProxy = 9C1EE0521A13A6AF00BC502F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 9C1EE0451A13A6AF00BC502F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 9C1EE0461A13A6AF00BC502F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 9C1EE04A1A13A6AF00BC502F /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 9C1EE04B1A13A6AF00BC502F /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 9C1EE0591A13A6AF00BC502F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 9C1EE05A1A13A6AF00BC502F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 9C1EE05C1A13A6AF00BC502F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = DKCarouselViewDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 9C1EE05D1A13A6AF00BC502F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = DKCarouselViewDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 9C1EE05F1A13A6AF00BC502F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = DKCarouselViewDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DKCarouselViewDemo.app/DKCarouselViewDemo"; - }; - name = Debug; - }; - 9C1EE0601A13A6AF00BC502F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = DKCarouselViewDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.zhangao.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DKCarouselViewDemo.app/DKCarouselViewDemo"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 9C1EE0331A13A6AF00BC502F /* Build configuration list for PBXProject "DKCarouselViewDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9C1EE0591A13A6AF00BC502F /* Debug */, - 9C1EE05A1A13A6AF00BC502F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9C1EE05B1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9C1EE05C1A13A6AF00BC502F /* Debug */, - 9C1EE05D1A13A6AF00BC502F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9C1EE05E1A13A6AF00BC502F /* Build configuration list for PBXNativeTarget "DKCarouselViewDemoTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9C1EE05F1A13A6AF00BC502F /* Debug */, - 9C1EE0601A13A6AF00BC502F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 9C1EE0301A13A6AF00BC502F /* Project object */; -} diff --git a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/DKCarouselViewDemo.xcscheme b/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/DKCarouselViewDemo.xcscheme deleted file mode 100644 index 3a021b3..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/DKCarouselViewDemo.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/xcschememanagement.plist b/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 4983b73..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj/xcuserdata/zhangao.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - DKCarouselViewDemo.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 9C1EE0371A13A6AF00BC502F - - primary - - - 9C1EE0501A13A6AF00BC502F - - primary - - - - - diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h b/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h deleted file mode 100644 index f056c3b..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h +++ /dev/null @@ -1,84 +0,0 @@ -// -// FLAnimatedImage.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import - -// Allow user classes conveniently just importing one header. -#import "FLAnimatedImageView.h" - - -#ifndef NS_DESIGNATED_INITIALIZER - #if __has_attribute(objc_designated_initializer) - #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) - #else - #define NS_DESIGNATED_INITIALIZER - #endif -#endif - -extern const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum; - -// -// An `FLAnimatedImage`'s job is to deliver frames in a highly performant way and works in conjunction with `FLAnimatedImageView`. -// It subclasses `NSObject` and not `UIImage` because it's only an "image" in the sense that a sea lion is a lion. -// It tries to intelligently choose the frame cache size depending on the image and memory situation with the goal to lower CPU usage for smaller ones, lower memory usage for larger ones and always deliver frames for high performant play-back. -// Note: `posterImage`, `size`, `loopCount`, `delayTimes` and `frameCount` don't change after successful initialization. -// -@interface FLAnimatedImage : NSObject - -@property (nonatomic, strong, readonly) UIImage *posterImage; // Guaranteed to be loaded; usually equivalent to `-imageLazilyCachedAtIndex:0` -@property (nonatomic, assign, readonly) CGSize size; // The `.posterImage`'s `.size` - -@property (nonatomic, assign, readonly) NSUInteger loopCount; // 0 means repeating the animation indefinitely -@property (nonatomic, strong, readonly) NSDictionary *delayTimesForIndexes; // Of type `NSTimeInterval` boxed in `NSNumber`s -@property (nonatomic, assign, readonly) NSUInteger frameCount; // Number of valid frames; equal to `[.delayTimes count]` - -@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeCurrent; // Current size of intelligently chosen buffer window; can range in the interval [1..frameCount] -@property (nonatomic, assign) NSUInteger frameCacheSizeMax; // Allow to cap the cache size; 0 means no specific limit (default) - -// Intended to be called from main thread synchronously; will return immediately. -// If the result isn't cached, will return `nil`; the caller should then pause playback, not increment frame counter and keep polling. -// After an initial loading time, depending on `frameCacheSize`, frames should be available immediately from the cache. -- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index; - -// Pass either a `UIImage` or an `FLAnimatedImage` and get back its size -+ (CGSize)sizeForImage:(id)image; - -// On success, the initializers return an `FLAnimatedImage` with all fields initialized, on failure they return `nil` and an error will be logged. -- (instancetype)initWithAnimatedGIFData:(NSData *)data; -// Pass 0 for optimalFrameCacheSize to get the default, predrawing is enabled by default. -- (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled NS_DESIGNATED_INITIALIZER; -+ (instancetype)animatedImageWithGIFData:(NSData *)data; - -@property (nonatomic, strong, readonly) NSData *data; // The data the receiver was initialized with; read-only - -@end - -typedef NS_ENUM(NSUInteger, FLLogLevel) { - FLLogLevelNone = 0, - FLLogLevelError, - FLLogLevelWarn, - FLLogLevelInfo, - FLLogLevelDebug, - FLLogLevelVerbose -}; - -@interface FLAnimatedImage (Logging) - -+ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel; -+ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level; - -@end - -#define FLLog(logLevel, format, ...) [FLAnimatedImage logStringFromBlock:^NSString *{ return [NSString stringWithFormat:(format), ## __VA_ARGS__]; } withLevel:(logLevel)] - -@interface FLWeakProxy : NSProxy - -+ (instancetype)weakProxyForObject:(id)targetObject; - -@end diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m b/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m deleted file mode 100755 index 3fdddc9..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m +++ /dev/null @@ -1,816 +0,0 @@ -// -// FLAnimatedImage.m -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import "FLAnimatedImage.h" -#import -#import - - -// From vm_param.h, define for iOS 8.0 or higher to build on device. -#ifndef BYTE_SIZE - #define BYTE_SIZE 8 // byte size in bits -#endif - -#define MEGABYTE (1024 * 1024) - -// This is how the fastest browsers do it as per 2012: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility -const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum = 0.02; - -// An animated image's data size (dimensions * frameCount) category; its value is the max allowed memory (in MB). -// E.g.: A 100x200px GIF with 30 frames is ~2.3MB in our pixel format and would fall into the `FLAnimatedImageDataSizeCategoryAll` category. -typedef NS_ENUM(NSUInteger, FLAnimatedImageDataSizeCategory) { - FLAnimatedImageDataSizeCategoryAll = 10, // All frames permanently in memory (be nice to the CPU) - FLAnimatedImageDataSizeCategoryDefault = 75, // A frame cache of default size in memory (usually real-time performance and keeping low memory profile) - FLAnimatedImageDataSizeCategoryOnDemand = 250, // Only keep one frame at the time in memory (easier on memory, slowest performance) - FLAnimatedImageDataSizeCategoryUnsupported // Even for one frame too large, computer says no. -}; - -typedef NS_ENUM(NSUInteger, FLAnimatedImageFrameCacheSize) { - FLAnimatedImageFrameCacheSizeNoLimit = 0, // 0 means no specific limit - FLAnimatedImageFrameCacheSizeLowMemory = 1, // The minimum frame cache size; this will produce frames on-demand. - FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning = 2, // If we can produce the frames faster than we consume, one frame ahead will already result in a stutter-free playback. - FLAnimatedImageFrameCacheSizeDefault = 5 // Build up a comfy buffer window to cope with CPU hiccups etc. -}; - - -#if defined(DEBUG) && DEBUG -@protocol FLAnimatedImageDebugDelegate -@optional -- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didUpdateCachedFrames:(NSIndexSet *)indexesOfFramesInCache; -- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didRequestCachedFrame:(NSUInteger)index; -- (CGFloat)debug_animatedImagePredrawingSlowdownFactor:(FLAnimatedImage *)animatedImage; -@end -#endif - - -@interface FLAnimatedImage () - -@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeOptimal; // The optimal number of frames to cache based on image size & number of frames; never changes -@property (nonatomic, assign, readonly, getter=isPredrawingEnabled) BOOL predrawingEnabled; // Enables predrawing of images to improve performance. -@property (nonatomic, assign) NSUInteger frameCacheSizeMaxInternal; // Allow to cap the cache size e.g. when memory warnings occur; 0 means no specific limit (default) -@property (nonatomic, assign) NSUInteger requestedFrameIndex; // Most recently requested frame index -@property (nonatomic, assign, readonly) NSUInteger posterImageFrameIndex; // Index of non-purgable poster image; never changes -@property (nonatomic, strong, readonly) NSMutableDictionary *cachedFramesForIndexes; -@property (nonatomic, strong, readonly) NSMutableIndexSet *cachedFrameIndexes; // Indexes of cached frames -@property (nonatomic, strong, readonly) NSMutableIndexSet *requestedFrameIndexes; // Indexes of frames that are currently produced in the background -@property (nonatomic, strong, readonly) NSIndexSet *allFramesIndexSet; // Default index set with the full range of indexes; never changes -@property (nonatomic, assign) NSUInteger memoryWarningCount; -@property (nonatomic, strong, readonly) dispatch_queue_t serialQueue; -@property (nonatomic, strong, readonly) __attribute__((NSObject)) CGImageSourceRef imageSource; - -// The weak proxy is used to break retain cycles with delayed actions from memory warnings. -// We are lying about the actual type here to gain static type checking and eliminate casts. -// The actual type of the object is `FLWeakProxy`. -@property (nonatomic, strong, readonly) FLAnimatedImage *weakProxy; - -#if defined(DEBUG) && DEBUG -@property (nonatomic, weak) id debug_delegate; -#endif - -@end - - -// For custom dispatching of memory warnings to avoid deallocation races since NSNotificationCenter doesn't retain objects it is notifying. -static NSHashTable *allAnimatedImagesWeak; - -@implementation FLAnimatedImage - -#pragma mark - Accessors -#pragma mark Public - -// This is the definite value the frame cache needs to size itself to. -- (NSUInteger)frameCacheSizeCurrent -{ - NSUInteger frameCacheSizeCurrent = self.frameCacheSizeOptimal; - - // If set, respect the caps. - if (self.frameCacheSizeMax > FLAnimatedImageFrameCacheSizeNoLimit) { - frameCacheSizeCurrent = MIN(frameCacheSizeCurrent, self.frameCacheSizeMax); - } - - if (self.frameCacheSizeMaxInternal > FLAnimatedImageFrameCacheSizeNoLimit) { - frameCacheSizeCurrent = MIN(frameCacheSizeCurrent, self.frameCacheSizeMaxInternal); - } - - return frameCacheSizeCurrent; -} - - -- (void)setFrameCacheSizeMax:(NSUInteger)frameCacheSizeMax -{ - if (_frameCacheSizeMax != frameCacheSizeMax) { - - // Remember whether the new cap will cause the current cache size to shrink; then we'll make sure to purge from the cache if needed. - BOOL willFrameCacheSizeShrink = (frameCacheSizeMax < self.frameCacheSizeCurrent); - - // Update the value - _frameCacheSizeMax = frameCacheSizeMax; - - if (willFrameCacheSizeShrink) { - [self purgeFrameCacheIfNeeded]; - } - } -} - - -#pragma mark Private - -- (void)setFrameCacheSizeMaxInternal:(NSUInteger)frameCacheSizeMaxInternal -{ - if (_frameCacheSizeMaxInternal != frameCacheSizeMaxInternal) { - - // Remember whether the new cap will cause the current cache size to shrink; then we'll make sure to purge from the cache if needed. - BOOL willFrameCacheSizeShrink = (frameCacheSizeMaxInternal < self.frameCacheSizeCurrent); - - // Update the value - _frameCacheSizeMaxInternal = frameCacheSizeMaxInternal; - - if (willFrameCacheSizeShrink) { - [self purgeFrameCacheIfNeeded]; - } - } -} - - -#pragma mark - Life Cycle - -+ (void)initialize -{ - if (self == [FLAnimatedImage class]) { - // UIKit memory warning notification handler shared by all of the instances - allAnimatedImagesWeak = [NSHashTable weakObjectsHashTable]; - - [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:nil usingBlock:^(NSNotification *note) { - // UIKit notifications are posted on the main thread. didReceiveMemoryWarning: is expecting the main run loop, and we don't lock on allAnimatedImagesWeak - NSAssert([NSThread isMainThread], @"Received memory warning on non-main thread"); - // Get a strong reference to all of the images. If an instance is returned in this array, it is still live and has not entered dealloc. - // Note that FLAnimatedImages can be created on any thread, so the hash table must be locked. - NSArray *images = nil; - @synchronized(allAnimatedImagesWeak) { - images = [[allAnimatedImagesWeak allObjects] copy]; - } - // Now issue notifications to all of the images while holding a strong reference to them - [images makeObjectsPerformSelector:@selector(didReceiveMemoryWarning:) withObject:note]; - }]; - } -} - - -- (instancetype)init -{ - FLAnimatedImage *animatedImage = [self initWithAnimatedGIFData:nil]; - if (!animatedImage) { - FLLog(FLLogLevelError, @"Use `-initWithAnimatedGIFData:` and supply the animated GIF data as an argument to initialize an object of type `FLAnimatedImage`."); - } - return animatedImage; -} - - -- (instancetype)initWithAnimatedGIFData:(NSData *)data -{ - return [self initWithAnimatedGIFData:data optimalFrameCacheSize:0 predrawingEnabled:YES]; -} - -- (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled -{ - // Early return if no data supplied! - BOOL hasData = ([data length] > 0); - if (!hasData) { - FLLog(FLLogLevelError, @"No animated GIF data supplied."); - return nil; - } - - self = [super init]; - if (self) { - // Do one-time initializations of `readonly` properties directly to ivar to prevent implicit actions and avoid need for private `readwrite` property overrides. - - // Keep a strong reference to `data` and expose it read-only publicly. - // However, we will use the `_imageSource` as handler to the image data throughout our life cycle. - _data = data; - _predrawingEnabled = isPredrawingEnabled; - - // Initialize internal data structures - _cachedFramesForIndexes = [[NSMutableDictionary alloc] init]; - _cachedFrameIndexes = [[NSMutableIndexSet alloc] init]; - _requestedFrameIndexes = [[NSMutableIndexSet alloc] init]; - - // Note: We could leverage `CGImageSourceCreateWithURL` too to add a second initializer `-initWithAnimatedGIFContentsOfURL:`. - _imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, - (__bridge CFDictionaryRef)@{(NSString *)kCGImageSourceShouldCache: @NO}); - // Early return on failure! - if (!_imageSource) { - FLLog(FLLogLevelError, @"Failed to `CGImageSourceCreateWithData` for animated GIF data %@", data); - return nil; - } - - // Early return if not GIF! - CFStringRef imageSourceContainerType = CGImageSourceGetType(_imageSource); - BOOL isGIFData = UTTypeConformsTo(imageSourceContainerType, kUTTypeGIF); - if (!isGIFData) { - FLLog(FLLogLevelError, @"Supplied data is of type %@ and doesn't seem to be GIF data %@", imageSourceContainerType, data); - return nil; - } - - // Get `LoopCount` - // Note: 0 means repeating the animation indefinitely. - // Image properties example: - // { - // FileSize = 314446; - // "{GIF}" = { - // HasGlobalColorMap = 1; - // LoopCount = 0; - // }; - // } - NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(_imageSource, NULL); - _loopCount = [[[imageProperties objectForKey:(id)kCGImagePropertyGIFDictionary] objectForKey:(id)kCGImagePropertyGIFLoopCount] unsignedIntegerValue]; - - // Iterate through frame images - size_t imageCount = CGImageSourceGetCount(_imageSource); - NSUInteger skippedFrameCount = 0; - NSMutableDictionary *delayTimesForIndexesMutable = [NSMutableDictionary dictionaryWithCapacity:imageCount]; - for (size_t i = 0; i < imageCount; i++) { - @autoreleasepool { - CGImageRef frameImageRef = CGImageSourceCreateImageAtIndex(_imageSource, i, NULL); - if (frameImageRef) { - UIImage *frameImage = [UIImage imageWithCGImage:frameImageRef]; - // Check for valid `frameImage` before parsing its properties as frames can be corrupted (and `frameImage` even `nil` when `frameImageRef` was valid). - if (frameImage) { - // Set poster image - if (!self.posterImage) { - _posterImage = frameImage; - // Set its size to proxy our size. - _size = _posterImage.size; - // Remember index of poster image so we never purge it; also add it to the cache. - _posterImageFrameIndex = i; - [self.cachedFramesForIndexes setObject:self.posterImage forKey:@(self.posterImageFrameIndex)]; - [self.cachedFrameIndexes addIndex:self.posterImageFrameIndex]; - } - - // Get `DelayTime` - // Note: It's not in (1/100) of a second like still falsely described in the documentation as per iOS 8 (rdar://19507384) but in seconds stored as `kCFNumberFloat32Type`. - // Frame properties example: - // { - // ColorModel = RGB; - // Depth = 8; - // PixelHeight = 960; - // PixelWidth = 640; - // "{GIF}" = { - // DelayTime = "0.4"; - // UnclampedDelayTime = "0.4"; - // }; - // } - - NSDictionary *frameProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(_imageSource, i, NULL); - NSDictionary *framePropertiesGIF = [frameProperties objectForKey:(id)kCGImagePropertyGIFDictionary]; - - // Try to use the unclamped delay time; fall back to the normal delay time. - NSNumber *delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFUnclampedDelayTime]; - if (!delayTime) { - delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFDelayTime]; - } - // If we don't get a delay time from the properties, fall back to `kDelayTimeIntervalDefault` or carry over the preceding frame's value. - const NSTimeInterval kDelayTimeIntervalDefault = 0.1; - if (!delayTime) { - if (i == 0) { - FLLog(FLLogLevelInfo, @"Falling back to default delay time for first frame %@ because none found in GIF properties %@", frameImage, frameProperties); - delayTime = @(kDelayTimeIntervalDefault); - } else { - FLLog(FLLogLevelInfo, @"Falling back to preceding delay time for frame %zu %@ because none found in GIF properties %@", i, frameImage, frameProperties); - delayTime = delayTimesForIndexesMutable[@(i - 1)]; - } - } - // Support frame delays as low as `kFLAnimatedImageDelayTimeIntervalMinimum`, with anything below being rounded up to `kDelayTimeIntervalDefault` for legacy compatibility. - // To support the minimum even when rounding errors occur, use an epsilon when comparing. We downcast to float because that's what we get for delayTime from ImageIO. - if ([delayTime floatValue] < ((float)kFLAnimatedImageDelayTimeIntervalMinimum - FLT_EPSILON)) { - FLLog(FLLogLevelInfo, @"Rounding frame %zu's `delayTime` from %f up to default %f (minimum supported: %f).", i, [delayTime floatValue], kDelayTimeIntervalDefault, kFLAnimatedImageDelayTimeIntervalMinimum); - delayTime = @(kDelayTimeIntervalDefault); - } - delayTimesForIndexesMutable[@(i)] = delayTime; - } else { - skippedFrameCount++; - FLLog(FLLogLevelInfo, @"Dropping frame %zu because valid `CGImageRef` %@ did result in `nil`-`UIImage`.", i, frameImageRef); - } - CFRelease(frameImageRef); - } else { - skippedFrameCount++; - FLLog(FLLogLevelInfo, @"Dropping frame %zu because failed to `CGImageSourceCreateImageAtIndex` with image source %@", i, _imageSource); - } - } - } - _delayTimesForIndexes = [delayTimesForIndexesMutable copy]; - _frameCount = imageCount; - - if (self.frameCount == 0) { - FLLog(FLLogLevelInfo, @"Failed to create any valid frames for GIF with properties %@", imageProperties); - return nil; - } else if (self.frameCount == 1) { - // Warn when we only have a single frame but return a valid GIF. - FLLog(FLLogLevelInfo, @"Created valid GIF but with only a single frame. Image properties: %@", imageProperties); - } else { - // We have multiple frames, rock on! - } - - // If no value is provided, select a default based on the GIF. - if (optimalFrameCacheSize == 0) { - // Calculate the optimal frame cache size: try choosing a larger buffer window depending on the predicted image size. - // It's only dependent on the image size & number of frames and never changes. - CGFloat animatedImageDataSize = CGImageGetBytesPerRow(self.posterImage.CGImage) * self.size.height * (self.frameCount - skippedFrameCount) / MEGABYTE; - if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryAll) { - _frameCacheSizeOptimal = self.frameCount; - } else if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryDefault) { - // This value doesn't depend on device memory much because if we're not keeping all frames in memory we will always be decoding 1 frame up ahead per 1 frame that gets played and at this point we might as well just keep a small buffer just large enough to keep from running out of frames. - _frameCacheSizeOptimal = FLAnimatedImageFrameCacheSizeDefault; - } else { - // The predicted size exceeds the limits to build up a cache and we go into low memory mode from the beginning. - _frameCacheSizeOptimal = FLAnimatedImageFrameCacheSizeLowMemory; - } - } else { - // Use the provided value. - _frameCacheSizeOptimal = optimalFrameCacheSize; - } - // In any case, cap the optimal cache size at the frame count. - _frameCacheSizeOptimal = MIN(_frameCacheSizeOptimal, self.frameCount); - - // Convenience/minor performance optimization; keep an index set handy with the full range to return in `-frameIndexesToCache`. - _allFramesIndexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(0, self.frameCount)]; - - // See the property declarations for descriptions. - _weakProxy = (id)[FLWeakProxy weakProxyForObject:self]; - - // Register this instance in the weak table for memory notifications. The NSHashTable will clean up after itself when we're gone. - // Note that FLAnimatedImages can be created on any thread, so the hash table must be locked. - @synchronized(allAnimatedImagesWeak) { - [allAnimatedImagesWeak addObject:self]; - } - } - return self; -} - - -+ (instancetype)animatedImageWithGIFData:(NSData *)data -{ - FLAnimatedImage *animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:data]; - return animatedImage; -} - - -- (void)dealloc -{ - if (_weakProxy) { - [NSObject cancelPreviousPerformRequestsWithTarget:_weakProxy]; - } - - if (_imageSource) { - CFRelease(_imageSource); - } -} - - -#pragma mark - Public Methods - -// See header for more details. -// Note: both consumer and producer are throttled: consumer by frame timings and producer by the available memory (max buffer window size). -- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index -{ - // Early return if the requested index is beyond bounds. - // Note: We're comparing an index with a count and need to bail on greater than or equal to. - if (index >= self.frameCount) { - FLLog(FLLogLevelWarn, @"Skipping requested frame %lu beyond bounds (total frame count: %lu) for animated image: %@", (unsigned long)index, (unsigned long)self.frameCount, self); - return nil; - } - - // Remember requested frame index, this influences what we should cache next. - self.requestedFrameIndex = index; -#if defined(DEBUG) && DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didRequestCachedFrame:)]) { - [self.debug_delegate debug_animatedImage:self didRequestCachedFrame:index]; - } -#endif - - // Quick check to avoid doing any work if we already have all possible frames cached, a common case. - if ([self.cachedFrameIndexes count] < self.frameCount) { - // If we have frames that should be cached but aren't and aren't requested yet, request them. - // Exclude existing cached frames, frames already requested, and specially cached poster image. - NSMutableIndexSet *frameIndexesToAddToCacheMutable = [self frameIndexesToCache]; - [frameIndexesToAddToCacheMutable removeIndexes:self.cachedFrameIndexes]; - [frameIndexesToAddToCacheMutable removeIndexes:self.requestedFrameIndexes]; - [frameIndexesToAddToCacheMutable removeIndex:self.posterImageFrameIndex]; - NSIndexSet *frameIndexesToAddToCache = [frameIndexesToAddToCacheMutable copy]; - - // Asynchronously add frames to our cache. - if ([frameIndexesToAddToCache count] > 0) { - [self addFrameIndexesToCache:frameIndexesToAddToCache]; - } - } - - // Get the specified image. - UIImage *image = self.cachedFramesForIndexes[@(index)]; - - // Purge if needed based on the current playhead position. - [self purgeFrameCacheIfNeeded]; - - return image; -} - - -// Only called once from `-imageLazilyCachedAtIndex` but factored into its own method for logical grouping. -- (void)addFrameIndexesToCache:(NSIndexSet *)frameIndexesToAddToCache -{ - // Order matters. First, iterate over the indexes starting from the requested frame index. - // Then, if there are any indexes before the requested frame index, do those. - NSRange firstRange = NSMakeRange(self.requestedFrameIndex, self.frameCount - self.requestedFrameIndex); - NSRange secondRange = NSMakeRange(0, self.requestedFrameIndex); - if (firstRange.length + secondRange.length != self.frameCount) { - FLLog(FLLogLevelWarn, @"Two-part frame cache range doesn't equal full range."); - } - - // Add to the requested list before we actually kick them off, so they don't get into the queue twice. - [self.requestedFrameIndexes addIndexes:frameIndexesToAddToCache]; - - // Lazily create dedicated isolation queue. - if (!self.serialQueue) { - _serialQueue = dispatch_queue_create("com.flipboard.framecachingqueue", DISPATCH_QUEUE_SERIAL); - } - - // Start streaming requested frames in the background into the cache. - // Avoid capturing self in the block as there's no reason to keep doing work if the animated image went away. - FLAnimatedImage * __weak weakSelf = self; - dispatch_async(self.serialQueue, ^{ - // Produce and cache next needed frame. - void (^frameRangeBlock)(NSRange, BOOL *) = ^(NSRange range, BOOL *stop) { - // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. - for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { -#if defined(DEBUG) && DEBUG - CFTimeInterval predrawBeginTime = CACurrentMediaTime(); -#endif - UIImage *image = [weakSelf imageAtIndex:i]; -#if defined(DEBUG) && DEBUG - CFTimeInterval predrawDuration = CACurrentMediaTime() - predrawBeginTime; - CFTimeInterval slowdownDuration = 0.0; - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImagePredrawingSlowdownFactor:)]) { - CGFloat predrawingSlowdownFactor = [self.debug_delegate debug_animatedImagePredrawingSlowdownFactor:self]; - slowdownDuration = predrawDuration * predrawingSlowdownFactor - predrawDuration; - [NSThread sleepForTimeInterval:slowdownDuration]; - } - FLLog(FLLogLevelVerbose, @"Predrew frame %lu in %f ms for animated image: %@", (unsigned long)i, (predrawDuration + slowdownDuration) * 1000, self); -#endif - // The results get returned one by one as soon as they're ready (and not in batch). - // The benefits of having the first frames as quick as possible outweigh building up a buffer to cope with potential hiccups when the CPU suddenly gets busy. - if (image && weakSelf) { - dispatch_async(dispatch_get_main_queue(), ^{ - weakSelf.cachedFramesForIndexes[@(i)] = image; - [weakSelf.cachedFrameIndexes addIndex:i]; - [weakSelf.requestedFrameIndexes removeIndex:i]; -#if defined(DEBUG) && DEBUG - if ([weakSelf.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { - [weakSelf.debug_delegate debug_animatedImage:weakSelf didUpdateCachedFrames:weakSelf.cachedFrameIndexes]; - } -#endif - }); - } - } - }; - - [frameIndexesToAddToCache enumerateRangesInRange:firstRange options:0 usingBlock:frameRangeBlock]; - [frameIndexesToAddToCache enumerateRangesInRange:secondRange options:0 usingBlock:frameRangeBlock]; - }); -} - - -+ (CGSize)sizeForImage:(id)image -{ - CGSize imageSize = CGSizeZero; - - // Early return for nil - if (!image) { - return imageSize; - } - - if ([image isKindOfClass:[UIImage class]]) { - UIImage *uiImage = (UIImage *)image; - imageSize = uiImage.size; - } else if ([image isKindOfClass:[FLAnimatedImage class]]) { - FLAnimatedImage *animatedImage = (FLAnimatedImage *)image; - imageSize = animatedImage.size; - } else { - // Bear trap to capture bad images; we have seen crashers cropping up on iOS 7. - FLLog(FLLogLevelError, @"`image` isn't of expected types `UIImage` or `FLAnimatedImage`: %@", image); - } - - return imageSize; -} - - -#pragma mark - Private Methods -#pragma mark Frame Loading - -- (UIImage *)imageAtIndex:(NSUInteger)index -{ - // It's very important to use the cached `_imageSource` since the random access to a frame with `CGImageSourceCreateImageAtIndex` turns from an O(1) into an O(n) operation when re-initializing the image source every time. - CGImageRef imageRef = CGImageSourceCreateImageAtIndex(_imageSource, index, NULL); - - // Early return for nil - if (!imageRef) { - return nil; - } - - UIImage *image = [UIImage imageWithCGImage:imageRef]; - CFRelease(imageRef); - - // Loading in the image object is only half the work, the displaying image view would still have to synchronosly wait and decode the image, so we go ahead and do that here on the background thread. - if (self.isPredrawingEnabled) { - image = [[self class] predrawnImageFromImage:image]; - } - - return image; -} - - -#pragma mark Frame Caching - -- (NSMutableIndexSet *)frameIndexesToCache -{ - NSMutableIndexSet *indexesToCache = nil; - // Quick check to avoid building the index set if the number of frames to cache equals the total frame count. - if (self.frameCacheSizeCurrent == self.frameCount) { - indexesToCache = [self.allFramesIndexSet mutableCopy]; - } else { - indexesToCache = [[NSMutableIndexSet alloc] init]; - - // Add indexes to the set in two separate blocks- the first starting from the requested frame index, up to the limit or the end. - // The second, if needed, the remaining number of frames beginning at index zero. - NSUInteger firstLength = MIN(self.frameCacheSizeCurrent, self.frameCount - self.requestedFrameIndex); - NSRange firstRange = NSMakeRange(self.requestedFrameIndex, firstLength); - [indexesToCache addIndexesInRange:firstRange]; - NSUInteger secondLength = self.frameCacheSizeCurrent - firstLength; - if (secondLength > 0) { - NSRange secondRange = NSMakeRange(0, secondLength); - [indexesToCache addIndexesInRange:secondRange]; - } - // Double check our math, before we add the poster image index which may increase it by one. - if ([indexesToCache count] != self.frameCacheSizeCurrent) { - FLLog(FLLogLevelWarn, @"Number of frames to cache doesn't equal expected cache size."); - } - - [indexesToCache addIndex:self.posterImageFrameIndex]; - } - - return indexesToCache; -} - - -- (void)purgeFrameCacheIfNeeded -{ - // Purge frames that are currently cached but don't need to be. - // But not if we're still under the number of frames to cache. - // This way, if all frames are allowed to be cached (the common case), we can skip all the `NSIndexSet` math below. - if ([self.cachedFrameIndexes count] > self.frameCacheSizeCurrent) { - NSMutableIndexSet *indexesToPurge = [self.cachedFrameIndexes mutableCopy]; - [indexesToPurge removeIndexes:[self frameIndexesToCache]]; - [indexesToPurge enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. - for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { - [self.cachedFrameIndexes removeIndex:i]; - [self.cachedFramesForIndexes removeObjectForKey:@(i)]; - // Note: Don't `CGImageSourceRemoveCacheAtIndex` on the image source for frames that we don't want cached any longer to maintain O(1) time access. -#if defined(DEBUG) && DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self.debug_delegate debug_animatedImage:self didUpdateCachedFrames:self.cachedFrameIndexes]; - }); - } -#endif - } - }]; - } -} - - -- (void)growFrameCacheSizeAfterMemoryWarning:(NSNumber *)frameCacheSize -{ - self.frameCacheSizeMaxInternal = [frameCacheSize unsignedIntegerValue]; - FLLog(FLLogLevelDebug, @"Grew frame cache size max to %lu after memory warning for animated image: %@", (unsigned long)self.frameCacheSizeMaxInternal, self); - - // Schedule resetting the frame cache size max completely after a while. - const NSTimeInterval kResetDelay = 3.0; - [self.weakProxy performSelector:@selector(resetFrameCacheSizeMaxInternal) withObject:nil afterDelay:kResetDelay]; -} - - -- (void)resetFrameCacheSizeMaxInternal -{ - self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeNoLimit; - FLLog(FLLogLevelDebug, @"Reset frame cache size max (current frame cache size: %lu) for animated image: %@", (unsigned long)self.frameCacheSizeCurrent, self); -} - - -#pragma mark System Memory Warnings Notification Handler - -- (void)didReceiveMemoryWarning:(NSNotification *)notification -{ - self.memoryWarningCount++; - - // If we were about to grow larger, but got rapped on our knuckles by the system again, cancel. - [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(growFrameCacheSizeAfterMemoryWarning:) object:@(FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning)]; - [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(resetFrameCacheSizeMaxInternal) object:nil]; - - // Go down to the minimum and by that implicitly immediately purge from the cache if needed to not get jettisoned by the system and start producing frames on-demand. - FLLog(FLLogLevelDebug, @"Attempt setting frame cache size max to %lu (previous was %lu) after memory warning #%lu for animated image: %@", (unsigned long)FLAnimatedImageFrameCacheSizeLowMemory, (unsigned long)self.frameCacheSizeMaxInternal, (unsigned long)self.memoryWarningCount, self); - self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeLowMemory; - - // Schedule growing larger again after a while, but cap our attempts to prevent a periodic sawtooth wave (ramps upward and then sharply drops) of memory usage. - // - // [mem]^ (2) (5) (6) 1) Loading frames for the first time - // (*)| , , , 2) Mem warning #1; purge cache - // | /| (4)/| /| 3) Grow cache size a bit after a while, if no mem warning occurs - // | / | _/ | _/ | 4) Try to grow cache size back to optimum after a while, if no mem warning occurs - // |(1)/ |_/ |/ |__(7) 5) Mem warning #2; purge cache - // |__/ (3) 6) After repetition of (3) and (4), mem warning #3; purge cache - // +----------------------> 7) After 3 mem warnings, stay at minimum cache size - // [t] - // *) The mem high water mark before we get warned might change for every cycle. - // - const NSUInteger kGrowAttemptsMax = 2; - const NSTimeInterval kGrowDelay = 2.0; - if ((self.memoryWarningCount - 1) <= kGrowAttemptsMax) { - [self.weakProxy performSelector:@selector(growFrameCacheSizeAfterMemoryWarning:) withObject:@(FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning) afterDelay:kGrowDelay]; - } - - // Note: It's not possible to get the level of a memory warning with a public API: http://stackoverflow.com/questions/2915247/iphone-os-memory-warnings-what-do-the-different-levels-mean/2915477#2915477 -} - - -#pragma mark Image Decoding - -// Decodes the image's data and draws it off-screen fully in memory; it's thread-safe and hence can be called on a background thread. -// On success, the returned object is a new `UIImage` instance with the same content as the one passed in. -// On failure, the returned object is the unchanged passed in one; the data will not be predrawn in memory though and an error will be logged. -// First inspired by & good Karma to: https://gist.github.com/steipete/1144242 -+ (UIImage *)predrawnImageFromImage:(UIImage *)imageToPredraw -{ - // Always use a device RGB color space for simplicity and predictability what will be going on. - CGColorSpaceRef colorSpaceDeviceRGBRef = CGColorSpaceCreateDeviceRGB(); - // Early return on failure! - if (!colorSpaceDeviceRGBRef) { - FLLog(FLLogLevelError, @"Failed to `CGColorSpaceCreateDeviceRGB` for image %@", imageToPredraw); - return imageToPredraw; - } - - // Even when the image doesn't have transparency, we have to add the extra channel because Quartz doesn't support other pixel formats than 32 bpp/8 bpc for RGB: - // kCGImageAlphaNoneSkipFirst, kCGImageAlphaNoneSkipLast, kCGImageAlphaPremultipliedFirst, kCGImageAlphaPremultipliedLast - // (source: docs "Quartz 2D Programming Guide > Graphics Contexts > Table 2-1 Pixel formats supported for bitmap graphics contexts") - size_t numberOfComponents = CGColorSpaceGetNumberOfComponents(colorSpaceDeviceRGBRef) + 1; // 4: RGB + A - - // "In iOS 4.0 and later, and OS X v10.6 and later, you can pass NULL if you want Quartz to allocate memory for the bitmap." (source: docs) - void *data = NULL; - size_t width = imageToPredraw.size.width; - size_t height = imageToPredraw.size.height; - size_t bitsPerComponent = CHAR_BIT; - - size_t bitsPerPixel = (bitsPerComponent * numberOfComponents); - size_t bytesPerPixel = (bitsPerPixel / BYTE_SIZE); - size_t bytesPerRow = (bytesPerPixel * width); - - CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; - - CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageToPredraw.CGImage); - // If the alpha info doesn't match to one of the supported formats (see above), pick a reasonable supported one. - // "For bitmaps created in iOS 3.2 and later, the drawing environment uses the premultiplied ARGB format to store the bitmap data." (source: docs) - if (alphaInfo == kCGImageAlphaNone || alphaInfo == kCGImageAlphaOnly) { - alphaInfo = kCGImageAlphaNoneSkipFirst; - } else if (alphaInfo == kCGImageAlphaFirst) { - alphaInfo = kCGImageAlphaPremultipliedFirst; - } else if (alphaInfo == kCGImageAlphaLast) { - alphaInfo = kCGImageAlphaPremultipliedLast; - } - // "The constants for specifying the alpha channel information are declared with the `CGImageAlphaInfo` type but can be passed to this parameter safely." (source: docs) - bitmapInfo |= alphaInfo; - - // Create our own graphics context to draw to; `UIGraphicsGetCurrentContext`/`UIGraphicsBeginImageContextWithOptions` doesn't create a new context but returns the current one which isn't thread-safe (e.g. main thread could use it at the same time). - // Note: It's not worth caching the bitmap context for multiple frames ("unique key" would be `width`, `height` and `hasAlpha`), it's ~50% slower. Time spent in libRIP's `CGSBlendBGRA8888toARGB8888` suddenly shoots up -- not sure why. - CGContextRef bitmapContextRef = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, colorSpaceDeviceRGBRef, bitmapInfo); - CGColorSpaceRelease(colorSpaceDeviceRGBRef); - // Early return on failure! - if (!bitmapContextRef) { - FLLog(FLLogLevelError, @"Failed to `CGBitmapContextCreate` with color space %@ and parameters (width: %zu height: %zu bitsPerComponent: %zu bytesPerRow: %zu) for image %@", colorSpaceDeviceRGBRef, width, height, bitsPerComponent, bytesPerRow, imageToPredraw); - return imageToPredraw; - } - - // Draw image in bitmap context and create image by preserving receiver's properties. - CGContextDrawImage(bitmapContextRef, CGRectMake(0.0, 0.0, imageToPredraw.size.width, imageToPredraw.size.height), imageToPredraw.CGImage); - CGImageRef predrawnImageRef = CGBitmapContextCreateImage(bitmapContextRef); - UIImage *predrawnImage = [UIImage imageWithCGImage:predrawnImageRef scale:imageToPredraw.scale orientation:imageToPredraw.imageOrientation]; - CGImageRelease(predrawnImageRef); - CGContextRelease(bitmapContextRef); - - // Early return on failure! - if (!predrawnImage) { - FLLog(FLLogLevelError, @"Failed to `imageWithCGImage:scale:orientation:` with image ref %@ created with color space %@ and bitmap context %@ and properties and properties (scale: %f orientation: %ld) for image %@", predrawnImageRef, colorSpaceDeviceRGBRef, bitmapContextRef, imageToPredraw.scale, (long)imageToPredraw.imageOrientation, imageToPredraw); - return imageToPredraw; - } - - return predrawnImage; -} - - -#pragma mark - Description - -- (NSString *)description -{ - NSString *description = [super description]; - - description = [description stringByAppendingFormat:@" size=%@", NSStringFromCGSize(self.size)]; - description = [description stringByAppendingFormat:@" frameCount=%lu", (unsigned long)self.frameCount]; - - return description; -} - - -@end - -#pragma mark - Logging - -@implementation FLAnimatedImage (Logging) - -static void (^_logBlock)(NSString *logString, FLLogLevel logLevel) = nil; -static FLLogLevel _logLevel; - -+ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel -{ - _logBlock = logBlock; - _logLevel = logLevel; -} - -+ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level -{ - if (level <= _logLevel && _logBlock && stringBlock) { - _logBlock(stringBlock(), level); - } -} - -@end - - -#pragma mark - FLWeakProxy - -@interface FLWeakProxy () - -@property (nonatomic, weak) id target; - -@end - - -@implementation FLWeakProxy - -#pragma mark Life Cycle - -// This is the designated creation method of an `FLWeakProxy` and -// as a subclass of `NSProxy` it doesn't respond to or need `-init`. -+ (instancetype)weakProxyForObject:(id)targetObject -{ - FLWeakProxy *weakProxy = [FLWeakProxy alloc]; - weakProxy.target = targetObject; - return weakProxy; -} - - -#pragma mark Forwarding Messages - -- (id)forwardingTargetForSelector:(SEL)selector -{ - // Keep it lightweight: access the ivar directly - return _target; -} - - -#pragma mark - NSWeakProxy Method Overrides -#pragma mark Handling Unimplemented Methods - -- (void)forwardInvocation:(NSInvocation *)invocation -{ - // Fallback for when target is nil. Don't do anything, just return 0/NULL/nil. - // The method signature we've received to get here is just a dummy to keep `doesNotRecognizeSelector:` from firing. - // We can't really handle struct return types here because we don't know the length. - void *nullPointer = NULL; - [invocation setReturnValue:&nullPointer]; -} - - -- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector -{ - // We only get here if `forwardingTargetForSelector:` returns nil. - // In that case, our weak target has been reclaimed. Return a dummy method signature to keep `doesNotRecognizeSelector:` from firing. - // We'll emulate the Obj-c messaging nil behavior by setting the return value to nil in `forwardInvocation:`, but we'll assume that the return value is `sizeof(void *)`. - // Other libraries handle this situation by making use of a global method signature cache, but that seems heavier than necessary and has issues as well. - // See https://www.mikeash.com/pyblog/friday-qa-2010-02-26-futures.html and https://github.com/steipete/PSTDelegateProxy/issues/1 for examples of using a method signature cache. - return [NSObject instanceMethodSignatureForSelector:@selector(init)]; -} - - -@end diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h b/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h deleted file mode 100644 index c0d527a..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// FLAnimatedImageView.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import - -@class FLAnimatedImage; -@protocol FLAnimatedImageViewDebugDelegate; - - -// -// An `FLAnimatedImageView` can take an `FLAnimatedImage` and plays it automatically when in view hierarchy and stops when removed. -// The animation can also be controlled with the `UIImageView` methods `-start/stop/isAnimating`. -// It is a fully compatible `UIImageView` subclass and can be used as a drop-in component to work with existing code paths expecting to display a `UIImage`. -// Under the hood it uses a `CADisplayLink` for playback, which can be inspected with `currentFrame` & `currentFrameIndex`. -// -@interface FLAnimatedImageView : UIImageView - -// Setting `[UIImageView.image]` to a non-`nil` value clears out existing `animatedImage`. -// And vice versa, setting `animatedImage` will initially populate the `[UIImageView.image]` to its `posterImage` and then start animating and hold `currentFrame`. -@property (nonatomic, strong) FLAnimatedImage *animatedImage; -@property (nonatomic, copy) void(^loopCompletionBlock)(NSUInteger loopCountRemaining); - -@property (nonatomic, strong, readonly) UIImage *currentFrame; -@property (nonatomic, assign, readonly) NSUInteger currentFrameIndex; - -// The animation runloop mode. Enables playback during scrolling by allowing timer events (i.e. animation) with NSRunLoopCommonModes. -// To keep scrolling smooth on single-core devices such as iPhone 3GS/4 and iPod Touch 4th gen, the default run loop mode is NSDefaultRunLoopMode. Otherwise, the default is NSDefaultRunLoopMode. -@property (nonatomic, copy) NSString *runLoopMode; - -@end diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m b/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m deleted file mode 100755 index ffbb658..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m +++ /dev/null @@ -1,437 +0,0 @@ -// -// FLAnimatedImageView.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import "FLAnimatedImageView.h" -#import "FLAnimatedImage.h" -#import - - -#if defined(DEBUG) && DEBUG -@protocol FLAnimatedImageViewDebugDelegate -@optional -- (void)debug_animatedImageView:(FLAnimatedImageView *)animatedImageView waitingForFrame:(NSUInteger)index duration:(NSTimeInterval)duration; -@end -#endif - - -@interface FLAnimatedImageView () - -// Override of public `readonly` properties as private `readwrite` -@property (nonatomic, strong, readwrite) UIImage *currentFrame; -@property (nonatomic, assign, readwrite) NSUInteger currentFrameIndex; - -@property (nonatomic, assign) NSUInteger loopCountdown; -@property (nonatomic, assign) NSTimeInterval accumulator; -@property (nonatomic, strong) CADisplayLink *displayLink; - -@property (nonatomic, assign) BOOL shouldAnimate; // Before checking this value, call `-updateShouldAnimate` whenever the animated image or visibility (window, superview, hidden, alpha) has changed. -@property (nonatomic, assign) BOOL needsDisplayWhenImageBecomesAvailable; - -#if defined(DEBUG) && DEBUG -@property (nonatomic, weak) id debug_delegate; -#endif - -@end - - -@implementation FLAnimatedImageView -@synthesize runLoopMode = _runLoopMode; - -#pragma mark - Initializers - -// -initWithImage: isn't documented as a designated initializer of UIImageView, but it actually seems to be. -// Using -initWithImage: doesn't call any of the other designated initializers. -- (instancetype)initWithImage:(UIImage *)image -{ - self = [super initWithImage:image]; - if (self) { - [self commonInit]; - } - return self; -} - -// -initWithImage:highlightedImage: also isn't documented as a designated initializer of UIImageView, but it doesn't call any other designated initializers. -- (instancetype)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage -{ - self = [super initWithImage:image highlightedImage:highlightedImage]; - if (self) { - [self commonInit]; - } - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self) { - [self commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder -{ - self = [super initWithCoder:aDecoder]; - if (self) { - [self commonInit]; - } - return self; -} - -- (void)commonInit -{ - self.runLoopMode = [[self class] defaultRunLoopMode]; -} - - -#pragma mark - Accessors -#pragma mark Public - -- (void)setAnimatedImage:(FLAnimatedImage *)animatedImage -{ - if (![_animatedImage isEqual:animatedImage]) { - if (animatedImage) { - // Clear out the image. - super.image = nil; - // Ensure disabled highlighting; it's not supported (see `-setHighlighted:`). - super.highlighted = NO; - // UIImageView seems to bypass some accessors when calculating its intrinsic content size, so this ensures its intrinsic content size comes from the animated image. - [self invalidateIntrinsicContentSize]; - } else { - // Stop animating before the animated image gets cleared out. - [self stopAnimating]; - } - - _animatedImage = animatedImage; - - self.currentFrame = animatedImage.posterImage; - self.currentFrameIndex = 0; - if (animatedImage.loopCount > 0) { - self.loopCountdown = animatedImage.loopCount; - } else { - self.loopCountdown = NSUIntegerMax; - } - self.accumulator = 0.0; - - // Start animating after the new animated image has been set. - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } - - [self.layer setNeedsDisplay]; - } -} - - -#pragma mark - Life Cycle - -- (void)dealloc -{ - // Removes the display link from all run loop modes. - [_displayLink invalidate]; -} - - -#pragma mark - UIView Method Overrides -#pragma mark Observing View-Related Changes - -- (void)didMoveToSuperview -{ - [super didMoveToSuperview]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - - -- (void)didMoveToWindow -{ - [super didMoveToWindow]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - -- (void)setAlpha:(CGFloat)alpha -{ - [super setAlpha:alpha]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - -- (void)setHidden:(BOOL)hidden -{ - [super setHidden:hidden]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - - -#pragma mark Auto Layout - -- (CGSize)intrinsicContentSize -{ - // Default to let UIImageView handle the sizing of its image, and anything else it might consider. - CGSize intrinsicContentSize = [super intrinsicContentSize]; - - // If we have have an animated image, use its image size. - // UIImageView's intrinsic content size seems to be the size of its image. The obvious approach, simply calling `-invalidateIntrinsicContentSize` when setting an animated image, results in UIImageView steadfastly returning `{UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric}` for its intrinsicContentSize. - // (Perhaps UIImageView bypasses its `-image` getter in its implementation of `-intrinsicContentSize`, as `-image` is not called after calling `-invalidateIntrinsicContentSize`.) - if (self.animatedImage) { - intrinsicContentSize = self.image.size; - } - - return intrinsicContentSize; -} - - -#pragma mark - UIImageView Method Overrides -#pragma mark Image Data - -- (UIImage *)image -{ - UIImage *image = nil; - if (self.animatedImage) { - // Initially set to the poster image. - image = self.currentFrame; - } else { - image = super.image; - } - return image; -} - - -- (void)setImage:(UIImage *)image -{ - if (image) { - // Clear out the animated image and implicitly pause animation playback. - self.animatedImage = nil; - } - - super.image = image; -} - - -#pragma mark Animating Images - -- (NSTimeInterval)frameDelayGreatestCommonDivisor -{ - // Presision is set to half of the `kFLAnimatedImageDelayTimeIntervalMinimum` in order to minimize frame dropping. - const NSTimeInterval kGreatestCommonDivisorPrecision = 2.0 / kFLAnimatedImageDelayTimeIntervalMinimum; - - NSArray *delays = self.animatedImage.delayTimesForIndexes.allValues; - - // Scales the frame delays by `kGreatestCommonDivisorPrecision` - // then converts it to an UInteger for in order to calculate the GCD. - NSUInteger scaledGCD = lrint([delays.firstObject floatValue] * kGreatestCommonDivisorPrecision); - for (NSNumber *value in delays) { - scaledGCD = gcd(lrint([value floatValue] * kGreatestCommonDivisorPrecision), scaledGCD); - } - - // Reverse to scale to get the value back into seconds. - return scaledGCD / kGreatestCommonDivisorPrecision; -} - - -static NSUInteger gcd(NSUInteger a, NSUInteger b) -{ - // http://en.wikipedia.org/wiki/Greatest_common_divisor - if (a < b) { - return gcd(b, a); - } else if (a == b) { - return b; - } - - while (true) { - NSUInteger remainder = a % b; - if (remainder == 0) { - return b; - } - a = b; - b = remainder; - } -} - - -- (void)startAnimating -{ - if (self.animatedImage) { - // Lazily create the display link. - if (!self.displayLink) { - // It is important to note the use of a weak proxy here to avoid a retain cycle. `-displayLinkWithTarget:selector:` - // will retain its target until it is invalidated. We use a weak proxy so that the image view will get deallocated - // independent of the display link's lifetime. Upon image view deallocation, we invalidate the display - // link which will lead to the deallocation of both the display link and the weak proxy. - FLWeakProxy *weakProxy = [FLWeakProxy weakProxyForObject:self]; - self.displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayDidRefresh:)]; - - [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:self.runLoopMode]; - } - - // Note: The display link's `.frameInterval` value of 1 (default) means getting callbacks at the refresh rate of the display (~60Hz). - // Setting it to 2 divides the frame rate by 2 and hence calls back at every other display refresh. - const NSTimeInterval kDisplayRefreshRate = 60.0; // 60Hz - self.displayLink.frameInterval = MAX([self frameDelayGreatestCommonDivisor] * kDisplayRefreshRate, 1); - - self.displayLink.paused = NO; - } else { - [super startAnimating]; - } -} - -- (void)setRunLoopMode:(NSString *)runLoopMode -{ - if (![@[NSDefaultRunLoopMode, NSRunLoopCommonModes] containsObject:runLoopMode]) { - NSAssert(NO, @"Invalid run loop mode: %@", runLoopMode); - _runLoopMode = [[self class] defaultRunLoopMode]; - } else { - _runLoopMode = runLoopMode; - } -} - -- (void)stopAnimating -{ - if (self.animatedImage) { - self.displayLink.paused = YES; - } else { - [super stopAnimating]; - } -} - - -- (BOOL)isAnimating -{ - BOOL isAnimating = NO; - if (self.animatedImage) { - isAnimating = self.displayLink && !self.displayLink.isPaused; - } else { - isAnimating = [super isAnimating]; - } - return isAnimating; -} - - -#pragma mark Highlighted Image Unsupport - -- (void)setHighlighted:(BOOL)highlighted -{ - // Highlighted image is unsupported for animated images, but implementing it breaks the image view when embedded in a UICollectionViewCell. - if (!self.animatedImage) { - [super setHighlighted:highlighted]; - } -} - - -#pragma mark - Private Methods -#pragma mark Animation - -// Don't repeatedly check our window & superview in `-displayDidRefresh:` for performance reasons. -// Just update our cached value whenever the animated image or visibility (window, superview, hidden, alpha) is changed. -- (void)updateShouldAnimate -{ - BOOL isVisible = self.window && self.superview && ![self isHidden] && self.alpha > 0.0; - self.shouldAnimate = self.animatedImage && isVisible; -} - - -- (void)displayDidRefresh:(CADisplayLink *)displayLink -{ - // If for some reason a wild call makes it through when we shouldn't be animating, bail. - // Early return! - if (!self.shouldAnimate) { - FLLog(FLLogLevelWarn, @"Trying to animate image when we shouldn't: %@", self); - return; - } - - NSNumber *delayTimeNumber = [self.animatedImage.delayTimesForIndexes objectForKey:@(self.currentFrameIndex)]; - // If we don't have a frame delay (e.g. corrupt frame), don't update the view but skip the playhead to the next frame (in else-block). - if (delayTimeNumber) { - NSTimeInterval delayTime = [delayTimeNumber floatValue]; - // If we have a nil image (e.g. waiting for frame), don't update the view nor playhead. - UIImage *image = [self.animatedImage imageLazilyCachedAtIndex:self.currentFrameIndex]; - if (image) { - FLLog(FLLogLevelVerbose, @"Showing frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); - self.currentFrame = image; - if (self.needsDisplayWhenImageBecomesAvailable) { - [self.layer setNeedsDisplay]; - self.needsDisplayWhenImageBecomesAvailable = NO; - } - - self.accumulator += displayLink.duration * displayLink.frameInterval; - - // While-loop first inspired by & good Karma to: https://github.com/ondalabs/OLImageView/blob/master/OLImageView.m - while (self.accumulator >= delayTime) { - self.accumulator -= delayTime; - self.currentFrameIndex++; - if (self.currentFrameIndex >= self.animatedImage.frameCount) { - // If we've looped the number of times that this animated image describes, stop looping. - self.loopCountdown--; - if (self.loopCompletionBlock) { - self.loopCompletionBlock(self.loopCountdown); - } - - if (self.loopCountdown == 0) { - [self stopAnimating]; - return; - } - self.currentFrameIndex = 0; - } - // Calling `-setNeedsDisplay` will just paint the current frame, not the new frame that we may have moved to. - // Instead, set `needsDisplayWhenImageBecomesAvailable` to `YES` -- this will paint the new image once loaded. - self.needsDisplayWhenImageBecomesAvailable = YES; - } - } else { - FLLog(FLLogLevelDebug, @"Waiting for frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); -#if defined(DEBUG) && DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImageView:waitingForFrame:duration:)]) { - [self.debug_delegate debug_animatedImageView:self waitingForFrame:self.currentFrameIndex duration:(NSTimeInterval)displayLink.duration * displayLink.frameInterval]; - } -#endif - } - } else { - self.currentFrameIndex++; - } -} - -+ (NSString *)defaultRunLoopMode -{ - // Key off `activeProcessorCount` (as opposed to `processorCount`) since the system could shut down cores in certain situations. - return [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode; -} - - -#pragma mark - CALayerDelegate (Informal) -#pragma mark Providing the Layer's Content - -- (void)displayLayer:(CALayer *)layer -{ - layer.contents = (__bridge id)self.image.CGImage; -} - - -@end diff --git a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/README.md b/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/README.md deleted file mode 100644 index 384122c..0000000 --- a/DKCarouselViewDemo/DKCarouselViewDemo/FLAnimatedImage/README.md +++ /dev/null @@ -1,103 +0,0 @@ -FLAnimatedImage is a performant animated GIF engine for iOS: - -- Plays multiple GIFs simultaneously with a playback speed comparable to desktop browsers -- Honors variable frame delays -- Behaves gracefully under memory pressure -- Eliminates delays or blocking during the first playback loop -- Interprets the frame delays of fast GIFs the same way modern browsers do - -It's a well-tested [component that powers all GIFs in Flipboard](http://engineering.flipboard.com/2014/05/animated-gif/). To understand its behavior it comes with an interactive demo: - -![Flipboard playing multiple GIFs](https://github.com/Flipboard/FLAnimatedImage/raw/master/images/flanimatedimage-demo-player.gif) - -## Who is this for? - -- Apps that don't support animated GIFs yet -- Apps that already support animated GIFs but want a higher performance solution -- People who want to tinker with the code ([the corresponding blog post](http://engineering.flipboard.com/2014/05/animated-gif/) is a great place to start; also see the *To Do* section below) - -## Installation & Usage - -FLAnimatedImage is a well encapsulated drop-in component. Simply replace your `UIImageView` instances with instances of `FLAnimatedImageView` to get animated GIF support. There is no central cache or state to manage. - -If using CocoaPods, the quickest way to try it out is to type this on the command line: - -```shell -$ pod try FLAnimatedImage -``` - -To add it to your app, copy the two classes `FLAnimatedImage.h/.m` and `FLAnimatedImageView.h/.m` into your Xcode project or add via [CocoaPods](http://cocoapods.org) by adding this to your Podfile: - -```ruby -pod 'FLAnimatedImage', '~> 1.0' -``` - -If using [Carthage](https://github.com/Carthage/Carthage), add following line into your `Cartfile` - -``` -github "Flipboard/FLAnimatedImage" -``` - -In your code, `#import "FLAnimatedImage.h"`, create an image from an animated GIF, and setup the image view to display it: - -```objective-c -FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif"]]]; -FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init]; -imageView.animatedImage = image; -imageView.frame = CGRectMake(0.0, 0.0, 100.0, 100.0); -[self.view addSubview:imageView]; -``` - -It's flexible to integrate in your custom image loading stack and backwards compatible to iOS 6. - -It uses ARC and the Apple frameworks `QuartzCore`, `ImageIO`, `MobileCoreServices`, and `CoreGraphics`. - -It is capable of fine-grained logging. A block can be set on `FLAnimatedImage` that's invoked when logging occurs with various log levels via the `+setLogBlock:logLevel:` method. For example: - -```objective-c -// Set up FLAnimatedImage logging. -[FLAnimatedImage setLogBlock:^(NSString *logString, FLLogLevel logLevel) { - // Using NSLog - NSLog(@"%@", logString); - - // ...or CocoaLumberjackLogger only logging warnings and errors - if (logLevel == FLLogLevelError) { - DDLogError(@"%@", logString); - } else if (logLevel == FLLogLevelWarn) { - DDLogWarn(@"%@", logString); - } -} logLevel:FLLogLevelWarn]; -``` - -Since FLAnimatedImage is licensed under MIT, it's compatible with the terms of using it for any app on the App Store. - -## To Do -- Support other animated image formats such as APNG or WebP (WebP support implemented [here](https://github.com/Flipboard/FLAnimatedImage/pull/86)) -- Integration into network libraries and image caches -- Investigate whether `FLAnimatedImage` should become a `UIImage` subclass -- Smarter buffering -- Bring demo app to iPhone - -This has successfully shipped to many people as is, but please do come with your questions, issues and pull requests! - -## Select apps using FLAnimatedImage -- [Dropbox](https://www.dropbox.com) -- [Medium](https://medium.com) -- [Facebook](https://facebook.com) -- [Pinterest](https://pinterest.com) -- [LiveBooth](http://www.liveboothapp.com) -- [Design Shots](https://itunes.apple.com/app/id792517951) -- [lWlVl Festival](http://lwlvl.com) -- [Close-up](http://closeu.pe) -- [Zip Code Finder](https://itunes.apple.com/app/id893031254) -- [getGIF](https://itunes.apple.com/app/id964784701) -- [Giffage](http://giffage.com) -- [Flipboard](https://flipboard.com) -- [Gifalicious](https://itunes.apple.com/us/app/gifalicious-see-your-gifs/id965346708?mt=8) -- [Slack](https://slack.com/) -- [Telegram](https://telegram.org/) -- [HashPhotos](https://itunes.apple.com/app/id685784609) -- [Ello](https://ello.co/) -- [Dumpert](http://dumpert.nl) - -If you're using FLAnimatedImage in your app please open a PR to add it to this list! diff --git a/DKCarouselViewDemo/SDWebImage/.DS_Store b/DKCarouselViewDemo/SDWebImage/.DS_Store deleted file mode 100644 index 9577423f5e16c2758baf310e79407246da3357f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK-D=w~6h2DR)$SO}#h|_PO<@3kCYWJ?wiiAF!(AgU3O16NpaQQTmvU-^tx zY|A`Q=rP_?K&^HrzeL$gHaGl_3aGVPptsbfU24&_^^*~L)NAn?{`|K#L_{v_A@dD2 z=^b#5Iux4~pD=#>#aP5!(WC=PD8f7)3h9KBX^vRB3nv=%&Z11u^D{cj(q6H?{!3Km zs`HN)9M^T+C(dDTDhELk7X4l$?0(X=i>8I@&#(=UXfd z8afGk`4DzyVQ(lx&yMjuole3x$R#Vl3QQ|7XR0-I{ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "FLAnimatedImageView+WebCache.h" - -#if SD_UIKIT -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" -#import "UIView+WebCache.h" -#import "NSData+ImageContentType.h" -#import "FLAnimatedImage.h" -#import "UIImageView+WebCache.h" - -@implementation FLAnimatedImageView (WebCache) - -- (void)sd_setImageWithURL:(nullable NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - __weak typeof(self)weakSelf = self; - [self sd_internalSetImageWithURL:url - placeholderImage:placeholder - options:options - operationKey:nil - setImageBlock:^(UIImage *image, NSData *imageData) { - SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:imageData]; - if (imageFormat == SDImageFormatGIF) { - weakSelf.animatedImage = [FLAnimatedImage animatedImageWithGIFData:imageData]; - weakSelf.image = nil; - } else { - weakSelf.image = image; - weakSelf.animatedImage = nil; - } - } - progress:progressBlock - completed:completedBlock]; -} - -@end - -#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.m deleted file mode 100644 index 7364715..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/NSData+ImageContentType.m +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Fabrice Aneche - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "NSData+ImageContentType.h" - - -@implementation NSData (ImageContentType) - -+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data { - if (!data) { - return SDImageFormatUndefined; - } - - uint8_t c; - [data getBytes:&c length:1]; - switch (c) { - case 0xFF: - return SDImageFormatJPEG; - case 0x89: - return SDImageFormatPNG; - case 0x47: - return SDImageFormatGIF; - case 0x49: - case 0x4D: - return SDImageFormatTIFF; - case 0x52: - // R as RIFF for WEBP - if (data.length < 12) { - return SDImageFormatUndefined; - } - - NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; - if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { - return SDImageFormatWebP; - } - } - return SDImageFormatUndefined; -} - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.h b/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.h deleted file mode 100644 index fd83527..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// SDImageCacheConfig.h -// SDWebImage -// -// Created by Bogdan on 09/09/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// - -#import -#import "SDWebImageCompat.h" - -@interface SDImageCacheConfig : NSObject - -/** - * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. - * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. - */ -@property (assign, nonatomic) BOOL shouldDecompressImages; - -/** - * disable iCloud backup [defaults to YES] - */ -@property (assign, nonatomic) BOOL shouldDisableiCloud; - -/** - * use memory cache [defaults to YES] - */ -@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; - -/** - * The maximum length of time to keep an image in the cache, in seconds - */ -@property (assign, nonatomic) NSInteger maxCacheAge; - -/** - * The maximum size of the cache, in bytes. - */ -@property (assign, nonatomic) NSUInteger maxCacheSize; - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.m deleted file mode 100644 index c154265..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDImageCacheConfig.m +++ /dev/null @@ -1,26 +0,0 @@ -// -// SDImageCacheConfig.m -// SDWebImage -// -// Created by Bogdan on 09/09/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// - -#import "SDImageCacheConfig.h" - -static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week - -@implementation SDImageCacheConfig - -- (instancetype)init { - if (self = [super init]) { - _shouldDecompressImages = YES; - _shouldDisableiCloud = YES; - _shouldCacheImagesInMemory = YES; - _maxCacheAge = kDefaultCacheMaxCacheAge; - _maxCacheSize = 0; - } - return self; -} - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.m deleted file mode 100644 index cf5e676..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDecoder.m +++ /dev/null @@ -1,279 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) james - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageDecoder.h" - -@implementation UIImage (ForceDecode) - -#if SD_UIKIT || SD_WATCH -static const size_t kBytesPerPixel = 4; -static const size_t kBitsPerComponent = 8; - -+ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { - if (![UIImage shouldDecodeImage:image]) { - return image; - } - - // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. - // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; - @autoreleasepool{ - - CGImageRef imageRef = image.CGImage; - CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:imageRef]; - - size_t width = CGImageGetWidth(imageRef); - size_t height = CGImageGetHeight(imageRef); - size_t bytesPerRow = kBytesPerPixel * width; - - // kCGImageAlphaNone is not supported in CGBitmapContextCreate. - // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast - // to create bitmap graphics contexts without alpha info. - CGContextRef context = CGBitmapContextCreate(NULL, - width, - height, - kBitsPerComponent, - bytesPerRow, - colorspaceRef, - kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); - if (context == NULL) { - return image; - } - - // Draw the image into the context and retrieve the new bitmap image without alpha - CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); - CGImageRef imageRefWithoutAlpha = CGBitmapContextCreateImage(context); - UIImage *imageWithoutAlpha = [UIImage imageWithCGImage:imageRefWithoutAlpha - scale:image.scale - orientation:image.imageOrientation]; - - CGContextRelease(context); - CGImageRelease(imageRefWithoutAlpha); - - return imageWithoutAlpha; - } -} - -/* - * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImages` is set - * Suggested value for iPad1 and iPhone 3GS: 60. - * Suggested value for iPad2 and iPhone 4: 120. - * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30. - */ -static const CGFloat kDestImageSizeMB = 60.0f; - -/* - * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImages` is set - * Suggested value for iPad1 and iPhone 3GS: 20. - * Suggested value for iPad2 and iPhone 4: 40. - * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10. - */ -static const CGFloat kSourceImageTileSizeMB = 20.0f; - -static const CGFloat kBytesPerMB = 1024.0f * 1024.0f; -static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel; -static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB; -static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB; - -static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet. - -+ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image { - if (![UIImage shouldDecodeImage:image]) { - return image; - } - - if (![UIImage shouldScaleDownImage:image]) { - return [UIImage decodedImageWithImage:image]; - } - - CGContextRef destContext; - - // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. - // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; - @autoreleasepool { - CGImageRef sourceImageRef = image.CGImage; - - CGSize sourceResolution = CGSizeZero; - sourceResolution.width = CGImageGetWidth(sourceImageRef); - sourceResolution.height = CGImageGetHeight(sourceImageRef); - float sourceTotalPixels = sourceResolution.width * sourceResolution.height; - // Determine the scale ratio to apply to the input image - // that results in an output image of the defined size. - // see kDestImageSizeMB, and how it relates to destTotalPixels. - float imageScale = kDestTotalPixels / sourceTotalPixels; - CGSize destResolution = CGSizeZero; - destResolution.width = (int)(sourceResolution.width*imageScale); - destResolution.height = (int)(sourceResolution.height*imageScale); - - // current color space - CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:sourceImageRef]; - - size_t bytesPerRow = kBytesPerPixel * destResolution.width; - - // Allocate enough pixel data to hold the output image. - void* destBitmapData = malloc( bytesPerRow * destResolution.height ); - if (destBitmapData == NULL) { - return image; - } - - // kCGImageAlphaNone is not supported in CGBitmapContextCreate. - // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast - // to create bitmap graphics contexts without alpha info. - destContext = CGBitmapContextCreate(destBitmapData, - destResolution.width, - destResolution.height, - kBitsPerComponent, - bytesPerRow, - colorspaceRef, - kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); - - if (destContext == NULL) { - free(destBitmapData); - return image; - } - CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh); - - // Now define the size of the rectangle to be used for the - // incremental blits from the input image to the output image. - // we use a source tile width equal to the width of the source - // image due to the way that iOS retrieves image data from disk. - // iOS must decode an image from disk in full width 'bands', even - // if current graphics context is clipped to a subrect within that - // band. Therefore we fully utilize all of the pixel data that results - // from a decoding opertion by achnoring our tile size to the full - // width of the input image. - CGRect sourceTile = CGRectZero; - sourceTile.size.width = sourceResolution.width; - // The source tile height is dynamic. Since we specified the size - // of the source tile in MB, see how many rows of pixels high it - // can be given the input image width. - sourceTile.size.height = (int)(kTileTotalPixels / sourceTile.size.width ); - sourceTile.origin.x = 0.0f; - // The output tile is the same proportions as the input tile, but - // scaled to image scale. - CGRect destTile; - destTile.size.width = destResolution.width; - destTile.size.height = sourceTile.size.height * imageScale; - destTile.origin.x = 0.0f; - // The source seem overlap is proportionate to the destination seem overlap. - // this is the amount of pixels to overlap each tile as we assemble the ouput image. - float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height); - CGImageRef sourceTileImageRef; - // calculate the number of read/write operations required to assemble the - // output image. - int iterations = (int)( sourceResolution.height / sourceTile.size.height ); - // If tile height doesn't divide the image height evenly, add another iteration - // to account for the remaining pixels. - int remainder = (int)sourceResolution.height % (int)sourceTile.size.height; - if(remainder) { - iterations++; - } - // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations. - float sourceTileHeightMinusOverlap = sourceTile.size.height; - sourceTile.size.height += sourceSeemOverlap; - destTile.size.height += kDestSeemOverlap; - for( int y = 0; y < iterations; ++y ) { - @autoreleasepool { - sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap; - destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + kDestSeemOverlap); - sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile ); - if( y == iterations - 1 && remainder ) { - float dify = destTile.size.height; - destTile.size.height = CGImageGetHeight( sourceTileImageRef ) * imageScale; - dify -= destTile.size.height; - destTile.origin.y += dify; - } - CGContextDrawImage( destContext, destTile, sourceTileImageRef ); - CGImageRelease( sourceTileImageRef ); - } - } - - CGImageRef destImageRef = CGBitmapContextCreateImage(destContext); - CGContextRelease(destContext); - if (destImageRef == NULL) { - return image; - } - UIImage *destImage = [UIImage imageWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation]; - CGImageRelease(destImageRef); - if (destImage == nil) { - return image; - } - return destImage; - } -} - -+ (BOOL)shouldDecodeImage:(nullable UIImage *)image { - // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error - if (image == nil) { - return NO; - } - - // do not decode animated images - if (image.images != nil) { - return NO; - } - - CGImageRef imageRef = image.CGImage; - - CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef); - BOOL anyAlpha = (alpha == kCGImageAlphaFirst || - alpha == kCGImageAlphaLast || - alpha == kCGImageAlphaPremultipliedFirst || - alpha == kCGImageAlphaPremultipliedLast); - // do not decode images with alpha - if (anyAlpha) { - return NO; - } - - return YES; -} - -+ (BOOL)shouldScaleDownImage:(nonnull UIImage *)image { - BOOL shouldScaleDown = YES; - - CGImageRef sourceImageRef = image.CGImage; - CGSize sourceResolution = CGSizeZero; - sourceResolution.width = CGImageGetWidth(sourceImageRef); - sourceResolution.height = CGImageGetHeight(sourceImageRef); - float sourceTotalPixels = sourceResolution.width * sourceResolution.height; - float imageScale = kDestTotalPixels / sourceTotalPixels; - if (imageScale < 1) { - shouldScaleDown = YES; - } else { - shouldScaleDown = NO; - } - - return shouldScaleDown; -} - -+ (CGColorSpaceRef)colorSpaceForImageRef:(CGImageRef)imageRef { - // current - CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); - CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); - - BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || - imageColorSpaceModel == kCGColorSpaceModelMonochrome || - imageColorSpaceModel == kCGColorSpaceModelCMYK || - imageColorSpaceModel == kCGColorSpaceModelIndexed); - if (unsupportedColorSpace) { - colorspaceRef = CGColorSpaceCreateDeviceRGB(); - CFAutorelease(colorspaceRef); - } - return colorspaceRef; -} -#elif SD_MAC -+ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { - return image; -} - -+ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image { - return image; -} -#endif - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.m deleted file mode 100644 index 189d163..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/SDWebImageDownloader.m +++ /dev/null @@ -1,315 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageDownloader.h" -#import "SDWebImageDownloaderOperation.h" -#import - -@implementation SDWebImageDownloadToken -@end - - -@interface SDWebImageDownloader () - -@property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; -@property (weak, nonatomic, nullable) NSOperation *lastAddedOperation; -@property (assign, nonatomic, nullable) Class operationClass; -@property (strong, nonatomic, nonnull) NSMutableDictionary *URLOperations; -@property (strong, nonatomic, nullable) SDHTTPHeadersMutableDictionary *HTTPHeaders; -// This queue is used to serialize the handling of the network responses of all the download operation in a single queue -@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; - -// The session in which data tasks will run -@property (strong, nonatomic) NSURLSession *session; - -@end - -@implementation SDWebImageDownloader - -+ (void)initialize { - // Bind SDNetworkActivityIndicator if available (download it here: http://github.com/rs/SDNetworkActivityIndicator ) - // To use it, just add #import "SDNetworkActivityIndicator.h" in addition to the SDWebImage import - if (NSClassFromString(@"SDNetworkActivityIndicator")) { - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - id activityIndicator = [NSClassFromString(@"SDNetworkActivityIndicator") performSelector:NSSelectorFromString(@"sharedActivityIndicator")]; -#pragma clang diagnostic pop - - // Remove observer in case it was previously added. - [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStartNotification object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStopNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:activityIndicator - selector:NSSelectorFromString(@"startActivity") - name:SDWebImageDownloadStartNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:activityIndicator - selector:NSSelectorFromString(@"stopActivity") - name:SDWebImageDownloadStopNotification object:nil]; - } -} - -+ (nonnull instancetype)sharedDownloader { - static dispatch_once_t once; - static id instance; - dispatch_once(&once, ^{ - instance = [self new]; - }); - return instance; -} - -- (nonnull instancetype)init { - return [self initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; -} - -- (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration { - if ((self = [super init])) { - _operationClass = [SDWebImageDownloaderOperation class]; - _shouldDecompressImages = YES; - _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; - _downloadQueue = [NSOperationQueue new]; - _downloadQueue.maxConcurrentOperationCount = 6; - _downloadQueue.name = @"com.hackemist.SDWebImageDownloader"; - _URLOperations = [NSMutableDictionary new]; -#ifdef SD_WEBP - _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; -#else - _HTTPHeaders = [@{@"Accept": @"image/*;q=0.8"} mutableCopy]; -#endif - _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT); - _downloadTimeout = 15.0; - - sessionConfiguration.timeoutIntervalForRequest = _downloadTimeout; - - /** - * Create the session for this task - * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate - * method calls and completion handler calls. - */ - self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration - delegate:self - delegateQueue:nil]; - } - return self; -} - -- (void)dealloc { - [self.session invalidateAndCancel]; - self.session = nil; - - [self.downloadQueue cancelAllOperations]; - SDDispatchQueueRelease(_barrierQueue); -} - -- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field { - if (value) { - self.HTTPHeaders[field] = value; - } - else { - [self.HTTPHeaders removeObjectForKey:field]; - } -} - -- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field { - return self.HTTPHeaders[field]; -} - -- (void)setMaxConcurrentDownloads:(NSInteger)maxConcurrentDownloads { - _downloadQueue.maxConcurrentOperationCount = maxConcurrentDownloads; -} - -- (NSUInteger)currentDownloadCount { - return _downloadQueue.operationCount; -} - -- (NSInteger)maxConcurrentDownloads { - return _downloadQueue.maxConcurrentOperationCount; -} - -- (void)setOperationClass:(nullable Class)operationClass { - if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperationInterface)]) { - _operationClass = operationClass; - } else { - _operationClass = [SDWebImageDownloaderOperation class]; - } -} - -- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { - __weak SDWebImageDownloader *wself = self; - - return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ - __strong __typeof (wself) sself = wself; - NSTimeInterval timeoutInterval = sself.downloadTimeout; - if (timeoutInterval == 0.0) { - timeoutInterval = 15.0; - } - - // In order to prevent from potential duplicate caching (NSURLCache + SDImageCache) we disable the cache for image requests if told otherwise - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:(options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:timeoutInterval]; - request.HTTPShouldHandleCookies = (options & SDWebImageDownloaderHandleCookies); - request.HTTPShouldUsePipelining = YES; - if (sself.headersFilter) { - request.allHTTPHeaderFields = sself.headersFilter(url, [sself.HTTPHeaders copy]); - } - else { - request.allHTTPHeaderFields = sself.HTTPHeaders; - } - SDWebImageDownloaderOperation *operation = [[sself.operationClass alloc] initWithRequest:request inSession:sself.session options:options]; - operation.shouldDecompressImages = sself.shouldDecompressImages; - - if (sself.urlCredential) { - operation.credential = sself.urlCredential; - } else if (sself.username && sself.password) { - operation.credential = [NSURLCredential credentialWithUser:sself.username password:sself.password persistence:NSURLCredentialPersistenceForSession]; - } - - if (options & SDWebImageDownloaderHighPriority) { - operation.queuePriority = NSOperationQueuePriorityHigh; - } else if (options & SDWebImageDownloaderLowPriority) { - operation.queuePriority = NSOperationQueuePriorityLow; - } - - [sself.downloadQueue addOperation:operation]; - if (sself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { - // Emulate LIFO execution order by systematically adding new operations as last operation's dependency - [sself.lastAddedOperation addDependency:operation]; - sself.lastAddedOperation = operation; - } - - return operation; - }]; -} - -- (void)cancel:(nullable SDWebImageDownloadToken *)token { - dispatch_barrier_async(self.barrierQueue, ^{ - SDWebImageDownloaderOperation *operation = self.URLOperations[token.url]; - BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; - if (canceled) { - [self.URLOperations removeObjectForKey:token.url]; - } - }); -} - -- (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock - completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock - forURL:(nullable NSURL *)url - createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { - // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. - if (url == nil) { - if (completedBlock != nil) { - completedBlock(nil, nil, nil, NO); - } - return nil; - } - - __block SDWebImageDownloadToken *token = nil; - - dispatch_barrier_sync(self.barrierQueue, ^{ - SDWebImageDownloaderOperation *operation = self.URLOperations[url]; - if (!operation) { - operation = createCallback(); - self.URLOperations[url] = operation; - - __weak SDWebImageDownloaderOperation *woperation = operation; - operation.completionBlock = ^{ - SDWebImageDownloaderOperation *soperation = woperation; - if (!soperation) return; - if (self.URLOperations[url] == soperation) { - [self.URLOperations removeObjectForKey:url]; - }; - }; - } - id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; - - token = [SDWebImageDownloadToken new]; - token.url = url; - token.downloadOperationCancelToken = downloadOperationCancelToken; - }); - - return token; -} - -- (void)setSuspended:(BOOL)suspended { - (self.downloadQueue).suspended = suspended; -} - -- (void)cancelAllDownloads { - [self.downloadQueue cancelAllOperations]; -} - -#pragma mark Helper methods - -- (SDWebImageDownloaderOperation *)operationWithTask:(NSURLSessionTask *)task { - SDWebImageDownloaderOperation *returnOperation = nil; - for (SDWebImageDownloaderOperation *operation in self.downloadQueue.operations) { - if (operation.dataTask.taskIdentifier == task.taskIdentifier) { - returnOperation = operation; - break; - } - } - return returnOperation; -} - -#pragma mark NSURLSessionDataDelegate - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didReceiveResponse:(NSURLResponse *)response - completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; - - [dataOperation URLSession:session dataTask:dataTask didReceiveResponse:response completionHandler:completionHandler]; -} - -- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; - - [dataOperation URLSession:session dataTask:dataTask didReceiveData:data]; -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - willCacheResponse:(NSCachedURLResponse *)proposedResponse - completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; - - [dataOperation URLSession:session dataTask:dataTask willCacheResponse:proposedResponse completionHandler:completionHandler]; -} - -#pragma mark NSURLSessionTaskDelegate - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; - - [dataOperation URLSession:session task:task didCompleteWithError:error]; -} - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { - - completionHandler(request); -} - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; - - [dataOperation URLSession:session task:task didReceiveChallenge:challenge completionHandler:completionHandler]; -} - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.m deleted file mode 100755 index 9301777..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+GIF.m +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Laurin Brandner - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImage+GIF.h" -#import -#import "objc/runtime.h" -#import "NSImage+WebCache.h" - -@implementation UIImage (GIF) - -+ (UIImage *)sd_animatedGIFWithData:(NSData *)data { - if (!data) { - return nil; - } - - CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); - - size_t count = CGImageSourceGetCount(source); - - UIImage *staticImage; - - if (count <= 1) { - staticImage = [[UIImage alloc] initWithData:data]; - } else { - // we will only retrieve the 1st frame. the full GIF support is available via the FLAnimatedImageView category. - // this here is only code to allow drawing animated images as static ones -#if SD_WATCH - CGFloat scale = 1; - scale = [WKInterfaceDevice currentDevice].screenScale; -#elif SD_UIKIT - CGFloat scale = 1; - scale = [UIScreen mainScreen].scale; -#endif - - CGImageRef CGImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); -#if SD_UIKIT || SD_WATCH - UIImage *frameImage = [UIImage imageWithCGImage:CGImage scale:scale orientation:UIImageOrientationUp]; - staticImage = [UIImage animatedImageWithImages:@[frameImage] duration:0.0f]; -#elif SD_MAC - staticImage = [[UIImage alloc] initWithCGImage:CGImage size:NSZeroSize]; -#endif - CGImageRelease(CGImage); - } - - CFRelease(source); - - return staticImage; -} - -- (BOOL)isGIF { - return (self.images != nil); -} - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.h b/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.h deleted file mode 100644 index bec411e..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" -#import "NSData+ImageContentType.h" - -@interface UIImage (MultiFormat) - -+ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data; -- (nullable NSData *)sd_imageData; -- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat; - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.m deleted file mode 100644 index 378f389..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIImage+MultiFormat.m +++ /dev/null @@ -1,161 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImage+MultiFormat.h" -#import "UIImage+GIF.h" -#import "NSData+ImageContentType.h" -#import - -#ifdef SD_WEBP -#import "UIImage+WebP.h" -#endif - -@implementation UIImage (MultiFormat) - -+ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data { - if (!data) { - return nil; - } - - UIImage *image; - SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; - if (imageFormat == SDImageFormatGIF) { - image = [UIImage sd_animatedGIFWithData:data]; - } -#ifdef SD_WEBP - else if (imageFormat == SDImageFormatWebP) - { - image = [UIImage sd_imageWithWebPData:data]; - } -#endif - else { - image = [[UIImage alloc] initWithData:data]; -#if SD_UIKIT || SD_WATCH - UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data]; - if (orientation != UIImageOrientationUp) { - image = [UIImage imageWithCGImage:image.CGImage - scale:image.scale - orientation:orientation]; - } -#endif - } - - - return image; -} - -#if SD_UIKIT || SD_WATCH -+(UIImageOrientation)sd_imageOrientationFromImageData:(nonnull NSData *)imageData { - UIImageOrientation result = UIImageOrientationUp; - CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); - if (imageSource) { - CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); - if (properties) { - CFTypeRef val; - int exifOrientation; - val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); - if (val) { - CFNumberGetValue(val, kCFNumberIntType, &exifOrientation); - result = [self sd_exifOrientationToiOSOrientation:exifOrientation]; - } // else - if it's not set it remains at up - CFRelease((CFTypeRef) properties); - } else { - //NSLog(@"NO PROPERTIES, FAIL"); - } - CFRelease(imageSource); - } - return result; -} - -#pragma mark EXIF orientation tag converter -// Convert an EXIF image orientation to an iOS one. -// reference see here: http://sylvana.net/jpegcrop/exif_orientation.html -+ (UIImageOrientation) sd_exifOrientationToiOSOrientation:(int)exifOrientation { - UIImageOrientation orientation = UIImageOrientationUp; - switch (exifOrientation) { - case 1: - orientation = UIImageOrientationUp; - break; - - case 3: - orientation = UIImageOrientationDown; - break; - - case 8: - orientation = UIImageOrientationLeft; - break; - - case 6: - orientation = UIImageOrientationRight; - break; - - case 2: - orientation = UIImageOrientationUpMirrored; - break; - - case 4: - orientation = UIImageOrientationDownMirrored; - break; - - case 5: - orientation = UIImageOrientationLeftMirrored; - break; - - case 7: - orientation = UIImageOrientationRightMirrored; - break; - default: - break; - } - return orientation; -} -#endif - -- (nullable NSData *)sd_imageData { - return [self sd_imageDataAsFormat:SDImageFormatUndefined]; -} - -- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat { - NSData *imageData = nil; - if (self) { -#if SD_UIKIT || SD_WATCH - int alphaInfo = CGImageGetAlphaInfo(self.CGImage); - BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || - alphaInfo == kCGImageAlphaNoneSkipFirst || - alphaInfo == kCGImageAlphaNoneSkipLast); - - BOOL usePNG = hasAlpha; - - // the imageFormat param has priority here. But if the format is undefined, we relly on the alpha channel - if (imageFormat != SDImageFormatUndefined) { - usePNG = (imageFormat == SDImageFormatPNG); - } - - if (usePNG) { - imageData = UIImagePNGRepresentation(self); - } else { - imageData = UIImageJPEGRepresentation(self, (CGFloat)1.0); - } -#else - NSBitmapImageFileType imageFileType = NSJPEGFileType; - if (imageFormat == SDImageFormatGIF) { - imageFileType = NSGIFFileType; - } else if (imageFormat == SDImageFormatPNG) { - imageFileType = NSPNGFileType; - } - - imageData = [NSBitmapImageRep representationOfImageRepsInArray:self.representations - usingType:imageFileType - properties:@{}]; -#endif - } - return imageData; -} - - -@end diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.h b/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.h deleted file mode 100644 index 4c57519..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT || SD_MAC - -#import "SDWebImageManager.h" - -typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable imageData); - -@interface UIView (WebCache) - -/** - * Get the current image URL. - * - * Note that because of the limitations of categories this property can get out of sync - * if you use setImage: directly. - */ -- (nullable NSURL *)sd_imageURL; - -/** - * Set the imageView `image` with an `url` and optionally a placeholder image. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param operationKey A string to be used as the operation key. If nil, will use the class name - * @param setImageBlock Block used for custom set image code - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_internalSetImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - operationKey:(nullable NSString *)operationKey - setImageBlock:(nullable SDSetImageBlock)setImageBlock - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentImageLoad; - -#if SD_UIKIT - -#pragma mark - Activity indicator - -/** - * Show activity UIActivityIndicatorView - */ -- (void)sd_setShowActivityIndicatorView:(BOOL)show; - -/** - * set desired UIActivityIndicatorViewStyle - * - * @param style The style of the UIActivityIndicatorView - */ -- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style; - -- (BOOL)sd_showActivityIndicatorView; -- (void)sd_addActivityIndicator; -- (void)sd_removeActivityIndicator; - -#endif - -@end - -#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.m deleted file mode 100644 index ad2b54c..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCache.m +++ /dev/null @@ -1,200 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIView+WebCache.h" - -#if SD_UIKIT || SD_MAC - -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" - -static char imageURLKey; - -#if SD_UIKIT -static char TAG_ACTIVITY_INDICATOR; -static char TAG_ACTIVITY_STYLE; -#endif -static char TAG_ACTIVITY_SHOW; - -@implementation UIView (WebCache) - -- (nullable NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} - -- (void)sd_internalSetImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - operationKey:(nullable NSString *)operationKey - setImageBlock:(nullable SDSetImageBlock)setImageBlock - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - NSString *validOperationKey = operationKey ?: NSStringFromClass([self class]); - [self sd_cancelImageLoadOperationWithKey:validOperationKey]; - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - if (!(options & SDWebImageDelayPlaceholder)) { - dispatch_main_async_safe(^{ - [self sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; - }); - } - - if (url) { - // check if activityView is enabled or not - if ([self sd_showActivityIndicatorView]) { - [self sd_addActivityIndicator]; - } - - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - __strong __typeof (wself) sself = wself; - [sself sd_removeActivityIndicator]; - if (!sself) { - return; - } - dispatch_main_async_safe(^{ - if (!sself) { - return; - } - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { - completedBlock(image, error, cacheType, url); - return; - } else if (image) { - [sself sd_setImage:image imageData:data basedOnClassOrViaCustomSetImageBlock:setImageBlock]; - [sself sd_setNeedsLayout]; - } else { - if ((options & SDWebImageDelayPlaceholder)) { - [sself sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; - [sself sd_setNeedsLayout]; - } - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:validOperationKey]; - } else { - dispatch_main_async_safe(^{ - [self sd_removeActivityIndicator]; - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:NSStringFromClass([self class])]; -} - -- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock { - if (setImageBlock) { - setImageBlock(image, imageData); - return; - } - -#if SD_UIKIT || SD_MAC - if ([self isKindOfClass:[UIImageView class]]) { - UIImageView *imageView = (UIImageView *)self; - imageView.image = image; - } -#endif - -#if SD_UIKIT - if ([self isKindOfClass:[UIButton class]]) { - UIButton *button = (UIButton *)self; - [button setImage:image forState:UIControlStateNormal]; - } -#endif -} - -- (void)sd_setNeedsLayout { -#if SD_UIKIT - [self setNeedsLayout]; -#elif SD_MAC - [self setNeedsLayout:YES]; -#endif -} - -#pragma mark - Activity indicator - -#pragma mark - -#if SD_UIKIT -- (UIActivityIndicatorView *)activityIndicator { - return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); -} - -- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { - objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); -} -#endif - -- (void)sd_setShowActivityIndicatorView:(BOOL)show { - objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); -} - -- (BOOL)sd_showActivityIndicatorView { - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; -} - -#if SD_UIKIT -- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ - objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); -} - -- (int)sd_getIndicatorStyle{ - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; -} -#endif - -- (void)sd_addActivityIndicator { -#if SD_UIKIT - if (!self.activityIndicator) { - self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self sd_getIndicatorStyle]]; - self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; - - dispatch_main_async_safe(^{ - [self addSubview:self.activityIndicator]; - - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterX - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterX - multiplier:1.0 - constant:0.0]]; - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterY - multiplier:1.0 - constant:0.0]]; - }); - } - - dispatch_main_async_safe(^{ - [self.activityIndicator startAnimating]; - }); -#endif -} - -- (void)sd_removeActivityIndicator { -#if SD_UIKIT - if (self.activityIndicator) { - [self.activityIndicator removeFromSuperview]; - self.activityIndicator = nil; - } -#endif -} - -@end - -#endif diff --git a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.m b/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.m deleted file mode 100644 index a515a74..0000000 --- a/DKCarouselViewDemo/SDWebImage/SDWebImage/UIView+WebCacheOperation.m +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIView+WebCacheOperation.h" - -#if SD_UIKIT || SD_MAC - -#import "objc/runtime.h" - -static char loadOperationKey; - -typedef NSMutableDictionary SDOperationsDictionary; - -@implementation UIView (WebCacheOperation) - -- (SDOperationsDictionary *)operationDictionary { - SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); - if (operations) { - return operations; - } - operations = [NSMutableDictionary dictionary]; - objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - return operations; -} - -- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key { - if (key) { - [self sd_cancelImageLoadOperationWithKey:key]; - if (operation) { - SDOperationsDictionary *operationDictionary = [self operationDictionary]; - operationDictionary[key] = operation; - } - } -} - -- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { - // Cancel in progress downloader from queue - SDOperationsDictionary *operationDictionary = [self operationDictionary]; - id operations = operationDictionary[key]; - if (operations) { - if ([operations isKindOfClass:[NSArray class]]) { - for (id operation in operations) { - if (operation) { - [operation cancel]; - } - } - } else if ([operations conformsToProtocol:@protocol(SDWebImageOperation)]){ - [(id) operations cancel]; - } - [operationDictionary removeObjectForKey:key]; - } -} - -- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key { - if (key) { - SDOperationsDictionary *operationDictionary = [self operationDictionary]; - [operationDictionary removeObjectForKey:key]; - } -} - -@end - -#endif From ae3d42ce7189f4da8329a1ab49de8fe6316b2bb0 Mon Sep 17 00:00:00 2001 From: Carles Roig Date: Thu, 4 Apr 2019 14:53:15 +0200 Subject: [PATCH 4/4] Point source and tags to the original repo --- DKCarouselView.podspec | 2 +- DKCarouselView/Podfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DKCarouselView.podspec b/DKCarouselView.podspec index 97e39e3..6755eea 100644 --- a/DKCarouselView.podspec +++ b/DKCarouselView.podspec @@ -6,7 +6,7 @@ Pod::Spec.new do |s| s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "Bannings" => "zhangao0086@gmail.com" } s.platform = :ios, "9.0" - s.source = { :git => "https://github.com/CRoig/DKCarouselView.git", + s.source = { :git => "https://github.com/zhangao0086/DKCarouselView.git", :branch => "develop" } s.source_files = "DKCarouselView/DKCarouselView/DKCarouselView/*.{h,m}" s.frameworks = "Foundation", "UIKit" diff --git a/DKCarouselView/Podfile b/DKCarouselView/Podfile index f345599..1630ae7 100644 --- a/DKCarouselView/Podfile +++ b/DKCarouselView/Podfile @@ -10,5 +10,5 @@ end target 'DKCarouselViewDemo' do project 'DKCarouselViewDemo/DKCarouselViewDemo.xcodeproj' - pod 'DKCarouselView', :git => 'https://github.com/CRoig/DKCarouselView', :branch => 'develop' + pod 'DKCarouselView', '~> 1.4.12' end