From cac7bee8e598ad789dad900f5bfc44298eae37c1 Mon Sep 17 00:00:00 2001 From: EyreFree Date: Thu, 17 Jan 2019 11:04:18 +0800 Subject: [PATCH 1/5] Swift4.2 --- WRCycleScrollView/WRCycleCell.swift | 4 +- WRCycleScrollView/WRCycleScrollView.swift | 6 +- WRCycleScrollViewDemo/Podfile | 8 +- WRCycleScrollViewDemo/Podfile.lock | 26 +- WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE | 2 +- .../Pods/Kingfisher/README.md | 44 +- .../Sources/AnimatedImageView.swift | 182 +++- .../Pods/Kingfisher/Sources/Box.swift | 24 +- .../Kingfisher/Sources/CacheSerializer.swift | 8 +- .../Pods/Kingfisher/Sources/Filter.swift | 55 +- .../FormatIndicatedCacheSerializer.swift | 96 +++ .../Pods/Kingfisher/Sources/Image.swift | 361 ++++---- .../Pods/Kingfisher/Sources/ImageCache.swift | 135 ++- .../Kingfisher/Sources/ImageDownloader.swift | 309 +++++-- .../Kingfisher/Sources/ImageModifier.swift | 191 +++++ .../Kingfisher/Sources/ImagePrefetcher.swift | 72 +- .../Kingfisher/Sources/ImageProcessor.swift | 252 ++++-- .../Kingfisher/Sources/ImageTransition.swift | 10 +- .../Sources/ImageView+Kingfisher.swift | 139 ++-- .../Pods/Kingfisher/Sources/Indicator.swift | 58 +- .../Pods/Kingfisher/Sources/Kingfisher.h | 2 +- .../Pods/Kingfisher/Sources/Kingfisher.swift | 14 +- .../Sources/KingfisherManager.swift | 168 +++- .../Sources/KingfisherOptionsInfo.swift | 132 ++- .../Pods/Kingfisher/Sources/Placeholder.swift | 82 ++ .../Kingfisher/Sources/RequestModifier.swift | 2 +- .../Pods/Kingfisher/Sources/Resource.swift | 2 +- .../Pods/Kingfisher/Sources/String+MD5.swift | 23 +- .../Kingfisher/Sources/ThreadHelper.swift | 2 +- .../Sources/UIButton+Kingfisher.swift | 175 +--- .../WRNavigationBar_swift.podspec.json | 22 + WRCycleScrollViewDemo/Pods/Manifest.lock | 26 +- .../Pods/Pods.xcodeproj/project.pbxproj | 781 +++++++++++------- .../Kingfisher/Info.plist | 2 +- .../Kingfisher/Kingfisher.xcconfig | 8 +- ...leScrollViewDemo-acknowledgements.markdown | 27 +- ...CycleScrollViewDemo-acknowledgements.plist | 33 +- .../Pods-WRCycleScrollViewDemo-frameworks.sh | 78 +- .../Pods-WRCycleScrollViewDemo-resources.sh | 40 +- .../Pods-WRCycleScrollViewDemo.debug.xcconfig | 10 +- ...ods-WRCycleScrollViewDemo.release.xcconfig | 10 +- .../WRNavigationBar_swift/Info.plist | 26 + .../WRNavigationBar_swift-dummy.m | 5 + .../WRNavigationBar_swift-prefix.pch | 12 + .../WRNavigationBar_swift-umbrella.h | 16 + .../WRNavigationBar_swift.modulemap | 6 + .../WRNavigationBar_swift.xcconfig | 9 + .../Pods/WRNavigationBar_swift/LICENSE | 21 + .../Pods/WRNavigationBar_swift/README.md | 141 ++++ .../Classes/WRCustomNavigationBar.swift | 301 +++++++ .../Classes}/WRNavigationBar.swift | 379 ++++++--- .../project.pbxproj | 98 +-- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../WRCycleScrollViewDemo/AppDelegate.swift | 13 +- .../WRCycleScrollView/WRCycleCell.swift | 158 ---- .../WRCycleScrollView/WRCycleScrollView.swift | 407 --------- .../WRCycleScrollView/WRPageControl.swift | 107 --- .../WRCycleScrollView/WRProxy.swift | 195 ----- .../ZhiHuController.swift | 2 +- 59 files changed, 3368 insertions(+), 2157 deletions(-) create mode 100644 WRCycleScrollViewDemo/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift create mode 100644 WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageModifier.swift create mode 100755 WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Placeholder.swift create mode 100644 WRCycleScrollViewDemo/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json create mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/Info.plist create mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m create mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch create mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h create mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap create mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig create mode 100644 WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/LICENSE create mode 100644 WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/README.md create mode 100644 WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift rename WRCycleScrollViewDemo/{WRCycleScrollViewDemo/WRNavigationBar => Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes}/WRNavigationBar.swift (66%) create mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleCell.swift delete mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleScrollView.swift delete mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRPageControl.swift delete mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRProxy.swift diff --git a/WRCycleScrollView/WRCycleCell.swift b/WRCycleScrollView/WRCycleCell.swift index 26256aa..6de62e9 100644 --- a/WRCycleScrollView/WRCycleCell.swift +++ b/WRCycleScrollView/WRCycleCell.swift @@ -42,7 +42,7 @@ class WRCycleCell: UICollectionViewCell } } - var imageContentModel:UIViewContentMode = .scaleAspectFill { + var imageContentModel:UIView.ContentMode = .scaleAspectFill { didSet { imgView.contentMode = imageContentModel } @@ -116,7 +116,7 @@ class WRCycleCell: UICollectionViewCell let labelY = bounds.height - labelHeight descLabel.frame = CGRect(x: margin, y: labelY, width: labelWidth, height: labelHeight) bottomView.frame = CGRect(x: 0, y: labelY, width: imgView.bounds.width, height: labelHeight) - bringSubview(toFront: descLabel) + bringSubviewToFront(descLabel) } } } diff --git a/WRCycleScrollView/WRCycleScrollView.swift b/WRCycleScrollView/WRCycleScrollView.swift index dfaa5f7..dcf5669 100644 --- a/WRCycleScrollView/WRCycleScrollView.swift +++ b/WRCycleScrollView/WRCycleScrollView.swift @@ -54,7 +54,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc var placeholderImage: UIImage? /// WRCycleCell相关 - var imageContentModel: UIViewContentMode? + var imageContentModel: UIView.ContentMode? var descLabelFont: UIFont? var descLabelTextColor: UIColor? var descLabelHeight: CGFloat? @@ -277,10 +277,10 @@ extension WRCycleScrollView func setupTimer() { timer = Timer(timeInterval: autoScrollInterval, target: self, selector: #selector(autoChangeCycleCell), userInfo: nil, repeats: true) - RunLoop.main.add(timer!, forMode: .commonModes) + RunLoop.main.add(timer!, forMode: RunLoop.Mode.common) } - func autoChangeCycleCell() + @objc func autoChangeCycleCell() { if canChangeCycleCell == true { changeCycleCell(collectionView: collectionView!) diff --git a/WRCycleScrollViewDemo/Podfile b/WRCycleScrollViewDemo/Podfile index 4669c21..a759433 100644 --- a/WRCycleScrollViewDemo/Podfile +++ b/WRCycleScrollViewDemo/Podfile @@ -1,6 +1,6 @@ # Uncomment this line to define a global platform for your project -#官方Cocoapods的源 +#官方Cocoapods的源/Users/eyrefree/Documents/XWS/WRCycleScrollView/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj #source 'https://github.com/CocoaPods/Specs.git' #本地私有源 @@ -16,8 +16,6 @@ platform :ios, '8.0' use_frameworks! target 'WRCycleScrollViewDemo' do - - #swift - pod 'Kingfisher' - + pod 'Kingfisher', '4.10.1' + pod 'WRNavigationBar_swift', :git => 'https://github.com/EFRenovation/WRNavigationBar_swift.git' end diff --git a/WRCycleScrollViewDemo/Podfile.lock b/WRCycleScrollViewDemo/Podfile.lock index f817e01..9d9feb4 100644 --- a/WRCycleScrollViewDemo/Podfile.lock +++ b/WRCycleScrollViewDemo/Podfile.lock @@ -1,12 +1,28 @@ PODS: - - Kingfisher (3.6.2) + - Kingfisher (4.10.1) + - WRNavigationBar_swift (0.1.0) DEPENDENCIES: - - Kingfisher + - Kingfisher (= 4.10.1) + - WRNavigationBar_swift (from `https://github.com/EFRenovation/WRNavigationBar_swift.git`) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Kingfisher + +EXTERNAL SOURCES: + WRNavigationBar_swift: + :git: https://github.com/EFRenovation/WRNavigationBar_swift.git + +CHECKOUT OPTIONS: + WRNavigationBar_swift: + :commit: a0527391cb2ef39b782ccb7dc392c283669f8b83 + :git: https://github.com/EFRenovation/WRNavigationBar_swift.git SPEC CHECKSUMS: - Kingfisher: 2c94e72c6830622c71d06adf4ea024c37d316830 + Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0 + WRNavigationBar_swift: b49ca280deb24616af40abae09d8ec593e75ac64 -PODFILE CHECKSUM: 6daf8f1d76fe64163802c6a83d3d697d2866e5e0 +PODFILE CHECKSUM: e877ef69660efc780bee4089dade3acd6a65a80c -COCOAPODS: 1.2.1 +COCOAPODS: 1.5.3 diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE b/WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE index 79da75d..5023261 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2017 Wei Wang +Copyright (c) 2018 Wei Wang 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/WRCycleScrollViewDemo/Pods/Kingfisher/README.md b/WRCycleScrollViewDemo/Pods/Kingfisher/README.md index bd3c0f1..fa38fc1 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/README.md +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/README.md @@ -7,12 +7,12 @@

- codebeat badge - + +

Kingfisher is a lightweight, pure-Swift library for downloading and caching images from the web. This project is heavily inspired by the popular [SDWebImage](https://github.com/rs/SDWebImage). It provides you a chance to use a pure-Swift alternative in your next app. @@ -27,6 +27,7 @@ Kingfisher is a lightweight, pure-Swift library for downloading and caching imag - [x] Prefetching images and showing them from cache later when necessary. - [x] Extensions for `UIImageView`, `NSImage` and `UIButton` to directly set an image from a URL. - [x] Built-in transition animation when setting images. +- [x] Customizable placeholder while loading images. - [x] Extensible image processing and image format support. The simplest use-case is setting an image to an image view with the `UIImageView` extension: @@ -38,14 +39,17 @@ imageView.kf.setImage(with: url) Kingfisher will download the image from `url`, send it to both the memory cache and the disk cache, and display it in `imageView`. When you use the same code later, the image will be retrieved from cache and shown immediately. +For more examples of using Kingfisher, take a look at the [Cheat Sheet](https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet). + ## Requirements - iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+ -- Swift 3 (Kingfisher 3.x), Swift 2.3 (Kingfisher 2.x) +- Swift 4 (Kingfisher 4.x), Swift 3 (Kingfisher 3.x) -Main development of Kingfisher will support Swift 3. Only critical bug fixes will be made for Kingfisher 2.x. +Main development of Kingfisher is based on Swift 4. Only critical bug fixes will be applied to Kingfisher 3.x. -[Kingfisher 3.0 Migration Guide](https://github.com/onevcat/Kingfisher/wiki/Kingfisher-3.0-Migration-Guide) - If you are upgrading to Kingfisher 3.x from an earlier version, please read this for more information. +- Kingfisher 4.0 Migration - Kingfisher 3.x should be source compatible to Kingfisher 4. The reason for a major update is that we need to specify the Swift version explicitly for Xcode. All deprecated methods in Kingfisher 3 has been removed, so please ensure you have no warning left before you migrate from Kingfisher 3 to Kingfisher 4. If you have any trouble in migrating, please open an issue to discuss. +- [Kingfisher 3.0 Migration Guide](https://github.com/onevcat/Kingfisher/wiki/Kingfisher-3.0-Migration-Guide) - If you are upgrading to Kingfisher 3.x from an earlier version, please read this for more information. ## Next Steps @@ -75,6 +79,36 @@ The logo of Kingfisher is inspired by [Tangram (七巧板)](http://en.wikipedia. Follow and contact me on [Twitter](http://twitter.com/onevcat) or [Sina Weibo](http://weibo.com/onevcat). If you find an issue, just [open a ticket](https://github.com/onevcat/Kingfisher/issues/new). Pull requests are warmly welcome as well. +## Contributors + +This project exists thanks to all the people who contribute. [[Contribute]](https://github.com/onevcat/Kingfisher/blob/master/CONTRIBUTING.md). + + + +## Backers + +Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/kingfisher#backer)] + + + + +## Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/kingfisher#sponsor)] + + + + + + + + + + + + + + ### License Kingfisher is released under the MIT license. See LICENSE for details. diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/AnimatedImageView.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/AnimatedImageView.swift index 5ea04dc..340adc3 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/AnimatedImageView.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/AnimatedImageView.swift @@ -9,7 +9,7 @@ // // The MIT License (MIT) // -// Copyright (c) 2017 Reda Lemeden. +// Copyright (c) 2018 Reda Lemeden. // // 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 @@ -34,6 +34,29 @@ import UIKit import ImageIO +/// Protocol of `AnimatedImageView`. +public protocol AnimatedImageViewDelegate: AnyObject { + /** + Called after the animatedImageView has finished each animation loop. + + - parameter imageView: The animatedImageView that is being animated. + - parameter count: The looped count. + */ + func animatedImageView(_ imageView: AnimatedImageView, didPlayAnimationLoops count: UInt) + + /** + Called after the animatedImageView has reached the max repeat count. + + - parameter imageView: The animatedImageView that is being animated. + */ + func animatedImageViewDidFinishAnimating(_ imageView: AnimatedImageView) +} + +extension AnimatedImageViewDelegate { + public func animatedImageView(_ imageView: AnimatedImageView, didPlayAnimationLoops count: UInt) {} + public func animatedImageViewDidFinishAnimating(_ imageView: AnimatedImageView) {} +} + /// `AnimatedImageView` is a subclass of `UIImageView` for displaying animated image. open class AnimatedImageView: UIImageView { @@ -49,6 +72,30 @@ open class AnimatedImageView: UIImageView { target?.updateFrame() } } + + /// Enumeration that specifies repeat count of GIF + public enum RepeatCount: Equatable { + case once + case finite(count: UInt) + case infinite + + public static func ==(lhs: RepeatCount, rhs: RepeatCount) -> Bool { + switch (lhs, rhs) { + case let (.finite(l), .finite(r)): + return l == r + case (.once, .once), + (.infinite, .infinite): + return true + case (.once, .finite(let count)), + (.finite(let count), .once): + return count == 1 + case (.once, _), + (.infinite, _), + (.finite, _): + return false + } + } + } // MARK: - Public property /// Whether automatically play the animation when the view become visible. Default is true. @@ -61,6 +108,20 @@ open class AnimatedImageView: UIImageView { public var needsPrescaling = true /// The animation timer's run loop mode. Default is `NSRunLoopCommonModes`. Set this property to `NSDefaultRunLoopMode` will make the animation pause during UIScrollView scrolling. + #if swift(>=4.2) + public var runLoopMode = RunLoop.Mode.common { + willSet { + if runLoopMode == newValue { + return + } else { + stopAnimating() + displayLink.remove(from: .main, forMode: runLoopMode) + displayLink.add(to: .main, forMode: newValue) + startAnimating() + } + } + } + #else public var runLoopMode = RunLoopMode.commonModes { willSet { if runLoopMode == newValue { @@ -73,6 +134,21 @@ open class AnimatedImageView: UIImageView { } } } + #endif + + /// The repeat count. + public var repeatCount = RepeatCount.infinite { + didSet { + if oldValue != repeatCount { + reset() + setNeedsDisplay() + layer.setNeedsDisplay() + } + } + } + + /// Delegate of this `AnimatedImageView` object. See `AnimatedImageViewDelegate` protocol for more. + public weak var delegate: AnimatedImageViewDelegate? // MARK: - Private property /// `Animator` instance that holds the frames of a specific image in memory. @@ -120,6 +196,10 @@ open class AnimatedImageView: UIImageView { if self.isAnimating { return } else { + if animator?.isReachMaxRepeatCount ?? false { + return + } + displayLink.isPaused = false } } @@ -149,18 +229,23 @@ open class AnimatedImageView: UIImageView { super.didMoveToSuperview() didMove() } - - // This is for back compatibility that using regular UIImageView to show GIF. - override func shouldPreloadAllGIF() -> Bool { + + // This is for back compatibility that using regular UIImageView to show animated image. + override func shouldPreloadAllAnimation() -> Bool { return false } - + // MARK: - Private method /// Reset the animator. private func reset() { animator = nil if let imageSource = image?.kf.imageSource?.imageRef { - animator = Animator(imageSource: imageSource, contentMode: contentMode, size: bounds.size, framePreloadCount: framePreloadCount) + animator = Animator(imageSource: imageSource, + contentMode: contentMode, + size: bounds.size, + framePreloadCount: framePreloadCount, + repeatCount: repeatCount) + animator?.delegate = self animator?.needsPrescaling = needsPrescaling animator?.prepareFramesAsynchronously() } @@ -179,12 +264,41 @@ open class AnimatedImageView: UIImageView { /// Update the current frame with the displayLink duration. private func updateFrame() { - if animator?.updateCurrentFrame(duration: displayLink.duration) ?? false { + let duration: CFTimeInterval + + // CA based display link is opt-out from ProMotion by default. + // So the duration and its FPS might not match. + // See [#718](https://github.com/onevcat/Kingfisher/issues/718) + if #available(iOS 10.0, tvOS 10.0, *) { + // By setting CADisableMinimumFrameDuration to YES in Info.plist may + // cause the preferredFramesPerSecond being 0 + if displayLink.preferredFramesPerSecond == 0 { + duration = displayLink.duration + } else { + // Some devices (like iPad Pro 10.5) will have a different FPS. + duration = 1.0 / Double(displayLink.preferredFramesPerSecond) + } + } else { + duration = displayLink.duration + } + + if animator?.updateCurrentFrame(duration: duration) ?? false { layer.setNeedsDisplay() + + if animator?.isReachMaxRepeatCount ?? false { + stopAnimating() + delegate?.animatedImageViewDidFinishAnimating(self) + } } } } +extension AnimatedImageView: AnimatorDelegate { + func animator(_ animator: Animator, didPlayAnimationLoops count: UInt) { + delegate?.animatedImageView(self, didPlayAnimationLoops: count) + } +} + /// Keeps a reference to an `Image` instance and its duration as a GIF frame. struct AnimatedFrame { var image: Image? @@ -193,29 +307,48 @@ struct AnimatedFrame { static let null: AnimatedFrame = AnimatedFrame(image: .none, duration: 0.0) } +protocol AnimatorDelegate: AnyObject { + func animator(_ animator: Animator, didPlayAnimationLoops count: UInt) +} + // MARK: - Animator class Animator { // MARK: Private property fileprivate let size: CGSize fileprivate let maxFrameCount: Int fileprivate let imageSource: CGImageSource + fileprivate let maxRepeatCount: AnimatedImageView.RepeatCount fileprivate var animatedFrames = [AnimatedFrame]() fileprivate let maxTimeStep: TimeInterval = 1.0 fileprivate var frameCount = 0 fileprivate var currentFrameIndex = 0 + fileprivate var currentFrameIndexInBuffer = 0 fileprivate var currentPreloadIndex = 0 fileprivate var timeSinceLastFrameChange: TimeInterval = 0.0 fileprivate var needsPrescaling = true + fileprivate var currentRepeatCount: UInt = 0 + fileprivate weak var delegate: AnimatorDelegate? - /// Loop count of animatd image. + /// Loop count of animated image. private var loopCount = 0 var currentFrame: UIImage? { - return frame(at: currentFrameIndex) + return frame(at: currentFrameIndexInBuffer) + } + + var isReachMaxRepeatCount: Bool { + switch maxRepeatCount { + case .once: + return currentRepeatCount >= 1 + case .finite(let maxCount): + return currentRepeatCount >= maxCount + case .infinite: + return false + } } - var contentMode = UIViewContentMode.scaleToFill + var contentMode = UIView.ContentMode.scaleToFill private lazy var preloadQueue: DispatchQueue = { return DispatchQueue(label: "com.onevcat.Kingfisher.Animator.preloadQueue") @@ -231,11 +364,16 @@ class Animator { - returns: The animator object. */ - init(imageSource source: CGImageSource, contentMode mode: UIViewContentMode, size: CGSize, framePreloadCount count: Int) { + init(imageSource source: CGImageSource, + contentMode mode: UIView.ContentMode, + size: CGSize, + framePreloadCount count: Int, + repeatCount: AnimatedImageView.RepeatCount) { self.imageSource = source self.contentMode = mode self.size = size self.maxFrameCount = count + self.maxRepeatCount = repeatCount } func frame(at index: Int) -> Image? { @@ -261,7 +399,7 @@ class Animator { let frameToProcess = min(frameCount, maxFrameCount) animatedFrames.reserveCapacity(frameToProcess) animatedFrames = (0.. AnimatedFrame { @@ -307,19 +445,29 @@ class Animator { */ func updateCurrentFrame(duration: CFTimeInterval) -> Bool { timeSinceLastFrameChange += min(maxTimeStep, duration) - guard let frameDuration = animatedFrames[safe: currentFrameIndex]?.duration, frameDuration <= timeSinceLastFrameChange else { + guard let frameDuration = animatedFrames[safe: currentFrameIndexInBuffer]?.duration, frameDuration <= timeSinceLastFrameChange else { return false } timeSinceLastFrameChange -= frameDuration - let lastFrameIndex = currentFrameIndex - currentFrameIndex += 1 - currentFrameIndex = currentFrameIndex % animatedFrames.count + let lastFrameIndex = currentFrameIndexInBuffer + currentFrameIndexInBuffer += 1 + currentFrameIndexInBuffer = currentFrameIndexInBuffer % animatedFrames.count if animatedFrames.count < frameCount { preloadFrameAsynchronously(at: lastFrameIndex) } + + currentFrameIndex += 1 + + if currentFrameIndex == frameCount { + currentFrameIndex = 0 + currentRepeatCount += 1 + + delegate?.animator(self, didPlayAnimationLoops: currentRepeatCount) + } + return true } @@ -345,7 +493,7 @@ extension Kingfisher where Base: CGImageSource { } extension Array { - subscript(safe index: Int) -> Element? { + fileprivate subscript(safe index: Int) -> Element? { return indices ~= index ? self[index] : nil } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Box.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Box.swift index 7076add..7714a68 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Box.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Box.swift @@ -2,15 +2,33 @@ // Box.swift // Kingfisher // -// Created by WANG WEI on 2016/09/12. -// Copyright © 2016年 Wei Wang. All rights reserved. +// Created by Wei Wang on 2018/3/17. +// Copyright (c) 2018 Wei Wang // +// 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. import Foundation class Box { let value: T - init(value: T) { + + init(_ value: T) { self.value = value } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/CacheSerializer.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/CacheSerializer.swift index 8d8cdc9..c3b6a27 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/CacheSerializer.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/CacheSerializer.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 2016/09/02. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -64,7 +64,7 @@ public struct DefaultCacheSerializer: CacheSerializer { public func data(with image: Image, original: Data?) -> Data? { let imageFormat = original?.kf.imageFormat ?? .unknown - + let data: Data? switch imageFormat { case .PNG: data = image.kf.pngRepresentation() @@ -72,7 +72,7 @@ public struct DefaultCacheSerializer: CacheSerializer { case .GIF: data = image.kf.gifRepresentation() case .unknown: data = original ?? image.kf.normalized.kf.pngRepresentation() } - + return data } @@ -81,7 +81,7 @@ public struct DefaultCacheSerializer: CacheSerializer { return Kingfisher.image( data: data, scale: options.scaleFactor, - preloadAllGIFData: options.preloadAllGIFData, + preloadAllAnimationData: options.preloadAllAnimationData, onlyFirstFrame: options.onlyLoadFirstFrame) } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Filter.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Filter.swift index 5f20987..0df99e4 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Filter.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Filter.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 2016/08/31. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -56,14 +56,14 @@ public struct Filter { let transform: Transformer - public init(tranform: @escaping Transformer) { - self.transform = tranform + public init(transform: @escaping Transformer) { + self.transform = transform } /// Tint filter which will apply a tint color to images. public static var tint: (Color) -> Filter = { color in - Filter { input in + Filter(transform: { input in let colorFilter = CIFilter(name: "CIConstantColorGenerator")! colorFilter.setValue(CIColor(color: color), forKey: kCIInputColorKey) @@ -71,25 +71,41 @@ public struct Filter { let filter = CIFilter(name: "CISourceOverCompositing")! filter.setValue(colorImage, forKey: kCIInputImageKey) filter.setValue(input, forKey: kCIInputBackgroundImageKey) + #if swift(>=4.0) + return filter.outputImage?.cropped(to: input.extent) + #else return filter.outputImage?.cropping(to: input.extent) - } + #endif + }) } public typealias ColorElement = (CGFloat, CGFloat, CGFloat, CGFloat) /// Color control filter which will apply color control change to images. - public static var colorControl: (ColorElement) -> Filter = { - brightness, contrast, saturation, inputEV in - Filter { input in + public static var colorControl: (ColorElement) -> Filter = { arg -> Filter in + let (brightness, contrast, saturation, inputEV) = arg + return Filter(transform: { input in let paramsColor = [kCIInputBrightnessKey: brightness, kCIInputContrastKey: contrast, kCIInputSaturationKey: saturation] - let blackAndWhite = input.applyingFilter("CIColorControls", withInputParameters: paramsColor) let paramsExposure = [kCIInputEVKey: inputEV] + #if swift(>=4.0) + let blackAndWhite = input.applyingFilter("CIColorControls", parameters: paramsColor) + return blackAndWhite.applyingFilter("CIExposureAdjust", parameters: paramsExposure) + #else + let blackAndWhite = input.applyingFilter("CIColorControls", withInputParameters: paramsColor) return blackAndWhite.applyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) - } - + #endif + }) + } +} + +// MARK: - Deprecated +extension Filter { + @available(*, deprecated, message: "Use init(transform:) instead.", renamed: "init(transform:)") + public init(tranform: @escaping Transformer) { + self.transform = tranform } } @@ -126,20 +142,3 @@ extension Kingfisher where Base: Image { } } - -public extension Image { - - /// Apply a `Filter` containing `CIImage` transformer to `self`. - /// - /// - parameter filter: The filter used to transform `self`. - /// - /// - returns: A transformed image by input `Filter`. - /// - /// - Note: Only CG-based images are supported. If any error happens during transforming, `self` will be returned. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.apply` instead.", - renamed: "kf.apply") - public func kf_apply(_ filter: Filter) -> Image { - return kf.apply(filter) - } -} diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift new file mode 100644 index 0000000..71f5856 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift @@ -0,0 +1,96 @@ +// +// RequestModifier.swift +// Kingfisher +// +// Created by Junyu Kuang on 5/28/17. +// +// Copyright (c) 2018 Wei Wang +// +// 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. + +import Foundation + +/// `FormatIndicatedCacheSerializer` let you indicate an image format for serialized caches. +/// +/// It could serialize and deserialize PNG, JEPG and GIF images. For +/// image other than these formats, a normalized `pngRepresentation` will be used. +/// +/// Example: +/// ```` +/// private let profileImageSize = CGSize(width: 44, height: 44) +/// +/// private let imageProcessor = RoundCornerImageProcessor( +/// cornerRadius: profileImageSize.width / 2, targetSize: profileImageSize) +/// +/// private let optionsInfo: KingfisherOptionsInfo = [ +/// .cacheSerializer(FormatIndicatedCacheSerializer.png), +/// .backgroundDecode, .processor(imageProcessor), .scaleFactor(UIScreen.main.scale)] +/// +/// extension UIImageView { +/// func setProfileImage(with url: URL) { +/// // Image will always cached as PNG format to preserve alpha channel for round rect. +/// _ = kf.setImage(with: url, options: optionsInfo) +/// } +///} +/// ```` +public struct FormatIndicatedCacheSerializer: CacheSerializer { + + public static let png = FormatIndicatedCacheSerializer(imageFormat: .PNG) + public static let jpeg = FormatIndicatedCacheSerializer(imageFormat: .JPEG) + public static let gif = FormatIndicatedCacheSerializer(imageFormat: .GIF) + + /// The indicated image format. + private let imageFormat: ImageFormat + + public func data(with image: Image, original: Data?) -> Data? { + + func imageData(withFormat imageFormat: ImageFormat) -> Data? { + switch imageFormat { + case .PNG: return image.kf.pngRepresentation() + case .JPEG: return image.kf.jpegRepresentation(compressionQuality: 1.0) + case .GIF: return image.kf.gifRepresentation() + case .unknown: return nil + } + } + + // generate data with indicated image format + if let data = imageData(withFormat: imageFormat) { + return data + } + + let originalFormat = original?.kf.imageFormat ?? .unknown + + // generate data with original image's format + if originalFormat != imageFormat, let data = imageData(withFormat: originalFormat) { + return data + } + + return original ?? image.kf.normalized.kf.pngRepresentation() + } + + /// Same implementation as `DefaultCacheSerializer`. + public func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? { + let options = options ?? KingfisherEmptyOptionsInfo + return Kingfisher.image( + data: data, + scale: options.scaleFactor, + preloadAllAnimationData: options.preloadAllAnimationData, + onlyFirstFrame: options.onlyLoadFirstFrame) + } +} diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Image.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Image.swift index c132523..66ae7a6 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Image.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Image.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 16/1/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -179,9 +179,13 @@ extension Kingfisher where Base: Image { return nil } let rep = NSBitmapImageRep(cgImage: cgimage) - return rep.representation(using: .PNG, properties: [:]) + return rep.representation(using: .png, properties: [:]) #else + #if swift(>=4.2) + return base.pngData() + #else return UIImagePNGRepresentation(base) + #endif #endif } @@ -192,9 +196,13 @@ extension Kingfisher where Base: Image { return nil } let rep = NSBitmapImageRep(cgImage: cgImage) - return rep.representation(using:.JPEG, properties: [NSImageCompressionFactor: compressionQuality]) + return rep.representation(using:.jpeg, properties: [.compressionFactor: compressionQuality]) #else + #if swift(>=4.2) + return base.jpegData(compressionQuality: compressionQuality) + #else return UIImageJPEGRepresentation(base, compressionQuality) + #endif #endif } @@ -206,7 +214,7 @@ extension Kingfisher where Base: Image { // MARK: - Create images from data extension Kingfisher where Base: Image { - static func animated(with data: Data, scale: CGFloat = 1.0, duration: TimeInterval = 0.0, preloadAll: Bool, onlyFirstFrame: Bool = false) -> Image? { + public static func animated(with data: Data, scale: CGFloat = 1.0, duration: TimeInterval = 0.0, preloadAll: Bool, onlyFirstFrame: Bool = false) -> Image? { func decode(from imageSource: CGImageSource, for options: NSDictionary) -> ([Image], TimeInterval)? { @@ -285,17 +293,17 @@ extension Kingfisher where Base: Image { guard let (images, gifDuration) = decode(from: imageSource, for: options) else { return nil } image = onlyFirstFrame ? images.first : Kingfisher.animated(with: images, forDuration: duration <= 0.0 ? gifDuration : duration) } else { - image = Image(data: data) + image = Image(data: data, scale: scale) image?.kf.imageSource = ImageSource(ref: imageSource) } image?.kf.animatedImageData = data return image #endif } - - static func image(data: Data, scale: CGFloat, preloadAllGIFData: Bool, onlyFirstFrame: Bool) -> Image? { + + public static func image(data: Data, scale: CGFloat, preloadAllAnimationData: Bool, onlyFirstFrame: Bool) -> Image? { var image: Image? - + #if os(macOS) switch data.kf.imageFormat { case .JPEG: @@ -307,7 +315,7 @@ extension Kingfisher where Base: Image { with: data, scale: scale, duration: 0.0, - preloadAll: preloadAllGIFData, + preloadAll: preloadAllAnimationData, onlyFirstFrame: onlyFirstFrame) case .unknown: image = Image(data: data) @@ -323,31 +331,99 @@ extension Kingfisher where Base: Image { with: data, scale: scale, duration: 0.0, - preloadAll: preloadAllGIFData, + preloadAll: preloadAllAnimationData, onlyFirstFrame: onlyFirstFrame) case .unknown: image = Image(data: data, scale: scale) } #endif - + return image } } // MARK: - Image Transforming extension Kingfisher where Base: Image { + // MARK: - Blend Mode + /// Create image based on `self` and apply blend mode. + /// + /// - parameter blendMode: The blend mode of creating image. + /// - parameter alpha: The alpha should be used for image. + /// - parameter backgroundColor: The background color for the output image. + /// + /// - returns: An image with blend mode applied. + /// + /// - Note: This method only works for CG-based image. + #if !os(macOS) + public func image(withBlendMode blendMode: CGBlendMode, + alpha: CGFloat = 1.0, + backgroundColor: Color? = nil) -> Image + { + guard let cgImage = cgImage else { + assertionFailure("[Kingfisher] Blend mode image only works for CG-based image.") + return base + } + + let rect = CGRect(origin: .zero, size: size) + return draw(cgImage: cgImage, to: rect.size) { + if let backgroundColor = backgroundColor { + backgroundColor.setFill() + UIRectFill(rect) + } + + base.draw(in: rect, blendMode: blendMode, alpha: alpha) + } + } + #endif + + // MARK: - Compositing Operation + /// Create image based on `self` and apply compositing operation. + /// + /// - parameter compositingOperation: The compositing operation of creating image. + /// - parameter alpha: The alpha should be used for image. + /// - parameter backgroundColor: The background color for the output image. + /// + /// - returns: An image with compositing operation applied. + /// + /// - Note: This method only works for CG-based image. + #if os(macOS) + public func image(withCompositingOperation compositingOperation: NSCompositingOperation, + alpha: CGFloat = 1.0, + backgroundColor: Color? = nil) -> Image + { + guard let cgImage = cgImage else { + assertionFailure("[Kingfisher] Compositing Operation image only works for CG-based image.") + return base + } + + let rect = CGRect(origin: .zero, size: size) + return draw(cgImage: cgImage, to: rect.size) { + if let backgroundColor = backgroundColor { + backgroundColor.setFill() + rect.fill() + } + + base.draw(in: rect, from: NSRect.zero, operation: compositingOperation, fraction: alpha) + } + } + #endif // MARK: - Round Corner /// Create a round corner image based on `self`. /// - /// - parameter radius: The round corner radius of creating image. - /// - parameter size: The target size of creating image. + /// - parameter radius: The round corner radius of creating image. + /// - parameter size: The target size of creating image. + /// - parameter corners: The target corners which will be applied rounding. + /// - parameter backgroundColor: The background color for the output image /// /// - returns: An image with round corner of `self`. /// /// - Note: This method only works for CG-based image. - public func image(withRoundRadius radius: CGFloat, fit size: CGSize) -> Image { - + public func image(withRoundRadius radius: CGFloat, + fit size: CGSize, + roundingCorners corners: RectCorner = .all, + backgroundColor: Color? = nil) -> Image + { guard let cgImage = cgImage else { assertionFailure("[Kingfisher] Round corner image only works for CG-based image.") return base @@ -356,8 +432,18 @@ extension Kingfisher where Base: Image { let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: size) return draw(cgImage: cgImage, to: size) { #if os(macOS) - let path = NSBezierPath(roundedRect: rect, xRadius: radius, yRadius: radius) + if let backgroundColor = backgroundColor { + let rectPath = NSBezierPath(rect: rect) + backgroundColor.setFill() + rectPath.fill() + } + + let path = NSBezierPath(roundedRect: rect, byRoundingCorners: corners, radius: radius) + #if swift(>=4.2) + path.windingRule = .evenOdd + #else path.windingRule = .evenOddWindingRule + #endif path.addClip() base.draw(in: rect) #else @@ -365,7 +451,16 @@ extension Kingfisher where Base: Image { assertionFailure("[Kingfisher] Failed to create CG context for image.") return } - let path = UIBezierPath(roundedRect: rect, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: radius, height: radius)).cgPath + + if let backgroundColor = backgroundColor { + let rectPath = UIBezierPath(rect: rect) + backgroundColor.setFill() + rectPath.fill() + } + + let path = UIBezierPath(roundedRect: rect, + byRoundingCorners: corners.uiRectCorner, + cornerRadii: CGSize(width: radius, height: radius)).cgPath context.addPath(path) context.clip() base.draw(in: rect) @@ -374,7 +469,7 @@ extension Kingfisher where Base: Image { } #if os(iOS) || os(tvOS) - func resize(to size: CGSize, for contentMode: UIViewContentMode) -> Image { + func resize(to size: CGSize, for contentMode: UIView.ContentMode) -> Image { switch contentMode { case .scaleAspectFit: return resize(to: size, for: .aspectFit) @@ -449,7 +544,7 @@ extension Kingfisher where Base: Image { /// Create an image with blur effect based on `self`. /// - /// - parameter radius: The blur radius should be used when creating blue. + /// - parameter radius: The blur radius should be used when creating blur effect. /// /// - returns: An image with blur effect applied. /// @@ -501,7 +596,7 @@ extension Kingfisher where Base: Image { return vImage_Buffer(data: data, height: height, width: width, rowBytes: rowBytes) } - guard let context = beginContext(size: size) else { + guard let context = beginContext(size: size, scale: scale) else { assertionFailure("[Kingfisher] Failed to create CG context for blurring image.") return base } @@ -511,7 +606,7 @@ extension Kingfisher where Base: Image { var inBuffer = createEffectBuffer(context) - guard let outContext = beginContext(size: size) else { + guard let outContext = beginContext(size: size, scale: scale) else { assertionFailure("[Kingfisher] Failed to create CG context for blurring image.") return base } @@ -560,7 +655,7 @@ extension Kingfisher where Base: Image { base.draw(in: rect) if fraction > 0 { color.withAlphaComponent(1 - fraction).set() - NSRectFillUsingOperation(rect, .sourceAtop) + rect.fill(using: .sourceAtop) } #else color.set() @@ -603,18 +698,33 @@ extension Kingfisher where Base: Image { #if os(watchOS) return base #else - return apply(.colorControl(brightness, contrast, saturation, inputEV)) + return apply(.colorControl((brightness, contrast, saturation, inputEV))) #endif } + + /// Return an image with given scale. + /// + /// - Parameter scale: Target scale factor the new image should have. + /// - Returns: The image with target scale. If the base image is already in the scale, `base` will be returned. + public func scaled(to scale: CGFloat) -> Image { + guard scale != self.scale else { + return base + } + guard let cgImage = cgImage else { + assertionFailure("[Kingfisher] Scaling only works for CG-based image.") + return base + } + return Kingfisher.image(cgImage: cgImage, scale: scale, refImage: base) + } } // MARK: - Decode extension Kingfisher where Base: Image { - var decoded: Image? { + public var decoded: Image { return decoded(scale: scale) } - func decoded(scale: CGFloat) -> Image { + public func decoded(scale: CGFloat) -> Image { // prevent animated image (GIF) lose it's images #if os(iOS) if imageSource != nil { return base } @@ -626,15 +736,16 @@ extension Kingfisher where Base: Image { assertionFailure("[Kingfisher] Decoding only works for CG-based image.") return base } - let colorSpace = CGColorSpaceCreateDeviceRGB() - guard let context = beginContext(size: CGSize(width: imageRef.width, height: imageRef.height)) else { + + // Draw CGImage in a plain context with scale of 1.0. + guard let context = beginContext(size: CGSize(width: imageRef.width, height: imageRef.height), scale: 1.0) else { assertionFailure("[Kingfisher] Decoding fails to create a valid context.") return base } defer { endContext() } - let rect = CGRect(x: 0, y: 0, width: imageRef.width, height: imageRef.height) + let rect = CGRect(x: 0, y: 0, width: CGFloat(imageRef.width), height: CGFloat(imageRef.height)) context.draw(imageRef, in: rect) let decompressedImageRef = context.makeImage() return Kingfisher.image(cgImage: decompressedImageRef!, scale: scale, refImage: base) @@ -642,7 +753,7 @@ extension Kingfisher where Base: Image { } /// Reference the source image reference -class ImageSource { +final class ImageSource { var imageRef: CGImageSource? init(ref: CGImageSource) { self.imageRef = ref @@ -657,7 +768,7 @@ private struct ImageHeaderData { static var GIF: [UInt8] = [0x47, 0x49, 0x46] } -enum ImageFormat { +public enum ImageFormat { case unknown, PNG, JPEG, GIF } @@ -678,7 +789,7 @@ extension Data: KingfisherCompatible { } extension DataProxy { - var imageFormat: ImageFormat { + public var imageFormat: ImageFormat { var buffer = [UInt8](repeating: 0, count: 8) (base as NSData).getBytes(&buffer, length: 8) if buffer == ImageHeaderData.PNG { @@ -714,14 +825,26 @@ extension CGSize: KingfisherCompatible { } extension CGSizeProxy { - func constrained(_ size: CGSize) -> CGSize { + + public func resize(to size: CGSize, for contentMode: ContentMode) -> CGSize { + switch contentMode { + case .aspectFit: + return constrained(size) + case .aspectFill: + return filling(size) + default: + return self.base + } + } + + public func constrained(_ size: CGSize) -> CGSize { let aspectWidth = round(aspectRatio * size.height) let aspectHeight = round(size.width / aspectRatio) return aspectWidth > size.width ? CGSize(width: size.width, height: aspectHeight) : CGSize(width: aspectWidth, height: size.height) } - func filling(_ size: CGSize) -> CGSize { + public func filling(_ size: CGSize) -> CGSize { let aspectWidth = round(aspectRatio * size.height) let aspectHeight = round(size.width / aspectRatio) @@ -733,7 +856,7 @@ extension CGSizeProxy { } - func constrainedRect(for size: CGSize, anchor: CGPoint) -> CGRect { + public func constrainedRect(for size: CGSize, anchor: CGPoint) -> CGRect { let unifiedAnchor = CGPoint(x: anchor.x.clamped(to: 0.0...1.0), y: anchor.y.clamped(to: 0.0...1.0)) @@ -762,7 +885,7 @@ extension Comparable { extension Kingfisher where Base: Image { - func beginContext(size: CGSize) -> CGContext? { + func beginContext(size: CGSize, scale: CGFloat) -> CGContext? { #if os(macOS) guard let rep = NSBitmapImageRep( bitmapDataPlanes: nil, @@ -772,7 +895,7 @@ extension Kingfisher where Base: Image { samplesPerPixel: 4, hasAlpha: true, isPlanar: false, - colorSpaceName: NSCalibratedRGBColorSpace, + colorSpaceName: .calibratedRGB, bytesPerRow: 0, bitsPerPixel: 0) else { @@ -786,7 +909,7 @@ extension Kingfisher where Base: Image { return nil } - NSGraphicsContext.setCurrent(context) + NSGraphicsContext.current = context return context.cgContext #else UIGraphicsBeginImageContextWithOptions(size, false, scale) @@ -815,7 +938,7 @@ extension Kingfisher where Base: Image { samplesPerPixel: 4, hasAlpha: true, isPlanar: false, - colorSpaceName: NSCalibratedRGBColorSpace, + colorSpaceName: .calibratedRGB, bytesPerRow: 0, bitsPerPixel: 0) else { @@ -827,7 +950,7 @@ extension Kingfisher where Base: Image { NSGraphicsContext.saveGraphicsState() let context = NSGraphicsContext(bitmapImageRep: rep) - NSGraphicsContext.setCurrent(context) + NSGraphicsContext.current = context draw() NSGraphicsContext.restoreGraphicsState() @@ -863,120 +986,60 @@ extension Float { } } -// MARK: - Deprecated. Only for back compatibility. -extension Image { - /** - Normalize the image. This method does nothing in OS X. - - - returns: The image itself. - */ - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.normalized` instead.", - renamed: "kf.normalized") - public func kf_normalized() -> Image { - return kf.normalized - } - - // MARK: - Round Corner - - /// Create a round corner image based on `self`. - /// - /// - parameter radius: The round corner radius of creating image. - /// - parameter size: The target size of creating image. - /// - parameter scale: The image scale of creating image. - /// - /// - returns: An image with round corner of `self`. - /// - /// - Note: This method only works for CG-based image. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.image(withRoundRadius:fit:scale:)` instead.", - renamed: "kf.image") - public func kf_image(withRoundRadius radius: CGFloat, fit size: CGSize, scale: CGFloat) -> Image { - return kf.image(withRoundRadius: radius, fit: size) - } - - // MARK: - Resize - /// Resize `self` to an image of new size. - /// - /// - parameter size: The target size. - /// - /// - returns: An image with new size. - /// - /// - Note: This method only works for CG-based image. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.resize(to:)` instead.", - renamed: "kf.resize") - public func kf_resize(to size: CGSize) -> Image { - return kf.resize(to: size) - } - - // MARK: - Blur - /// Create an image with blur effect based on `self`. - /// - /// - parameter radius: The blur radius should be used when creating blue. - /// - /// - returns: An image with blur effect applied. - /// - /// - Note: This method only works for CG-based image. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.blurred(withRadius:)` instead.", - renamed: "kf.blurred") - public func kf_blurred(withRadius radius: CGFloat) -> Image { - return kf.blurred(withRadius: radius) - } - - // MARK: - Overlay - /// Create an image from `self` with a color overlay layer. - /// - /// - parameter color: The color should be use to overlay. - /// - parameter fraction: Fraction of input color. From 0.0 to 1.0. 0.0 means solid color, 1.0 means transparent overlay. - /// - /// - returns: An image with a color overlay applied. - /// - /// - Note: This method only works for CG-based image. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.overlaying(with:fraction:)` instead.", - renamed: "kf.overlaying") - public func kf_overlaying(with color: Color, fraction: CGFloat) -> Image { - return kf.overlaying(with: color, fraction: fraction) +#if os(macOS) +extension NSBezierPath { + convenience init(roundedRect rect: NSRect, topLeftRadius: CGFloat, topRightRadius: CGFloat, + bottomLeftRadius: CGFloat, bottomRightRadius: CGFloat) + { + self.init() + + let maxCorner = min(rect.width, rect.height) / 2 + + let radiusTopLeft = min(maxCorner, max(0, topLeftRadius)) + let radiusTopRight = min(maxCorner, max(0, topRightRadius)) + let radiusBottomLeft = min(maxCorner, max(0, bottomLeftRadius)) + let radiusBottomRight = min(maxCorner, max(0, bottomRightRadius)) + + guard !NSIsEmptyRect(rect) else { + return + } + + let topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect)); + let topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect)); + let bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect)); + + move(to: NSMakePoint(NSMidX(rect), NSMaxY(rect))) + appendArc(from: topLeft, to: rect.origin, radius: radiusTopLeft) + appendArc(from: rect.origin, to: bottomRight, radius: radiusBottomLeft) + appendArc(from: bottomRight, to: topRight, radius: radiusBottomRight) + appendArc(from: topRight, to: topLeft, radius: radiusTopRight) + close() } - // MARK: - Tint - - /// Create an image from `self` with a color tint. - /// - /// - parameter color: The color should be used to tint `self` - /// - /// - returns: An image with a color tint applied. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.tinted(with:)` instead.", - renamed: "kf.tinted") - public func kf_tinted(with color: Color) -> Image { - return kf.tinted(with: color) + convenience init(roundedRect rect: NSRect, byRoundingCorners corners: RectCorner, radius: CGFloat) { + let radiusTopLeft = corners.contains(.topLeft) ? radius : 0 + let radiusTopRight = corners.contains(.topRight) ? radius : 0 + let radiusBottomLeft = corners.contains(.bottomLeft) ? radius : 0 + let radiusBottomRight = corners.contains(.bottomRight) ? radius : 0 + + self.init(roundedRect: rect, topLeftRadius: radiusTopLeft, topRightRadius: radiusTopRight, + bottomLeftRadius: radiusBottomLeft, bottomRightRadius: radiusBottomRight) } +} - // MARK: - Color Control - - /// Create an image from `self` with color control. - /// - /// - parameter brightness: Brightness changing to image. - /// - parameter contrast: Contrast changing to image. - /// - parameter saturation: Saturation changing to image. - /// - parameter inputEV: InputEV changing to image. - /// - /// - returns: An image with color control applied. - @available(*, deprecated, - message: "Extensions directly on Image are deprecated. Use `kf.adjusted` instead.", - renamed: "kf.adjusted") - public func kf_adjusted(brightness: CGFloat, contrast: CGFloat, saturation: CGFloat, inputEV: CGFloat) -> Image { - return kf.adjusted(brightness: brightness, contrast: contrast, saturation: saturation, inputEV: inputEV) +#else +extension RectCorner { + var uiRectCorner: UIRectCorner { + + var result: UIRectCorner = [] + + if self.contains(.topLeft) { result.insert(.topLeft) } + if self.contains(.topRight) { result.insert(.topRight) } + if self.contains(.bottomLeft) { result.insert(.bottomLeft) } + if self.contains(.bottomRight) { result.insert(.bottomRight) } + + return result } } +#endif -extension Kingfisher where Base: Image { - @available(*, deprecated, - message: "`scale` is not used. Use the version without scale instead. (Remove the `scale` argument)") - public func image(withRoundRadius radius: CGFloat, fit size: CGSize, scale: CGFloat) -> Image { - return image(withRoundRadius: radius, fit: size) - } -} diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageCache.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageCache.swift index 62aaa0b..74b5dec 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageCache.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageCache.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -30,7 +30,7 @@ import AppKit import UIKit #endif -public extension Notification.Name { +extension Notification.Name { /** This notification will be sent when the disk cache got cleaned either there are cached files expired or the total size exceeding the max allowed size. The manually invoking of `clearDiskCache` method will not trigger this notification. @@ -40,7 +40,7 @@ public extension Notification.Name { The main purpose of this notification is supplying a chance to maintain some necessary information on the cached files. See [this wiki](https://github.com/onevcat/Kingfisher/wiki/How-to-implement-ETag-based-304-(Not-Modified)-handling-in-Kingfisher) for a use case on it. */ - public static var KingfisherDidCleanDiskCache = Notification.Name.init("com.onevcat.Kingfisher.KingfisherDidCleanDiskCache") + public static let KingfisherDidCleanDiskCache = Notification.Name.init("com.onevcat.Kingfisher.KingfisherDidCleanDiskCache") } /** @@ -60,6 +60,13 @@ Cache type of a cached image. */ public enum CacheType { case none, memory, disk + + public var cached: Bool { + switch self { + case .memory, .disk: return true + case .none: return false + } + } } /// `ImageCache` represents both the memory and disk cache system of Kingfisher. @@ -86,7 +93,7 @@ open class ImageCache { fileprivate var fileManager: FileManager! ///The disk cache location. - open let diskCachePath: String + public let diskCachePath: String /// The default file extension appended to cached files. open var pathExtension: String? @@ -124,8 +131,6 @@ open class ImageCache { the `.cachesDirectory` in of your app will be used. - parameter diskCachePathClosure: Closure that takes in an optional initial path string and generates the final disk cache path. You could use it to fully customize your cache path. - - - returns: The cache object. */ public init(name: String, path: String? = nil, @@ -150,12 +155,23 @@ open class ImageCache { ioQueue.sync { fileManager = FileManager() } #if !os(macOS) && !os(watchOS) + + #if swift(>=4.2) + let memoryNotification = UIApplication.didReceiveMemoryWarningNotification + let terminateNotification = UIApplication.willTerminateNotification + let enterbackgroundNotification = UIApplication.didEnterBackgroundNotification + #else + let memoryNotification = NSNotification.Name.UIApplicationDidReceiveMemoryWarning + let terminateNotification = NSNotification.Name.UIApplicationWillTerminate + let enterbackgroundNotification = NSNotification.Name.UIApplicationDidEnterBackground + #endif + NotificationCenter.default.addObserver( - self, selector: #selector(clearMemoryCache), name: .UIApplicationDidReceiveMemoryWarning, object: nil) + self, selector: #selector(clearMemoryCache), name: memoryNotification, object: nil) NotificationCenter.default.addObserver( - self, selector: #selector(cleanExpiredDiskCache), name: .UIApplicationWillTerminate, object: nil) + self, selector: #selector(cleanExpiredDiskCache), name: terminateNotification, object: nil) NotificationCenter.default.addObserver( - self, selector: #selector(backgroundCleanExpiredDiskCache), name: .UIApplicationDidEnterBackground, object: nil) + self, selector: #selector(backgroundCleanExpiredDiskCache), name: enterbackgroundNotification, object: nil) #endif } @@ -227,16 +243,21 @@ open class ImageCache { - parameter key: Key for the image. - parameter identifier: The identifier of processor used. If you are using a processor for the image, pass the identifier of processor to it. This identifier will be used to generate a corresponding key for the combination of `key` and processor. - - parameter fromDisk: Whether this image should be removed from disk or not. If false, the image will be only removed from memory. + - parameter fromMemory: Whether this image should be removed from memory or not. If false, the image won't be removed from memory. + - parameter fromDisk: Whether this image should be removed from disk or not. If false, the image won't be removed from disk. - parameter completionHandler: Called when removal operation completes. */ open func removeImage(forKey key: String, processorIdentifier identifier: String = "", + fromMemory: Bool = true, fromDisk: Bool = true, completionHandler: (() -> Void)? = nil) { let computedKey = key.computedKey(with: identifier) - memoryCache.removeObject(forKey: computedKey as NSString) + + if fromMemory { + memoryCache.removeObject(forKey: computedKey as NSString) + } func callHandlerInMainQueue() { if let handler = completionHandler { @@ -274,7 +295,7 @@ open class ImageCache { @discardableResult open func retrieveImage(forKey key: String, options: KingfisherOptionsInfo?, - completionHandler: ((Image?, CacheType) -> ())?) -> RetrieveImageDiskTask? + completionHandler: ((Image?, CacheType) -> Void)?) -> RetrieveImageDiskTask? { // No completion handler. Not start working and early return. guard let completionHandler = completionHandler else { @@ -283,10 +304,15 @@ open class ImageCache { var block: RetrieveImageDiskTask? let options = options ?? KingfisherEmptyOptionsInfo - + let imageModifier = options.imageModifier + if let image = self.retrieveImageInMemoryCache(forKey: key, options: options) { options.callbackDispatchQueue.safeAsync { - completionHandler(image, .memory) + completionHandler(imageModifier.modify(image), .memory) + } + } else if options.fromMemoryCacheOrRefresh { // Only allows to get images from memory cache. + options.callbackDispatchQueue.safeAsync { + completionHandler(nil, .none) } } else { var sSelf: ImageCache! = self @@ -295,7 +321,8 @@ open class ImageCache { if let image = sSelf.retrieveImageInDiskCache(forKey: key, options: options) { if options.backgroundDecode { sSelf.processQueue.async { - let result = image.kf.decoded(scale: options.scaleFactor) + + let result = image.kf.decoded sSelf.store(result, forKey: key, @@ -303,9 +330,8 @@ open class ImageCache { cacheSerializer: options.cacheSerializer, toDisk: false, completionHandler: nil) - options.callbackDispatchQueue.safeAsync { - completionHandler(result, .memory) + completionHandler(imageModifier.modify(result), .disk) sSelf = nil } } @@ -318,7 +344,7 @@ open class ImageCache { completionHandler: nil ) options.callbackDispatchQueue.safeAsync { - completionHandler(image, .disk) + completionHandler(imageModifier.modify(image), .disk) sSelf = nil } } @@ -414,7 +440,7 @@ open class ImageCache { */ open func cleanExpiredDiskCache(completion handler: (()->())? = nil) { - // Do things in cocurrent io queue + // Do things in concurrent io queue ioQueue.async { var (URLsToDelete, diskCacheSize, cachedFiles) = self.travelCachedFiles(onlyForCacheSize: false) @@ -525,7 +551,11 @@ open class ImageCache { func endBackgroundTask(_ task: inout UIBackgroundTaskIdentifier) { sharedApplication.endBackgroundTask(task) + #if swift(>=4.2) + task = UIBackgroundTaskIdentifier.invalid + #else task = UIBackgroundTaskInvalid + #endif } var backgroundTask: UIBackgroundTaskIdentifier! @@ -542,27 +572,17 @@ open class ImageCache { // MARK: - Check cache status - /** - * Cache result for checking whether an image is cached for a key. - */ - public struct CacheCheckResult { - public let cached: Bool - public let cacheType: CacheType? - } - - /** - Check whether an image is cached for a key. - - - parameter key: Key for the image. - - - returns: The check result. - */ - open func isImageCached(forKey key: String, processorIdentifier identifier: String = "") -> CacheCheckResult { - + /// Cache type for checking whether an image is cached for a key in current cache. + /// + /// - Parameters: + /// - key: Key for the image. + /// - identifier: Processor identifier which used for this image. Default is empty string. + /// - Returns: A `CacheType` instance which indicates the cache status. `.none` means the image is not in cache yet. + open func imageCachedType(forKey key: String, processorIdentifier identifier: String = "") -> CacheType { let computedKey = key.computedKey(with: identifier) if memoryCache.object(forKey: computedKey as NSString) != nil { - return CacheCheckResult(cached: true, cacheType: .memory) + return .memory } let filePath = cachePath(forComputedKey: computedKey) @@ -571,12 +591,12 @@ open class ImageCache { ioQueue.sync { diskCached = fileManager.fileExists(atPath: filePath) } - + if diskCached { - return CacheCheckResult(cached: true, cacheType: .disk) + return .disk } - return CacheCheckResult(cached: false, cacheType: nil) + return .none } /** @@ -598,7 +618,7 @@ open class ImageCache { - parameter completionHandler: Called with the calculated size when finishes. */ - open func calculateDiskCacheSize(completion handler: @escaping ((_ size: UInt) -> ())) { + open func calculateDiskCacheSize(completion handler: @escaping ((_ size: UInt) -> Void)) { ioQueue.async { let (_, diskCacheSize, _) = self.travelCachedFiles(onlyForCacheSize: true) DispatchQueue.main.async { @@ -652,6 +672,39 @@ extension ImageCache { } } +// MARK: - Deprecated +extension ImageCache { + /** + * Cache result for checking whether an image is cached for a key. + */ + @available(*, deprecated, + message: "CacheCheckResult is deprecated. Use imageCachedType(forKey:processorIdentifier:) API instead.") + public struct CacheCheckResult { + public let cached: Bool + public let cacheType: CacheType? + } + + /** + Check whether an image is cached for a key. + + - parameter key: Key for the image. + + - returns: The check result. + */ + @available(*, deprecated, + message: "Use imageCachedType(forKey:processorIdentifier:) instead. CacheCheckResult.none indicates not being cached.", + renamed: "imageCachedType(forKey:processorIdentifier:)") + open func isImageCached(forKey key: String, processorIdentifier identifier: String = "") -> CacheCheckResult { + let result = imageCachedType(forKey: key, processorIdentifier: identifier) + switch result { + case .memory, .disk: + return CacheCheckResult(cached: true, cacheType: result) + case .none: + return CacheCheckResult(cached: false, cacheType: nil) + } + } +} + extension Kingfisher where Base: Image { var imageCost: Int { return images == nil ? diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageDownloader.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageDownloader.swift index 46039b4..4a24735 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageDownloader.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageDownloader.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -34,20 +34,20 @@ import UIKit public typealias ImageDownloaderProgressBlock = DownloadProgressBlock /// Completion block of downloader. -public typealias ImageDownloaderCompletionHandler = ((_ image: Image?, _ error: NSError?, _ url: URL?, _ originalData: Data?) -> ()) +public typealias ImageDownloaderCompletionHandler = ((_ image: Image?, _ error: NSError?, _ url: URL?, _ originalData: Data?) -> Void) /// Download task. public struct RetrieveImageDownloadTask { let internalTask: URLSessionDataTask - /// Downloader by which this task is intialized. + /// Downloader by which this task is initialized. public private(set) weak var ownerDownloader: ImageDownloader? - /** - Cancel this download task. It will trigger the completion handler with an NSURLErrorCancelled error. - */ + + /// Cancel this download task. It will trigger the completion handler with an NSURLErrorCancelled error. + /// If you want to cancel all downloading tasks, call `cancelAll()` of `ImageDownloader` instance. public func cancel() { - ownerDownloader?.cancelDownloadingTask(self) + ownerDownloader?.cancel(self) } /// The original request URL of this download task. @@ -75,7 +75,7 @@ public enum KingfisherError: Int { /// badData: The downloaded data is not an image or the data is corrupted. case badData = 10000 - /// notModified: The remote server responsed a 304 code. No image data downloaded. + /// notModified: The remote server responded a 304 code. No image data downloaded. case notModified = 10001 /// The HTTP status code in response is not valid. If an invalid @@ -83,7 +83,7 @@ public enum KingfisherError: Int { /// in `userInfo` to see the code. case invalidStatusCode = 10002 - /// notCached: The image rquested is not in cache but .onlyFromCache is activated. + /// notCached: The image requested is not in cache but .onlyFromCache is activated. case notCached = 10003 /// The URL is invalid. @@ -97,7 +97,26 @@ public enum KingfisherError: Int { public let KingfisherErrorStatusCodeKey = "statusCode" /// Protocol of `ImageDownloader`. -public protocol ImageDownloaderDelegate: class { +public protocol ImageDownloaderDelegate: AnyObject { + /** + Called when the `ImageDownloader` object will start downloading an image from specified URL. + + - parameter downloader: The `ImageDownloader` object finishes the downloading. + - parameter url: URL of the original request URL. + - parameter response: The request object for the download process. + */ + func imageDownloader(_ downloader: ImageDownloader, willDownloadImageForURL url: URL, with request: URLRequest?) + + /** + Called when the `ImageDownloader` completes a downloading request with success or failure. + + - parameter downloader: The `ImageDownloader` object finishes the downloading. + - parameter url: URL of the original request URL. + - parameter response: The response object of the downloading process. + - parameter error: The error in case of failure. + */ + func imageDownloader(_ downloader: ImageDownloader, didFinishDownloadingImageForURL url: URL, with response: URLResponse?, error: Error?) + /** Called when the `ImageDownloader` object successfully downloaded an image from specified URL. @@ -108,7 +127,6 @@ public protocol ImageDownloaderDelegate: class { */ func imageDownloader(_ downloader: ImageDownloader, didDownload image: Image, for url: URL, with response: URLResponse?) - /** Check if a received HTTP status code is valid or not. By default, a status code between 200 to 400 (excluded) is considered as valid. @@ -124,18 +142,40 @@ public protocol ImageDownloaderDelegate: class { you can implement this method to change that behavior. */ func isValidStatusCode(_ code: Int, for downloader: ImageDownloader) -> Bool + + /** + Called when the `ImageDownloader` object successfully downloaded image data from specified URL. + + - parameter downloader: The `ImageDownloader` object finishes data downloading. + - parameter data: Downloaded data. + - parameter url: URL of the original request URL. + + - returns: The data from which Kingfisher should use to create an image. + + - Note: This callback can be used to preprocess raw image data + before creation of UIImage instance (i.e. decrypting or verification). + */ + func imageDownloader(_ downloader: ImageDownloader, didDownload data: Data, for url: URL) -> Data? } extension ImageDownloaderDelegate { + + public func imageDownloader(_ downloader: ImageDownloader, willDownloadImageForURL url: URL, with request: URLRequest?) {} + + public func imageDownloader(_ downloader: ImageDownloader, didFinishDownloadingImageForURL url: URL, with response: URLResponse?, error: Error?) {} + public func imageDownloader(_ downloader: ImageDownloader, didDownload image: Image, for url: URL, with response: URLResponse?) {} public func isValidStatusCode(_ code: Int, for downloader: ImageDownloader) -> Bool { return (200..<400).contains(code) } + public func imageDownloader(_ downloader: ImageDownloader, didDownload data: Data, for url: URL) -> Data? { + return data + } } /// Protocol indicates that an authentication challenge could be handled. -public protocol AuthenticationChallengeResponsable: class { +public protocol AuthenticationChallengeResponsable: AnyObject { /** Called when an session level authentication challenge is received. This method provide a chance to handle and response to the authentication challenge before downloading could start. @@ -144,9 +184,22 @@ public protocol AuthenticationChallengeResponsable: class { - parameter challenge: An object that contains the request for authentication. - parameter completionHandler: A handler that your delegate method must call. - - Note: This method is a forward from `URLSession(:didReceiveChallenge:completionHandler:)`. Please refer to the document of it in `NSURLSessionDelegate`. + - Note: This method is a forward from `URLSessionDelegate.urlSession(:didReceiveChallenge:completionHandler:)`. Please refer to the document of it in `URLSessionDelegate`. */ func downloader(_ downloader: ImageDownloader, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) + + /** + Called when an session level authentication challenge is received. + This method provide a chance to handle and response to the authentication challenge before downloading could start. + + - parameter downloader: The downloader which receives this challenge. + - parameter task: The task whose request requires authentication. + - parameter challenge: An object that contains the request for authentication. + - parameter completionHandler: A handler that your delegate method must call. + + - Note: This method is a forward from `URLSessionTaskDelegate.urlSession(:task:didReceiveChallenge:completionHandler:)`. Please refer to the document of it in `URLSessionTaskDelegate`. + */ + func downloader(_ downloader: ImageDownloader, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) } extension AuthenticationChallengeResponsable { @@ -163,6 +216,12 @@ extension AuthenticationChallengeResponsable { completionHandler(.performDefaultHandling, nil) } + + func downloader(_ downloader: ImageDownloader, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + + completionHandler(.performDefaultHandling, nil) + } + } /// `ImageDownloader` represents a downloading manager for requesting the image with a URL from server. @@ -174,6 +233,7 @@ open class ImageDownloader { var downloadTaskCount = 0 var downloadTask: RetrieveImageDownloadTask? + var cancelSemaphore: DispatchSemaphore? } // MARK: - Public property @@ -182,19 +242,20 @@ open class ImageDownloader { /// A set of trusted hosts when receiving server trust challenges. A challenge with host name contained in this set will be ignored. /// You can use this set to specify the self-signed site. It only will be used if you don't specify the `authenticationChallengeResponder`. - /// If `authenticationChallengeResponder` is set, this property will be ignored and the implemention of `authenticationChallengeResponder` will be used instead. + /// If `authenticationChallengeResponder` is set, this property will be ignored and the implementation of `authenticationChallengeResponder` will be used instead. open var trustedHosts: Set? /// Use this to set supply a configuration for the downloader. By default, NSURLSessionConfiguration.ephemeralSessionConfiguration() will be used. - /// You could change the configuration before a downloaing task starts. A configuration without persistent storage for caches is requsted for downloader working correctly. + /// You could change the configuration before a downloading task starts. A configuration without persistent storage for caches is requested for downloader working correctly. open var sessionConfiguration = URLSessionConfiguration.ephemeral { didSet { - session = URLSession(configuration: sessionConfiguration, delegate: sessionHandler, delegateQueue: OperationQueue.main) + session?.invalidateAndCancel() + session = URLSession(configuration: sessionConfiguration, delegate: sessionHandler, delegateQueue: nil) } } - /// Whether the download requests should use pipeling or not. Default is false. - open var requestsUsePipeling = false + /// Whether the download requests should use pipline or not. Default is false. + open var requestsUsePipelining = false fileprivate let sessionHandler: ImageDownloaderSessionHandler fileprivate var session: URLSession? @@ -209,6 +270,7 @@ open class ImageDownloader { // MARK: - Internal property let barrierQueue: DispatchQueue let processQueue: DispatchQueue + let cancelQueue: DispatchQueue typealias CallbackPair = (progressBlock: ImageDownloaderProgressBlock?, completionHandler: ImageDownloaderCompletionHandler?) @@ -222,8 +284,6 @@ open class ImageDownloader { Init a downloader with name. - parameter name: The name for the downloader. It should not be empty. - - - returns: The downloader object. */ public init(name: String) { if name.isEmpty { @@ -232,17 +292,22 @@ open class ImageDownloader { barrierQueue = DispatchQueue(label: "com.onevcat.Kingfisher.ImageDownloader.Barrier.\(name)", attributes: .concurrent) processQueue = DispatchQueue(label: "com.onevcat.Kingfisher.ImageDownloader.Process.\(name)", attributes: .concurrent) + cancelQueue = DispatchQueue(label: "com.onevcat.Kingfisher.ImageDownloader.Cancel.\(name)") - sessionHandler = ImageDownloaderSessionHandler() + sessionHandler = ImageDownloaderSessionHandler(name: name) // Provide a default implement for challenge responder. authenticationChallengeResponder = sessionHandler session = URLSession(configuration: sessionConfiguration, delegate: sessionHandler, delegateQueue: .main) } + deinit { + session?.invalidateAndCancel() + } + func fetchLoad(for url: URL) -> ImageFetchLoad? { var fetchLoad: ImageFetchLoad? - barrierQueue.sync { fetchLoad = fetchLoads[url] } + barrierQueue.sync(flags: .barrier) { fetchLoad = fetchLoads[url] } return fetchLoad } @@ -250,6 +315,7 @@ open class ImageDownloader { Download an image with a URL and option. - parameter url: Target URL. + - parameter retrieveImageTask: The task to cooperate with cache. Pass `nil` if you are not trying to use downloader and cache. - parameter options: The options could control download behavior. See `KingfisherOptionsInfo`. - parameter progressBlock: Called when the download progress updated. - parameter completionHandler: Called when the download progress finishes. @@ -258,25 +324,10 @@ open class ImageDownloader { */ @discardableResult open func downloadImage(with url: URL, - options: KingfisherOptionsInfo? = nil, - progressBlock: ImageDownloaderProgressBlock? = nil, - completionHandler: ImageDownloaderCompletionHandler? = nil) -> RetrieveImageDownloadTask? - { - return downloadImage(with: url, - retrieveImageTask: nil, - options: options, - progressBlock: progressBlock, - completionHandler: completionHandler) - } -} - -// MARK: - Download method -extension ImageDownloader { - func downloadImage(with url: URL, - retrieveImageTask: RetrieveImageTask?, - options: KingfisherOptionsInfo?, - progressBlock: ImageDownloaderProgressBlock?, - completionHandler: ImageDownloaderCompletionHandler?) -> RetrieveImageDownloadTask? + retrieveImageTask: RetrieveImageTask? = nil, + options: KingfisherOptionsInfo? = nil, + progressBlock: ImageDownloaderProgressBlock? = nil, + completionHandler: ImageDownloaderCompletionHandler? = nil) -> RetrieveImageDownloadTask? { if let retrieveImageTask = retrieveImageTask, retrieveImageTask.cancelledBeforeDownloadStarting { completionHandler?(nil, NSError(domain: KingfisherErrorDomain, code: KingfisherError.downloadCancelledBeforeStarting.rawValue, userInfo: nil), nil, nil) @@ -287,7 +338,7 @@ extension ImageDownloader { // We need to set the URL as the load key. So before setup progress, we need to ask the `requestModifier` for a final URL. var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: timeout) - request.httpShouldUsePipelining = requestsUsePipeling + request.httpShouldUsePipelining = requestsUsePipelining if let modifier = options?.modifier { guard let r = modifier.modified(for: request) else { @@ -297,7 +348,7 @@ extension ImageDownloader { request = r } - // There is a possiblility that request modifier changed the url to `nil` or empty. + // There is a possibility that request modifier changed the url to `nil` or empty. guard let url = request.url, !url.absoluteString.isEmpty else { completionHandler?(nil, NSError(domain: KingfisherErrorDomain, code: KingfisherError.invalidURL.rawValue, userInfo: nil), nil, nil) return nil @@ -309,8 +360,9 @@ extension ImageDownloader { let dataTask = session.dataTask(with: request) fetchLoad.downloadTask = RetrieveImageDownloadTask(internalTask: dataTask, ownerDownloader: self) - + dataTask.priority = options?.downloadPriority ?? URLSessionTask.defaultPriority + self.delegate?.imageDownloader(self, willDownloadImageForURL: url, with: request) dataTask.resume() // Hold self while the task is executing. @@ -325,38 +377,80 @@ extension ImageDownloader { return downloadTask } +} + +// MARK: - Download method +extension ImageDownloader { + // A single key may have multiple callbacks. Only download once. - func setup(progressBlock: ImageDownloaderProgressBlock?, with completionHandler: ImageDownloaderCompletionHandler?, for url: URL, options: KingfisherOptionsInfo?, started: ((URLSession, ImageFetchLoad) -> Void)) { + func setup(progressBlock: ImageDownloaderProgressBlock?, with completionHandler: ImageDownloaderCompletionHandler?, for url: URL, options: KingfisherOptionsInfo?, started: @escaping ((URLSession, ImageFetchLoad) -> Void)) { - barrierQueue.sync(flags: .barrier) { - let loadObjectForURL = fetchLoads[url] ?? ImageFetchLoad() - let callbackPair = (progressBlock: progressBlock, completionHandler: completionHandler) - - loadObjectForURL.contents.append((callbackPair, options ?? KingfisherEmptyOptionsInfo)) - - fetchLoads[url] = loadObjectForURL - - if let session = session { - started(session, loadObjectForURL) + func prepareFetchLoad() { + barrierQueue.sync(flags: .barrier) { + let loadObjectForURL = fetchLoads[url] ?? ImageFetchLoad() + let callbackPair = (progressBlock: progressBlock, completionHandler: completionHandler) + + loadObjectForURL.contents.append((callbackPair, options ?? KingfisherEmptyOptionsInfo)) + + fetchLoads[url] = loadObjectForURL + + if let session = session { + started(session, loadObjectForURL) + } + } + } + + if let fetchLoad = fetchLoad(for: url), fetchLoad.downloadTaskCount == 0 { + if fetchLoad.cancelSemaphore == nil { + fetchLoad.cancelSemaphore = DispatchSemaphore(value: 0) + } + cancelQueue.async { + _ = fetchLoad.cancelSemaphore?.wait(timeout: .distantFuture) + fetchLoad.cancelSemaphore = nil + prepareFetchLoad() } + } else { + prepareFetchLoad() } } - func cancelDownloadingTask(_ task: RetrieveImageDownloadTask) { - barrierQueue.sync { - if let URL = task.internalTask.originalRequest?.url, let imageFetchLoad = self.fetchLoads[URL] { - imageFetchLoad.downloadTaskCount -= 1 - if imageFetchLoad.downloadTaskCount == 0 { - task.internalTask.cancel() - } + private func cancelTaskImpl(_ task: RetrieveImageDownloadTask, fetchLoad: ImageFetchLoad? = nil, ignoreTaskCount: Bool = false) { + + func getFetchLoad(from task: RetrieveImageDownloadTask) -> ImageFetchLoad? { + guard let URL = task.internalTask.originalRequest?.url, + let imageFetchLoad = self.fetchLoads[URL] else + { + return nil } + return imageFetchLoad } + + guard let imageFetchLoad = fetchLoad ?? getFetchLoad(from: task) else { + return + } + + imageFetchLoad.downloadTaskCount -= 1 + if ignoreTaskCount || imageFetchLoad.downloadTaskCount == 0 { + task.internalTask.cancel() + } + } + + func cancel(_ task: RetrieveImageDownloadTask) { + barrierQueue.sync(flags: .barrier) { cancelTaskImpl(task) } } - func clean(for url: URL) { + /// Cancel all downloading tasks. It will trigger the completion handlers for all not-yet-finished + /// downloading tasks with an NSURLErrorCancelled error. + /// + /// If you need to only cancel a certain task, call `cancel()` on the `RetrieveImageDownloadTask` + /// returned by the downloading methods. + public func cancelAll() { barrierQueue.sync(flags: .barrier) { - fetchLoads.removeValue(forKey: url) - return + fetchLoads.forEach { v in + let fetchLoad = v.value + guard let task = fetchLoad.downloadTask else { return } + cancelTaskImpl(task, fetchLoad: fetchLoad, ignoreTaskCount: true) + } } } } @@ -368,11 +462,26 @@ extension ImageDownloader { /// If we use `ImageDownloader` as the session delegate, it will not be released. /// So we need an additional handler to break the retain cycle. // See https://github.com/onevcat/Kingfisher/issues/235 -class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, AuthenticationChallengeResponsable { - +final class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, AuthenticationChallengeResponsable { + + private let downloaderQueue: DispatchQueue + // The holder will keep downloader not released while a data task is being executed. // It will be set when the task started, and reset when the task finished. - var downloadHolder: ImageDownloader? + private var _downloadHolder: ImageDownloader? + var downloadHolder: ImageDownloader? { + get { + return downloaderQueue.sync { _downloadHolder } + } + set { + downloaderQueue.sync { _downloadHolder = newValue } + } + } + + init(name: String) { + downloaderQueue = DispatchQueue(label: "com.onevcat.Kingfisher.ImageDownloader.SessionHandler.\(name)") + super.init() + } func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { @@ -381,6 +490,8 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic return } + var disposition = URLSession.ResponseDisposition.allow + if let statusCode = (response as? HTTPURLResponse)?.statusCode, let url = dataTask.originalRequest?.url, !(downloader.delegate ?? downloader).isValidStatusCode(statusCode, for: downloader) @@ -388,10 +499,17 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic let error = NSError(domain: KingfisherErrorDomain, code: KingfisherError.invalidStatusCode.rawValue, userInfo: [KingfisherErrorStatusCodeKey: statusCode, NSLocalizedDescriptionKey: HTTPURLResponse.localizedString(forStatusCode: statusCode)]) + + // Needs to be called before callCompletionHandlerFailure() because it removes downloadHolder + if let downloader = downloadHolder { + downloader.delegate?.imageDownloader(downloader, didFinishDownloadingImageForURL: url, with: response, error: error) + } + callCompletionHandlerFailure(error: error, url: url) + disposition = .cancel } - completionHandler(.allow) + completionHandler(disposition) } func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { @@ -419,6 +537,10 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic return } + if let downloader = downloadHolder { + downloader.delegate?.imageDownloader(downloader, didFinishDownloadingImageForURL: url, with: task.response, error: error) + } + guard error == nil else { callCompletionHandlerFailure(error: error!, url: url) return @@ -438,15 +560,24 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic downloader.authenticationChallengeResponder?.downloader(downloader, didReceive: challenge, completionHandler: completionHandler) } - private func cleanFetchLoad(for url: URL) { + func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { guard let downloader = downloadHolder else { return } - downloader.clean(for: url) - - if downloader.fetchLoads.isEmpty { - downloadHolder = nil + downloader.authenticationChallengeResponder?.downloader(downloader, task: task, didReceive: challenge, completionHandler: completionHandler) + } + + private func cleanFetchLoad(for url: URL) { + guard let downloader = downloadHolder else { + return + } + + downloader.barrierQueue.sync(flags: .barrier) { + downloader.fetchLoads.removeValue(forKey: url) + if downloader.fetchLoads.isEmpty { + downloadHolder = nil + } } } @@ -458,6 +589,11 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic // We need to clean the fetch load first, before actually calling completion handler. cleanFetchLoad(for: url) + var leftSignal: Int + repeat { + leftSignal = fetchLoad.cancelSemaphore?.signal() ?? 0 + } while leftSignal != 0 + for content in fetchLoad.contents { content.options.callbackDispatchQueue.safeAsync { content.callback.completionHandler?(nil, error as NSError, url, nil) @@ -480,7 +616,14 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic self.cleanFetchLoad(for: url) - let data = fetchLoad.responseData as Data + let data: Data? + let fetchedData = fetchLoad.responseData as Data + + if let delegate = downloader.delegate { + data = delegate.imageDownloader(downloader, didDownload: fetchedData, for: url) + } else { + data = fetchedData + } // Cache the processed images. So we do not need to re-process the image if using the same processor. // Key is the identifier of processor. @@ -492,25 +635,26 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic let callbackQueue = options.callbackDispatchQueue let processor = options.processor - var image = imageCache[processor.identifier] - if image == nil { + if let data = data, image == nil { image = processor.process(item: .data(data), options: options) - // Add the processed image to cache. // If `image` is nil, nothing will happen (since the key is not existing before). imageCache[processor.identifier] = image } if let image = image { - + downloader.delegate?.imageDownloader(downloader, didDownload: image, for: url, with: task.response) - + + let imageModifier = options.imageModifier + let finalImage = imageModifier.modify(image) + if options.backgroundDecode { - let decodedImage = image.kf.decoded(scale: options.scaleFactor) + let decodedImage = finalImage.kf.decoded callbackQueue.safeAsync { completionHandler?(decodedImage, nil, url, data) } } else { - callbackQueue.safeAsync { completionHandler?(image, nil, url, data) } + callbackQueue.safeAsync { completionHandler?(finalImage, nil, url, data) } } } else { @@ -530,3 +674,4 @@ class ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, Authentic // Placeholder. For retrieving extension methods of ImageDownloaderDelegate extension ImageDownloader: ImageDownloaderDelegate {} + diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageModifier.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageModifier.swift new file mode 100644 index 0000000..ddd7ffc --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageModifier.swift @@ -0,0 +1,191 @@ +// +// ImageModifier.swift +// Kingfisher +// +// Created by Ethan Gill on 2017/11/28. +// +// Copyright (c) 2018 Ethan Gill +// +// 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. + +import Foundation + +/// An `ImageModifier` can be used to change properties on an Image in between +/// cache serialization and use of the image. +public protocol ImageModifier { + /// Modify an input `Image`. + /// + /// - parameter image: Image which will be modified by `self` + /// + /// - returns: The modified image. + /// + /// - Note: The return value will be unmodified if modifying is not possible on + /// the current platform. + /// - Note: Most modifiers support UIImage or NSImage, but not CGImage. + func modify(_ image: Image) -> Image +} + +extension ImageModifier { + func modify(_ image: Image?) -> Image? { + guard let image = image else { + return nil + } + return modify(image) + } +} + +typealias ModifierImp = ((Image) -> Image) + +fileprivate struct GeneralModifier: ImageModifier { + let identifier: String + let m: ModifierImp + func modify(_ image: Image) -> Image { + return m(image) + } +} + +/// The default modifier. +/// Does nothing and returns the image it was given +public struct DefaultImageModifier: ImageModifier { + + /// A default `DefaultImageModifier` which can be used everywhere. + public static let `default` = DefaultImageModifier() + + /// Initialize a `DefaultImageModifier` + private init() {} + + /// Modify an input `Image`. + /// + /// - parameter image: Image which will be modified by `self` + /// + /// - returns: The modified image. + /// + /// - Note: See documentation of `ImageModifier` protocol for more. + public func modify(_ image: Image) -> Image { + return image + } +} + +/// A custom modifier. +/// Can be initialized with a block to modify images in a custom way +public struct AnyImageModifier: ImageModifier { + + /// A block which modifies images, or returns the original image + /// if modification cannot be performed. + let block: (Image) -> Image + + /// Initialize an `AnyImageModifier` + public init(modify: @escaping (Image) -> Image) { + block = modify + } + + /// Modifies an input `Image` using this `AnyImageModifier`'s `block`. + /// + /// - parameter image: Image which will be modified by `self` + /// + /// - returns: The modified image. + /// + /// - Note: See documentation of `ImageModifier` protocol for more. + public func modify(_ image: Image) -> Image { + return block(image) + } +} + +#if os(iOS) || os(tvOS) || os(watchOS) +import UIKit + +/// Modifier for setting the rendering mode of images. +/// Only UI-based images are supported; if a non-UI image is passed in, the +/// modifier will do nothing. +public struct RenderingModeImageModifier: ImageModifier { + + /// The rendering mode to apply to the image. + public let renderingMode: UIImage.RenderingMode + + /// Initialize a `RenderingModeImageModifier` + /// + /// - parameter renderingMode: The rendering mode to apply to the image. + /// Default is .automatic + public init(renderingMode: UIImage.RenderingMode = .automatic) { + self.renderingMode = renderingMode + } + + /// Modify an input `Image`. + /// + /// - parameter image: Image which will be modified by `self` + /// + /// - returns: The modified image. + /// + /// - Note: See documentation of `ImageModifier` protocol for more. + public func modify(_ image: Image) -> Image { + return image.withRenderingMode(renderingMode) + } +} + +/// Modifier for setting the `flipsForRightToLeftLayoutDirection` property of images. +/// Only UI-based images are supported; if a non-UI image is passed in, the +/// modifier will do nothing. +public struct FlipsForRightToLeftLayoutDirectionImageModifier: ImageModifier { + /// Initialize a `FlipsForRightToLeftLayoutDirectionImageModifier` + /// + /// - Note: On versions of iOS lower than 9.0, the image will be returned + /// unmodified. + public init() {} + + /// Modify an input `Image`. + /// + /// - parameter image: Image which will be modified by `self` + /// + /// - returns: The modified image. + /// + /// - Note: See documentation of `ImageModifier` protocol for more. + public func modify(_ image: Image) -> Image { + if #available(iOS 9.0, *) { + return image.imageFlippedForRightToLeftLayoutDirection() + } else { + return image + } + } +} + +/// Modifier for setting the `alignmentRectInsets` property of images. +/// Only UI-based images are supported; if a non-UI image is passed in, the +/// modifier will do nothing. +public struct AlignmentRectInsetsImageModifier: ImageModifier { + + /// The alignment insets to apply to the image + public let alignmentInsets: UIEdgeInsets + + /// Initialize a `AlignmentRectInsetsImageModifier` + public init(alignmentInsets: UIEdgeInsets) { + self.alignmentInsets = alignmentInsets + } + + /// Modify an input `Image`. + /// + /// - parameter image: Image which will be modified by `self` + /// + /// - returns: The modified image. + /// + /// - Note: See documentation of `ImageModifier` protocol for more. + public func modify(_ image: Image) -> Image { + return image.withAlignmentRectInsets(alignmentInsets) + } +} +#endif diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImagePrefetcher.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImagePrefetcher.swift index b7c0a21..7a2a24b 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImagePrefetcher.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImagePrefetcher.swift @@ -4,7 +4,7 @@ // // Created by Claire Knight on 24/02/2016 // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -37,14 +37,14 @@ /// - `skippedResources`: An array of resources that are already cached before the prefetching starting. /// - `failedResources`: An array of resources that fail to be downloaded. It could because of being cancelled while downloading, encountered an error when downloading or the download not being started at all. /// - `completedResources`: An array of resources that are downloaded and cached successfully. -public typealias PrefetcherProgressBlock = ((_ skippedResources: [Resource], _ failedResources: [Resource], _ completedResources: [Resource]) -> ()) +public typealias PrefetcherProgressBlock = ((_ skippedResources: [Resource], _ failedResources: [Resource], _ completedResources: [Resource]) -> Void) /// Completion block of prefetcher. /// /// - `skippedResources`: An array of resources that are already cached before the prefetching starting. /// - `failedResources`: An array of resources that fail to be downloaded. It could because of being cancelled while downloading, encountered an error when downloading or the download not being started at all. /// - `completedResources`: An array of resources that are downloaded and cached successfully. -public typealias PrefetcherCompletionHandler = ((_ skippedResources: [Resource], _ failedResources: [Resource], _ completedResources: [Resource]) -> ()) +public typealias PrefetcherCompletionHandler = ((_ skippedResources: [Resource], _ failedResources: [Resource], _ completedResources: [Resource]) -> Void) /// `ImagePrefetcher` represents a downloading manager for requesting many images via URLs, then caching them. /// This is useful when you know a list of image resources and want to download them before showing. @@ -53,6 +53,10 @@ public class ImagePrefetcher { /// The maximum concurrent downloads to use when prefetching images. Default is 5. public var maxConcurrentDownloads = 5 + /// The dispatch queue to use for handling resource process so downloading does not occur on the main thread + /// This prevents stuttering when preloading images in a collection view or table view + private var prefetchQueue: DispatchQueue + private let prefetchResources: [Resource] private let optionsInfo: KingfisherOptionsInfo private var progressBlock: PrefetcherProgressBlock? @@ -86,8 +90,6 @@ public class ImagePrefetcher { - parameter progressBlock: Called every time an resource is downloaded, skipped or cancelled. - parameter completionHandler: Called when the whole prefetching process finished. - - returns: An `ImagePrefetcher` object. - - Note: By default, the `ImageDownloader.defaultDownloader` and `ImageCache.defaultCache` will be used as the downloader and cache target respectively. You can specify another downloader or cache by using a customized `KingfisherOptionsInfo`. Both the progress and completion block will be invoked in main thread. The `CallbackDispatchQueue` in `optionsInfo` will be ignored in this method. @@ -112,9 +114,7 @@ public class ImagePrefetcher { - parameter options: A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more. - parameter progressBlock: Called every time an resource is downloaded, skipped or cancelled. - parameter completionHandler: Called when the whole prefetching process finished. - - - returns: An `ImagePrefetcher` object. - + - Note: By default, the `ImageDownloader.defaultDownloader` and `ImageCache.defaultCache` will be used as the downloader and cache target respectively. You can specify another downloader or cache by using a customized `KingfisherOptionsInfo`. Both the progress and completion block will be invoked in main thread. The `CallbackDispatchQueue` in `optionsInfo` will be ignored in this method. @@ -127,12 +127,20 @@ public class ImagePrefetcher { prefetchResources = resources pendingResources = ArraySlice(resources) - // We want all callbacks from main queue, so we ignore the call back queue in options - let optionsInfoWithoutQueue = options?.removeAllMatchesIgnoringAssociatedValue(.callbackDispatchQueue(nil)) - self.optionsInfo = optionsInfoWithoutQueue ?? KingfisherEmptyOptionsInfo + // Set up the dispatch queue that all our work should occur on. + let prefetchQueueName = "com.onevcat.Kingfisher.PrefetchQueue" + prefetchQueue = DispatchQueue(label: prefetchQueueName) - let cache = self.optionsInfo.targetCache - let downloader = self.optionsInfo.downloader + // We want all callbacks from our prefetch queue, so we should ignore the call back queue in options + var optionsInfoWithoutQueue = options?.removeAllMatchesIgnoringAssociatedValue(.callbackDispatchQueue(nil)) ?? KingfisherEmptyOptionsInfo + + // Add our own callback dispatch queue to make sure all callbacks are coming back in our expected queue + optionsInfoWithoutQueue.append(.callbackDispatchQueue(prefetchQueue)) + + self.optionsInfo = optionsInfoWithoutQueue + + let cache = self.optionsInfo.targetCache ?? .default + let downloader = self.optionsInfo.downloader ?? .default manager = KingfisherManager(downloader: downloader, cache: cache) self.progressBlock = progressBlock @@ -146,8 +154,8 @@ public class ImagePrefetcher { */ public func start() { - // Since we want to handle the resources cancellation in main thread only. - DispatchQueue.main.safeAsync { + // Since we want to handle the resources cancellation in the prefetch queue only. + prefetchQueue.async { guard !self.stopped else { assertionFailure("You can not restart the same prefetcher. Try to create a new prefetcher.") @@ -180,20 +188,16 @@ public class ImagePrefetcher { Stop current downloading progress, and cancel any future prefetching activity that might be occuring. */ public func stop() { - DispatchQueue.main.safeAsync { - + prefetchQueue.async { if self.finished { return } - self.stopped = true - self.tasks.forEach { (_, task) -> () in - task.cancel() - } + self.tasks.values.forEach { $0.cancel() } } } func downloadAndCache(_ resource: Resource) { - let downloadTaskCompletionHandler: CompletionHandler = { (image, error, _, _) -> () in + let downloadTaskCompletionHandler: CompletionHandler = { (image, error, _, _) -> Void in self.tasks.removeValue(forKey: resource.downloadURL) if let _ = error { self.failedResources.append(resource) @@ -237,9 +241,8 @@ public class ImagePrefetcher { if optionsInfo.forceRefresh { downloadAndCache(resource) } else { - let alreadyInCache = manager.cache.isImageCached(forKey: resource.cacheKey, + let alreadyInCache = manager.cache.imageCachedType(forKey: resource.cacheKey, processorIdentifier: optionsInfo.processor.identifier).cached - if alreadyInCache { append(cached: resource) } else { @@ -253,17 +256,22 @@ public class ImagePrefetcher { } func reportCompletionOrStartNext() { - if let resource = pendingResources.popFirst() { - startPrefetching(resource) - } else { - guard tasks.isEmpty else { return } - handleComplete() + prefetchQueue.async { + if let resource = self.pendingResources.popFirst() { + self.startPrefetching(resource) + } else { + guard self.tasks.isEmpty else { return } + self.handleComplete() + } } } func handleComplete() { - completionHandler?(skippedResources, failedResources, completedResources) - completionHandler = nil - progressBlock = nil + // The completion handler should be called on the main thread + DispatchQueue.main.safeAsync { + self.completionHandler?(self.skippedResources, self.failedResources, self.completedResources) + self.completionHandler = nil + self.progressBlock = nil + } } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageProcessor.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageProcessor.swift index dc9088f..9d63cda 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageProcessor.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageProcessor.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 2016/08/26. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -27,6 +27,9 @@ import Foundation import CoreGraphics +#if os(macOS) +import AppKit +#endif /// The item which could be processed by an `ImageProcessor` /// @@ -40,9 +43,9 @@ public enum ImageProcessItem { /// An `ImageProcessor` would be used to convert some downloaded data to an image. public protocol ImageProcessor { /// Identifier of the processor. It will be used to identify the processor when - /// caching and retriving an image. You might want to make sure that processors with + /// caching and retrieving an image. You might want to make sure that processors with /// same properties/functionality have the same identifiers, so correct processed images - /// could be retrived with proper key. + /// could be retrieved with proper key. /// /// - Note: Do not supply an empty string for a customized processor, which is already taken by /// the `DefaultImageProcessor`. It is recommended to use a reverse domain name notation @@ -60,7 +63,7 @@ public protocol ImageProcessor { /// If input item is already an image and there is any errors in processing, the input /// image itself will be returned. /// - Note: Most processor only supports CG-based images. - /// watchOS is not supported for processers containing filter, the input image will be returned directly on watchOS. + /// watchOS is not supported for processors containing filter, the input image will be returned directly on watchOS. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? } @@ -88,6 +91,14 @@ public extension ImageProcessor { } } +func ==(left: ImageProcessor, right: ImageProcessor) -> Bool { + return left.identifier == right.identifier +} + +func !=(left: ImageProcessor, right: ImageProcessor) -> Bool { + return !(left == right) +} + fileprivate struct GeneralProcessor: ImageProcessor { let identifier: String let p: ProcessorImp @@ -122,17 +133,149 @@ public struct DefaultImageProcessor: ImageProcessor { public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): - return image + return image.kf.scaled(to: options.scaleFactor) case .data(let data): return Kingfisher.image( data: data, scale: options.scaleFactor, - preloadAllGIFData: options.preloadAllGIFData, + preloadAllAnimationData: options.preloadAllAnimationData, onlyFirstFrame: options.onlyLoadFirstFrame) } } } +public struct RectCorner: OptionSet { + public let rawValue: Int + public static let topLeft = RectCorner(rawValue: 1 << 0) + public static let topRight = RectCorner(rawValue: 1 << 1) + public static let bottomLeft = RectCorner(rawValue: 1 << 2) + public static let bottomRight = RectCorner(rawValue: 1 << 3) + public static let all: RectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight] + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + var cornerIdentifier: String { + if self == .all { + return "" + } + return "_corner(\(rawValue))" + } +} + +#if !os(macOS) +/// Processor for adding an blend mode to images. Only CG-based images are supported. +public struct BlendImageProcessor: ImageProcessor { + + /// Identifier of the processor. + /// - Note: See documentation of `ImageProcessor` protocol for more. + public let identifier: String + + /// Blend Mode will be used to blend the input image. + public let blendMode: CGBlendMode + /// Alpha will be used when blend image. + public let alpha: CGFloat + + /// Background color of the output image. If `nil`, it will stay transparent. + public let backgroundColor: Color? + + /// Initialize an `BlendImageProcessor` + /// + /// - parameter blendMode: Blend Mode will be used to blend the input image. + /// - parameter alpha: Alpha will be used when blend image. + /// From 0.0 to 1.0. 1.0 means solid image, 0.0 means transparent image. + /// Default is 1.0. + /// - parameter backgroundColor: Background color to apply for the output image. Default is `nil`. + public init(blendMode: CGBlendMode, alpha: CGFloat = 1.0, backgroundColor: Color? = nil) { + self.blendMode = blendMode + self.alpha = alpha + self.backgroundColor = backgroundColor + var identifier = "com.onevcat.Kingfisher.BlendImageProcessor(\(blendMode.rawValue),\(alpha))" + if let color = backgroundColor { + identifier.append("_\(color.hex)") + } + self.identifier = identifier + } + + /// Process an input `ImageProcessItem` item to an image for this processor. + /// + /// - parameter item: Input item which will be processed by `self` + /// - parameter options: Options when processing the item. + /// + /// - returns: The processed image. + /// + /// - Note: See documentation of `ImageProcessor` protocol for more. + public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { + switch item { + case .image(let image): + return image.kf.scaled(to: options.scaleFactor) + .kf.image(withBlendMode: blendMode, alpha: alpha, backgroundColor: backgroundColor) + case .data(_): + return (DefaultImageProcessor.default >> self).process(item: item, options: options) + } + } +} +#endif + +#if os(macOS) +/// Processor for adding an compositing operation to images. Only CG-based images are supported in macOS. +public struct CompositingImageProcessor: ImageProcessor { + + /// Identifier of the processor. + /// - Note: See documentation of `ImageProcessor` protocol for more. + public let identifier: String + + /// Compositing operation will be used to the input image. + public let compositingOperation: NSCompositingOperation + + /// Alpha will be used when compositing image. + public let alpha: CGFloat + + /// Background color of the output image. If `nil`, it will stay transparent. + public let backgroundColor: Color? + + /// Initialize an `CompositingImageProcessor` + /// + /// - parameter compositingOperation: Compositing operation will be used to the input image. + /// - parameter alpha: Alpha will be used when compositing image. + /// From 0.0 to 1.0. 1.0 means solid image, 0.0 means transparent image. + /// Default is 1.0. + /// - parameter backgroundColor: Background color to apply for the output image. Default is `nil`. + public init(compositingOperation: NSCompositingOperation, + alpha: CGFloat = 1.0, + backgroundColor: Color? = nil) + { + self.compositingOperation = compositingOperation + self.alpha = alpha + self.backgroundColor = backgroundColor + var identifier = "com.onevcat.Kingfisher.CompositingImageProcessor(\(compositingOperation.rawValue),\(alpha))" + if let color = backgroundColor { + identifier.append("_\(color.hex)") + } + self.identifier = identifier + } + + /// Process an input `ImageProcessItem` item to an image for this processor. + /// + /// - parameter item: Input item which will be processed by `self` + /// - parameter options: Options when processing the item. + /// + /// - returns: The processed image. + /// + /// - Note: See documentation of `ImageProcessor` protocol for more. + public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { + switch item { + case .image(let image): + return image.kf.scaled(to: options.scaleFactor) + .kf.image(withCompositingOperation: compositingOperation, alpha: alpha, backgroundColor: backgroundColor) + case .data(_): + return (DefaultImageProcessor.default >> self).process(item: item, options: options) + } + } +} +#endif + /// Processor for making round corner images. Only CG-based images are supported in macOS, /// if a non-CG image passed in, the processor will do nothing. public struct RoundCornerImageProcessor: ImageProcessor { @@ -144,23 +287,43 @@ public struct RoundCornerImageProcessor: ImageProcessor { /// Corner radius will be applied in processing. public let cornerRadius: CGFloat + /// The target corners which will be applied rounding. + public let roundingCorners: RectCorner + /// Target size of output image should be. If `nil`, the image will keep its original size after processing. public let targetSize: CGSize? - + + /// Background color of the output image. If `nil`, it will stay transparent. + public let backgroundColor: Color? + /// Initialize a `RoundCornerImageProcessor` /// - /// - parameter cornerRadius: Corner radius will be applied in processing. - /// - parameter targetSize: Target size of output image should be. If `nil`, - /// the image will keep its original size after processing. - /// Default is `nil`. - public init(cornerRadius: CGFloat, targetSize: CGSize? = nil) { + /// - parameter cornerRadius: Corner radius will be applied in processing. + /// - parameter targetSize: Target size of output image should be. If `nil`, + /// the image will keep its original size after processing. + /// Default is `nil`. + /// - parameter corners: The target corners which will be applied rounding. Default is `.all`. + /// - parameter backgroundColor: Background color to apply for the output image. Default is `nil`. + public init(cornerRadius: CGFloat, targetSize: CGSize? = nil, roundingCorners corners: RectCorner = .all, backgroundColor: Color? = nil) { self.cornerRadius = cornerRadius self.targetSize = targetSize - if let size = targetSize { - self.identifier = "com.onevcat.Kingfisher.RoundCornerImageProcessor(\(cornerRadius)_\(size))" - } else { - self.identifier = "com.onevcat.Kingfisher.RoundCornerImageProcessor(\(cornerRadius))" - } + self.roundingCorners = corners + self.backgroundColor = backgroundColor + + self.identifier = { + var identifier = "" + + if let size = targetSize { + identifier = "com.onevcat.Kingfisher.RoundCornerImageProcessor(\(cornerRadius)_\(size)\(corners.cornerIdentifier))" + } else { + identifier = "com.onevcat.Kingfisher.RoundCornerImageProcessor(\(cornerRadius)\(corners.cornerIdentifier))" + } + if let backgroundColor = backgroundColor { + identifier += "_\(backgroundColor)" + } + + return identifier + }() } /// Process an input `ImageProcessItem` item to an image for this processor. @@ -175,7 +338,8 @@ public struct RoundCornerImageProcessor: ImageProcessor { switch item { case .image(let image): let size = targetSize ?? image.kf.size - return image.kf.image(withRoundRadius: cornerRadius, fit: size) + return image.kf.scaled(to: options.scaleFactor) + .kf.image(withRoundRadius: cornerRadius, fit: size, roundingCorners: roundingCorners, backgroundColor: backgroundColor) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } @@ -249,7 +413,8 @@ public struct ResizingImageProcessor: ImageProcessor { public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): - return image.kf.resize(to: referenceSize, for: targetContentMode) + return image.kf.scaled(to: options.scaleFactor) + .kf.resize(to: referenceSize, for: targetContentMode) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } @@ -287,7 +452,8 @@ public struct BlurImageProcessor: ImageProcessor { switch item { case .image(let image): let radius = blurRadius * options.scaleFactor - return image.kf.blurred(withRadius: radius) + return image.kf.scaled(to: options.scaleFactor) + .kf.blurred(withRadius: radius) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } @@ -329,7 +495,8 @@ public struct OverlayImageProcessor: ImageProcessor { public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): - return image.kf.overlaying(with: overlay, fraction: fraction) + return image.kf.scaled(to: options.scaleFactor) + .kf.overlaying(with: overlay, fraction: fraction) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } @@ -365,7 +532,8 @@ public struct TintImageProcessor: ImageProcessor { public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): - return image.kf.tinted(with: tint) + return image.kf.scaled(to: options.scaleFactor) + .kf.tinted(with: tint) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } @@ -417,7 +585,8 @@ public struct ColorControlsProcessor: ImageProcessor { public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): - return image.kf.adjusted(brightness: brightness, contrast: contrast, saturation: saturation, inputEV: inputEV) + return image.kf.scaled(to: options.scaleFactor) + .kf.adjusted(brightness: brightness, contrast: contrast, saturation: saturation, inputEV: inputEV) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } @@ -477,7 +646,7 @@ public struct CroppingImageProcessor: ImageProcessor { /// It indicates a related point in current image, eg: (0.0, 0.0) for top-left /// corner, (0.5, 0.5) for center and (1.0, 1.0) for bottom-right corner. /// The `size` property of `CroppingImageProcessor` will be used along with - /// `anchor` to calculate a target rectange in the size of image. + /// `anchor` to calculate a target rectangle in the size of image. /// /// The target size will be automatically calculated with a reasonable behavior. /// For example, when you have an image size of `CGSize(width: 100, height: 100)`, @@ -502,7 +671,8 @@ public struct CroppingImageProcessor: ImageProcessor { public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): - return image.kf.crop(to: size, anchorOn: anchor) + return image.kf.scaled(to: options.scaleFactor) + .kf.crop(to: size, anchorOn: anchor) case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options) } } @@ -518,15 +688,19 @@ public func >>(left: ImageProcessor, right: ImageProcessor) -> ImageProcessor { return left.append(another: right) } -fileprivate extension Color { +extension Color { var hex: String { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 - + + #if os(macOS) + (usingColorSpace(.sRGB) ?? self).getRed(&r, green: &g, blue: &b, alpha: &a) + #else getRed(&r, green: &g, blue: &b, alpha: &a) - + #endif + let rInt = Int(r * 255) << 24 let gInt = Int(g * 255) << 16 let bInt = Int(b * 255) << 8 @@ -537,25 +711,3 @@ fileprivate extension Color { return String(format:"#%08x", rgba) } } - -// MARK: - Deprecated -extension ResizingImageProcessor { - /// Reference size of output image should follow. - @available(*, deprecated, - message: "targetSize are renamed. Use `referenceSize` instead", - renamed: "referenceSize") - public var targetSize: CGSize { - return referenceSize - } - - /// Initialize a `ResizingImageProcessor` - /// - /// - parameter targetSize: Reference size of output image should follow. - /// - parameter contentMode: Target content mode of output image should be. - @available(*, deprecated, - message: "targetSize and contentMode are renamed. Use `init(referenceSize:mode:)` instead", - renamed: "init(referenceSize:mode:)") - public init(targetSize: CGSize, contentMode: ContentMode = .none) { - self.init(referenceSize: targetSize, mode: contentMode) - } -} diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageTransition.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageTransition.swift index 8ce42e8..3bc13b8 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageTransition.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageTransition.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/9/18. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -56,10 +56,10 @@ to enable the animation transition. Apple's UIViewAnimationOptions is used under the hood. For custom transition, you should specified your own transition options, animations and -comletion handler as well. +completion handler as well. */ public enum ImageTransition { - /// No animation transistion. + /// No animation transition. case none /// Fade in the loaded image. @@ -79,7 +79,7 @@ public enum ImageTransition { /// Custom transition. case custom(duration: TimeInterval, - options: UIViewAnimationOptions, + options: UIView.AnimationOptions, animations: ((UIImageView, UIImage) -> Void)?, completion: ((Bool) -> Void)?) @@ -97,7 +97,7 @@ public enum ImageTransition { } } - var animationOptions: UIViewAnimationOptions { + var animationOptions: UIView.AnimationOptions { switch self { case .none: return [] case .fade(_): return .transitionCrossDissolve diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift index ac92a4f..cb230fb 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -33,7 +33,7 @@ import UIKit // MARK: - Extension methods. /** - * Set image to use from web. + * Set image to use from web. */ extension Kingfisher where Base: ImageView { /** @@ -49,25 +49,29 @@ extension Kingfisher where Base: ImageView { - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread. The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method. + + If `resource` is `nil`, the `placeholder` image will be set and + `completionHandler` will be called with both `error` and `image` being `nil`. */ @discardableResult public func setImage(with resource: Resource?, - placeholder: Image? = nil, + placeholder: Placeholder? = nil, options: KingfisherOptionsInfo? = nil, progressBlock: DownloadProgressBlock? = nil, completionHandler: CompletionHandler? = nil) -> RetrieveImageTask { guard let resource = resource else { - base.image = placeholder + self.placeholder = placeholder setWebURL(nil) completionHandler?(nil, nil, .none, nil) return .empty } - var options = options ?? KingfisherEmptyOptionsInfo + var options = KingfisherManager.shared.defaultOptions + (options ?? KingfisherEmptyOptionsInfo) + let noImageOrPlaceholderSet = base.image == nil && self.placeholder == nil - if !options.keepCurrentImageWhileLoading { - base.image = placeholder + if !options.keepCurrentImageWhileLoading || noImageOrPlaceholderSet { // Always set placeholder while there is no image/placehoer yet. + self.placeholder = placeholder } let maybeIndicator = indicator @@ -75,8 +79,8 @@ extension Kingfisher where Base: ImageView { setWebURL(resource.downloadURL) - if base.shouldPreloadAllGIF() { - options.append(.preloadAllGIFData) + if base.shouldPreloadAllAnimation() { + options.append(.preloadAllAnimationData) } let task = KingfisherManager.shared.retrieveImage( @@ -92,20 +96,22 @@ extension Kingfisher where Base: ImageView { }, completionHandler: {[weak base] image, error, cacheType, imageURL in DispatchQueue.main.safeAsync { + maybeIndicator?.stopAnimatingView() guard let strongBase = base, imageURL == self.webURL else { + completionHandler?(image, error, cacheType, imageURL) return } + self.setImageTask(nil) guard let image = image else { - maybeIndicator?.stopAnimatingView() completionHandler?(nil, error, cacheType, imageURL) return } - guard let transitionItem = options.firstMatchIgnoringAssociatedValue(.transition(.none)), + guard let transitionItem = options.lastMatchIgnoringAssociatedValue(.transition(.none)), case .transition(let transition) = transitionItem, ( options.forceTransition || cacheType == .none) else { - maybeIndicator?.stopAnimatingView() + self.placeholder = nil strongBase.image = image completionHandler?(image, error, cacheType, imageURL) return @@ -115,6 +121,8 @@ extension Kingfisher where Base: ImageView { UIView.transition(with: strongBase, duration: 0.0, options: [], animations: { maybeIndicator?.stopAnimatingView() }, completion: { _ in + + self.placeholder = nil UIView.transition(with: strongBase, duration: transition.duration, options: [transition.animationOptions, .allowUserInteraction], animations: { @@ -148,6 +156,7 @@ extension Kingfisher where Base: ImageView { private var lastURLKey: Void? private var indicatorKey: Void? private var indicatorTypeKey: Void? +private var placeholderKey: Void? private var imageTaskKey: Void? extension Kingfisher where Base: ImageView { @@ -164,7 +173,7 @@ extension Kingfisher where Base: ImageView { /// Default is .none, means no indicator will be shown. public var indicatorType: IndicatorType { get { - let indicator = (objc_getAssociatedObject(base, &indicatorTypeKey) as? Box)?.value + let indicator = objc_getAssociatedObject(base, &indicatorTypeKey) as? IndicatorType return indicator ?? .none } @@ -180,7 +189,7 @@ extension Kingfisher where Base: ImageView { indicator = anIndicator } - objc_setAssociatedObject(base, &indicatorTypeKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + objc_setAssociatedObject(base, &indicatorTypeKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } @@ -189,7 +198,10 @@ extension Kingfisher where Base: ImageView { /// It will be `nil` if `indicatorType` is `.none`. public fileprivate(set) var indicator: Indicator? { get { - return (objc_getAssociatedObject(base, &indicatorKey) as? Box)?.value + guard let box = objc_getAssociatedObject(base, &indicatorKey) as? Box else { + return nil + } + return box.value } set { @@ -200,14 +212,19 @@ extension Kingfisher where Base: ImageView { // Add new if var newIndicator = newValue { - newIndicator.view.frame = base.frame + // Set default indicator frame if the view's frame not set. + if newIndicator.view.frame == .zero { + newIndicator.view.frame = base.frame + } newIndicator.viewCenter = CGPoint(x: base.bounds.midX, y: base.bounds.midY) newIndicator.view.isHidden = true base.addSubview(newIndicator.view) } // Save in associated object - objc_setAssociatedObject(base, &indicatorKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + // Wrap newValue with Box to workaround an issue that Swift does not recognize + // and casting protocol for associate object correctly. https://github.com/onevcat/Kingfisher/issues/872 + objc_setAssociatedObject(base, &indicatorKey, newValue.map(Box.init), .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } @@ -218,75 +235,29 @@ extension Kingfisher where Base: ImageView { fileprivate func setImageTask(_ task: RetrieveImageTask?) { objc_setAssociatedObject(base, &imageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } -} - - -// MARK: - Deprecated. Only for back compatibility. -/** -* Set image to use from web. Deprecated. Use `kf` namespacing instead. -*/ -extension ImageView { - /** - Set an image with a resource, a placeholder image, options, progress handler and completion handler. - - - parameter resource: Resource object contains information such as `cacheKey` and `downloadURL`. - - parameter placeholder: A placeholder image when retrieving the image at URL. - - parameter options: A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more. - - parameter progressBlock: Called when the image downloading progress gets updated. - - parameter completionHandler: Called when the image retrieved and set. - - - returns: A task represents the retrieving process. - - - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread. - The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method. - */ - @available(*, deprecated, message: "Extensions directly on image views are deprecated. Use `imageView.kf.setImage` instead.", renamed: "kf.setImage") - @discardableResult - public func kf_setImage(with resource: Resource?, - placeholder: Image? = nil, - options: KingfisherOptionsInfo? = nil, - progressBlock: DownloadProgressBlock? = nil, - completionHandler: CompletionHandler? = nil) -> RetrieveImageTask - { - return kf.setImage(with: resource, placeholder: placeholder, options: options, progressBlock: progressBlock, completionHandler: completionHandler) - } - - /** - Cancel the image download task bounded to the image view if it is running. - Nothing will happen if the downloading has already finished. - */ - @available(*, deprecated, message: "Extensions directly on image views are deprecated. Use `imageView.kf.cancelDownloadTask` instead.", renamed: "kf.cancelDownloadTask") - public func kf_cancelDownloadTask() { kf.cancelDownloadTask() } - - /// Get the image URL binded to this image view. - @available(*, deprecated, message: "Extensions directly on image views are deprecated. Use `imageView.kf.webURL` instead.", renamed: "kf.webURL") - public var kf_webURL: URL? { return kf.webURL } - - /// Holds which indicator type is going to be used. - /// Default is .none, means no indicator will be shown. - @available(*, deprecated, message: "Extensions directly on image views are deprecated. Use `imageView.kf.indicatorType` instead.", renamed: "kf.indicatorType") - public var kf_indicatorType: IndicatorType { - get { return kf.indicatorType } - set { kf.indicatorType = newValue } - } - @available(*, deprecated, message: "Extensions directly on image views are deprecated. Use `imageView.kf.indicator` instead.", renamed: "kf.indicator") - /// Holds any type that conforms to the protocol `Indicator`. - /// The protocol `Indicator` has a `view` property that will be shown when loading an image. - /// It will be `nil` if `kf_indicatorType` is `.none`. - public private(set) var kf_indicator: Indicator? { - get { return kf.indicator } - set { kf.indicator = newValue } + public fileprivate(set) var placeholder: Placeholder? { + get { + return objc_getAssociatedObject(base, &placeholderKey) as? Placeholder + } + + set { + if let previousPlaceholder = placeholder { + previousPlaceholder.remove(from: base) + } + + if let newPlaceholder = newValue { + newPlaceholder.add(to: base) + } else { + base.image = nil + } + + objc_setAssociatedObject(base, &placeholderKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } } - - @available(*, deprecated, message: "Extensions directly on image views are deprecated.", renamed: "kf.imageTask") - fileprivate var kf_imageTask: RetrieveImageTask? { return kf.imageTask } - @available(*, deprecated, message: "Extensions directly on image views are deprecated.", renamed: "kf.setImageTask") - fileprivate func kf_setImageTask(_ task: RetrieveImageTask?) { kf.setImageTask(task) } - @available(*, deprecated, message: "Extensions directly on image views are deprecated.", renamed: "kf.setWebURL") - fileprivate func kf_setWebURL(_ url: URL) { kf.setWebURL(url) } } -extension ImageView { - func shouldPreloadAllGIF() -> Bool { return true } + +@objc extension ImageView { + func shouldPreloadAllAnimation() -> Bool { return true } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Indicator.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Indicator.swift index d1f55f0..f8fcf09 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Indicator.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Indicator.swift @@ -4,7 +4,7 @@ // // Created by João D. Moreira on 30/08/16. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -86,48 +86,60 @@ extension Indicator { // MARK: - ActivityIndicator // Displays a NSProgressIndicator / UIActivityIndicatorView -struct ActivityIndicator: Indicator { +final class ActivityIndicator: Indicator { #if os(macOS) private let activityIndicatorView: NSProgressIndicator #else private let activityIndicatorView: UIActivityIndicatorView #endif + private var animatingCount = 0 var view: IndicatorView { return activityIndicatorView } func startAnimatingView() { - #if os(macOS) - activityIndicatorView.startAnimation(nil) - #else - activityIndicatorView.startAnimating() - #endif - activityIndicatorView.isHidden = false + animatingCount += 1 + // Already animating + if animatingCount == 1 { + #if os(macOS) + activityIndicatorView.startAnimation(nil) + #else + activityIndicatorView.startAnimating() + #endif + activityIndicatorView.isHidden = false + } } func stopAnimatingView() { - #if os(macOS) - activityIndicatorView.stopAnimation(nil) - #else - activityIndicatorView.stopAnimating() - #endif - activityIndicatorView.isHidden = true + animatingCount = max(animatingCount - 1, 0) + if animatingCount == 0 { + #if os(macOS) + activityIndicatorView.stopAnimation(nil) + #else + activityIndicatorView.stopAnimating() + #endif + activityIndicatorView.isHidden = true + } } init() { #if os(macOS) activityIndicatorView = NSProgressIndicator(frame: CGRect(x: 0, y: 0, width: 16, height: 16)) activityIndicatorView.controlSize = .small - activityIndicatorView.style = .spinningStyle + activityIndicatorView.style = .spinning #else #if os(tvOS) - let indicatorStyle = UIActivityIndicatorViewStyle.white + let indicatorStyle = UIActivityIndicatorView.Style.white #else - let indicatorStyle = UIActivityIndicatorViewStyle.gray + let indicatorStyle = UIActivityIndicatorView.Style.gray #endif - activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle:indicatorStyle) + #if swift(>=4.2) + activityIndicatorView = UIActivityIndicatorView(style: indicatorStyle) + #else + activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: indicatorStyle) + #endif activityIndicatorView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleBottomMargin, .flexibleTopMargin] #endif } @@ -135,7 +147,7 @@ struct ActivityIndicator: Indicator { // MARK: - ImageIndicator // Displays an ImageView. Supports gif -struct ImageIndicator: Indicator { +final class ImageIndicator: Indicator { private let animatedImageIndicatorView: ImageView var view: IndicatorView { @@ -145,9 +157,9 @@ struct ImageIndicator: Indicator { init?(imageData data: Data, processor: ImageProcessor = DefaultImageProcessor.default, options: KingfisherOptionsInfo = KingfisherEmptyOptionsInfo) { var options = options - // Use normal image view to show gif, so we need to preload all gif data. - if !options.preloadAllGIFData { - options.append(.preloadAllGIFData) + // Use normal image view to show animations, so we need to preload all animation data. + if !options.preloadAllAnimationData { + options.append(.preloadAllAnimationData) } guard let image = processor.process(item: .data(data), options: options) else { @@ -156,6 +168,7 @@ struct ImageIndicator: Indicator { animatedImageIndicatorView = ImageView() animatedImageIndicatorView.image = image + animatedImageIndicatorView.frame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) #if os(macOS) // Need for gif to animate on macOS @@ -163,7 +176,6 @@ struct ImageIndicator: Indicator { self.animatedImageIndicatorView.canDrawSubviewsIntoLayer = true #else animatedImageIndicatorView.contentMode = .center - animatedImageIndicatorView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleBottomMargin, diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.h b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.h index aed591d..0e11d43 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.h +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.h @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // 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/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.swift index 6e2d409..7958060 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 16/9/14. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -30,16 +30,20 @@ import ImageIO #if os(macOS) import AppKit public typealias Image = NSImage + public typealias View = NSView public typealias Color = NSColor public typealias ImageView = NSImageView - typealias Button = NSButton + public typealias Button = NSButton #else import UIKit public typealias Image = UIImage public typealias Color = UIColor #if !os(watchOS) public typealias ImageView = UIImageView - typealias Button = UIButton + public typealias View = UIView + public typealias Button = UIButton + #else + import WatchKit #endif #endif @@ -60,7 +64,7 @@ public protocol KingfisherCompatible { public extension KingfisherCompatible { public var kf: Kingfisher { - get { return Kingfisher(self) } + return Kingfisher(self) } } @@ -68,4 +72,6 @@ extension Image: KingfisherCompatible { } #if !os(watchOS) extension ImageView: KingfisherCompatible { } extension Button: KingfisherCompatible { } +#else +extension WKInterfaceImage: KingfisherCompatible { } #endif diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherManager.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherManager.swift index eb29f3d..cb2a14e 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherManager.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherManager.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -30,12 +30,12 @@ import AppKit import UIKit #endif -public typealias DownloadProgressBlock = ((_ receivedSize: Int64, _ totalSize: Int64) -> ()) -public typealias CompletionHandler = ((_ image: Image?, _ error: NSError?, _ cacheType: CacheType, _ imageURL: URL?) -> ()) +public typealias DownloadProgressBlock = ((_ receivedSize: Int64, _ totalSize: Int64) -> Void) +public typealias CompletionHandler = ((_ image: Image?, _ error: NSError?, _ cacheType: CacheType, _ imageURL: URL?) -> Void) /// RetrieveImageTask represents a task of image retrieving process. /// It contains an async task of getting image from disk and from network. -public class RetrieveImageTask { +public final class RetrieveImageTask { public static let empty = RetrieveImageTask() @@ -43,11 +43,6 @@ public class RetrieveImageTask { // the download task should not begin. var cancelledBeforeDownloadStarting: Bool = false - /// The disk retrieve task in this image task. Kingfisher will try to look up in cache first. This task represent the cache search task. - @available(*, deprecated, - message: "diskRetrieveTask is not in use anymore. You cannot cancel a disk retrieve task anymore once it started.") - public var diskRetrieveTask: RetrieveImageDiskTask? - /// The network retrieve task in this image task. public var downloadTask: RetrieveImageDownloadTask? @@ -79,6 +74,21 @@ public class KingfisherManager { /// Downloader used by this manager public var downloader: ImageDownloader + /// Default options used by the manager. This option will be used in + /// Kingfisher manager related methods, including all image view and + /// button extension methods. You can also passing the options per image by + /// sending an `options` parameter to Kingfisher's APIs, the per image option + /// will overwrite the default ones if exist. + /// + /// - Note: This option will not be applied to independent using of `ImageDownloader` or `ImageCache`. + public var defaultOptions = KingfisherEmptyOptionsInfo + + var currentDefaultOptions: KingfisherOptionsInfo { + return [.downloader(downloader), .targetCache(cache)] + defaultOptions + } + + fileprivate let processQueue: DispatchQueue + convenience init() { self.init(downloader: .default, cache: .default) } @@ -86,6 +96,9 @@ public class KingfisherManager { init(downloader: ImageDownloader, cache: ImageCache) { self.downloader = downloader self.cache = cache + + let processQueueName = "com.onevcat.Kingfisher.KingfisherManager.processQueue.\(UUID().uuidString)" + processQueue = DispatchQueue(label: processQueueName, attributes: .concurrent) } /** @@ -108,8 +121,8 @@ public class KingfisherManager { completionHandler: CompletionHandler?) -> RetrieveImageTask { let task = RetrieveImageTask() - - if let options = options, options.forceRefresh { + let options = currentDefaultOptions + (options ?? KingfisherEmptyOptionsInfo) + if options.forceRefresh { _ = downloadAndCacheImage( with: resource.downloadURL, forKey: resource.cacheKey, @@ -136,21 +149,21 @@ public class KingfisherManager { retrieveImageTask: RetrieveImageTask, progressBlock: DownloadProgressBlock?, completionHandler: CompletionHandler?, - options: KingfisherOptionsInfo?) -> RetrieveImageDownloadTask? + options: KingfisherOptionsInfo) -> RetrieveImageDownloadTask? { - let options = options ?? KingfisherEmptyOptionsInfo - let downloader = options.downloader + let downloader = options.downloader ?? self.downloader + let processQueue = self.processQueue return downloader.downloadImage(with: url, retrieveImageTask: retrieveImageTask, options: options, progressBlock: { receivedSize, totalSize in progressBlock?(receivedSize, totalSize) }, completionHandler: { image, error, imageURL, originalData in - let targetCache = options.targetCache + let targetCache = options.targetCache ?? self.cache if let error = error, error.code == KingfisherError.notModified.rawValue { // Not modified. Try to find the image from cache. // (The image should be in cache. It should be guaranteed by the framework users.) - targetCache.retrieveImage(forKey: key, options: options, completionHandler: { (cacheImage, cacheType) -> () in + targetCache.retrieveImage(forKey: key, options: options, completionHandler: { (cacheImage, cacheType) -> Void in completionHandler?(cacheImage, nil, cacheType, url) }) return @@ -163,11 +176,33 @@ public class KingfisherManager { processorIdentifier:options.processor.identifier, cacheSerializer: options.cacheSerializer, toDisk: !options.cacheMemoryOnly, - completionHandler: nil) + completionHandler: { + guard options.waitForCache else { return } + + let cacheType = targetCache.imageCachedType(forKey: key, processorIdentifier: options.processor.identifier) + completionHandler?(image, nil, cacheType, url) + }) + + if options.cacheOriginalImage && options.processor != DefaultImageProcessor.default { + let originalCache = options.originalCache ?? targetCache + let defaultProcessor = DefaultImageProcessor.default + processQueue.async { + if let originalImage = defaultProcessor.process(item: .data(originalData), options: options) { + originalCache.store(originalImage, + original: originalData, + forKey: key, + processorIdentifier: defaultProcessor.identifier, + cacheSerializer: options.cacheSerializer, + toDisk: !options.cacheMemoryOnly, + completionHandler: nil) + } + } + } } - completionHandler?(image, error, .none, url) - + if options.waitForCache == false || image == nil { + completionHandler?(image, error, .none, url) + } }) } @@ -176,30 +211,87 @@ public class KingfisherManager { retrieveImageTask: RetrieveImageTask, progressBlock: DownloadProgressBlock?, completionHandler: CompletionHandler?, - options: KingfisherOptionsInfo?) + options: KingfisherOptionsInfo) { - let diskTaskCompletionHandler: CompletionHandler = { (image, error, cacheType, imageURL) -> () in + + let diskTaskCompletionHandler: CompletionHandler = { (image, error, cacheType, imageURL) -> Void in completionHandler?(image, error, cacheType, imageURL) } - let targetCache = options?.targetCache ?? cache - targetCache.retrieveImage(forKey: key, options: options, - completionHandler: { image, cacheType in - if image != nil { - diskTaskCompletionHandler(image, nil, cacheType, url) - } else if let options = options, options.onlyFromCache { - let error = NSError(domain: KingfisherErrorDomain, code: KingfisherError.notCached.rawValue, userInfo: nil) - diskTaskCompletionHandler(nil, error, .none, url) - } else { - self.downloadAndCacheImage( - with: url, - forKey: key, - retrieveImageTask: retrieveImageTask, - progressBlock: progressBlock, - completionHandler: diskTaskCompletionHandler, - options: options) + func handleNoCache() { + if options.onlyFromCache { + let error = NSError(domain: KingfisherErrorDomain, code: KingfisherError.notCached.rawValue, userInfo: nil) + diskTaskCompletionHandler(nil, error, .none, url) + return + } + self.downloadAndCacheImage( + with: url, + forKey: key, + retrieveImageTask: retrieveImageTask, + progressBlock: progressBlock, + completionHandler: diskTaskCompletionHandler, + options: options) + + } + + let targetCache = options.targetCache ?? self.cache + let processQueue = self.processQueue + // First, try to get the exactly image from cache + targetCache.retrieveImage(forKey: key, options: options) { image, cacheType in + // If found, we could finish now. + if image != nil { + diskTaskCompletionHandler(image, nil, cacheType, url) + return + } + + // If not found, and we are using a default processor, download it! + let processor = options.processor + guard processor != DefaultImageProcessor.default else { + handleNoCache() + return + } + + // If processor is not the default one, we have a chance to check whether + // the original image is already in cache. + let originalCache = options.originalCache ?? targetCache + let optionsWithoutProcessor = options.removeAllMatchesIgnoringAssociatedValue(.processor(processor)) + originalCache.retrieveImage(forKey: key, options: optionsWithoutProcessor) { image, cacheType in + // If we found the original image, there is no need to download it again. + // We could just apply processor to it now. + guard let image = image else { + handleNoCache() + return + } + + processQueue.async { + guard let processedImage = processor.process(item: .image(image), options: options) else { + options.callbackDispatchQueue.safeAsync { + diskTaskCompletionHandler(nil, nil, .none, url) + } + return + } + targetCache.store(processedImage, + original: nil, + forKey: key, + processorIdentifier:options.processor.identifier, + cacheSerializer: options.cacheSerializer, + toDisk: !options.cacheMemoryOnly, + completionHandler: { + guard options.waitForCache else { return } + + let cacheType = targetCache.imageCachedType(forKey: key, processorIdentifier: options.processor.identifier) + options.callbackDispatchQueue.safeAsync { + diskTaskCompletionHandler(processedImage, nil, cacheType, url) + } + }) + + if options.waitForCache == false { + options.callbackDispatchQueue.safeAsync { + diskTaskCompletionHandler(processedImage, nil, .none, url) + } + } } } - ) + } } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift index 948906e..68833a1 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/23. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -46,6 +46,11 @@ public enum KingfisherOptionsInfoItem { /// the downloaded image to it. case targetCache(ImageCache) + /// Cache for storing and retrieving original image. + /// Preferred prior to targetCache for storing and retrieving original images if specified. + /// Only used if a non-default image processor is involved. + case originalCache(ImageCache) + /// The associated value of this member should be an ImageDownloader object. Kingfisher will use this /// downloader to download the images. case downloader(ImageDownloader) @@ -62,6 +67,11 @@ public enum KingfisherOptionsInfoItem { /// If set, `Kingfisher` will ignore the cache and try to fire a download task for the resource. case forceRefresh + + /// If set, `Kingfisher` will try to retrieve the image from memory cache first. If the image is not in memory + /// cache, then it will ignore the disk cache but download the image again from network. This is useful when + /// you want to display a changeable image behind the same url, while avoiding download it again and again. + case fromMemoryCacheOrRefresh /// If set, setting the image to an image view will happen with transition even when retrieved from cache. /// See `Transition` option for more. @@ -70,6 +80,9 @@ public enum KingfisherOptionsInfoItem { /// If set, `Kingfisher` will only cache the value in memory but not in disk. case cacheMemoryOnly + /// If set, `Kingfisher` will wait for caching operation to be completed before calling the completion block. + case waitForCache + /// If set, `Kingfisher` will only try to retrieve the image from cache not from network. case onlyFromCache @@ -77,20 +90,20 @@ public enum KingfisherOptionsInfoItem { case backgroundDecode /// The associated value of this member will be used as the target queue of dispatch callbacks when - /// retrieving images from cache. If not set, `Kingfisher` will use main quese for callbacks. + /// retrieving images from cache. If not set, `Kingfisher` will use main queue for callbacks. case callbackDispatchQueue(DispatchQueue?) /// The associated value of this member will be used as the scale factor when converting retrieved data to an image. /// It is the image scale, instead of your screen scale. You may need to specify the correct scale when you dealing /// with 2x or 3x retina images. case scaleFactor(CGFloat) - - /// Whether all the GIF data should be preloaded. Default it false, which means following frames will be - /// loaded on need. If true, all the GIF data will be loaded and decoded into memory. This option is mainly + + /// Whether all the animated image data should be preloaded. Default it false, which means following frames will be + /// loaded on need. If true, all the animated image data will be loaded and decoded into memory. This option is mainly /// used for back compatibility internally. You should not set it directly. `AnimatedImageView` will not preload /// all data, while a normal image view (`UIImageView` or `NSImageView`) will load all data. Choose to use /// corresponding image view type instead of setting this option. - case preloadAllGIFData + case preloadAllAnimationData /// The `ImageDownloadRequestModifier` contained will be used to change the request before it being sent. /// This is the last chance you can modify the request. You can modify the request for some customizing purpose, @@ -99,7 +112,7 @@ public enum KingfisherOptionsInfoItem { case requestModifier(ImageDownloadRequestModifier) /// Processor for processing when the downloading finishes, a processor will convert the downloaded data to an image - /// and/or apply some filter on it. If a cache is connected to the downloader (it happenes when you are using + /// and/or apply some filter on it. If a cache is connected to the downloader (it happens when you are using /// KingfisherManager or the image extension methods), the converted image will also be sent to cache as well as the /// image view. `DefaultImageProcessor.default` will be used by default. case processor(ImageProcessor) @@ -108,17 +121,32 @@ public enum KingfisherOptionsInfoItem { /// retrieving from disk cache or vice versa for storing to disk cache. /// `DefaultCacheSerializer.default` will be used by default. case cacheSerializer(CacheSerializer) + + /// Modifier for modifying an image right before it is used. + /// If the image was fetched directly from the downloader, the modifier will + /// run directly after the processor. + /// If the image is being fetched from a cache, the modifier will run after + /// the cacheSerializer. + /// Use `ImageModifier` when you need to set properties on a concrete type + /// of `Image`, such as a `UIImage`, that do not persist when caching the image. + case imageModifier(ImageModifier) /// Keep the existing image while setting another image to an image view. /// By setting this option, the placeholder image parameter of imageview extension method /// will be ignored and the current image will be kept while loading or downloading the new image. case keepCurrentImageWhileLoading - /// If set, Kingfisher will only load the first frame from a GIF file as a single image. - /// Loading a lot of GIFs may take too much memory. It will be useful when you want to display a - /// static preview of the first frame from a GIF image. - /// This option will be ignored if the target image is not GIF. + /// If set, Kingfisher will only load the first frame from a animated image data file as a single image. + /// Loading a lot of animated images may take too much memory. It will be useful when you want to display a + /// static preview of the first frame from a animated image. + /// This option will be ignored if the target image is not animated image data. case onlyLoadFirstFrame + + /// If set and an `ImageProcessor` is used, Kingfisher will try to cache both + /// the final result and original image. Kingfisher will have a chance to use + /// the original image when another processor is applied to the same resource, + /// instead of downloading it again. + case cacheOriginalImage } precedencegroup ItemComparisonPrecedence { @@ -132,60 +160,76 @@ infix operator <== : ItemComparisonPrecedence func <== (lhs: KingfisherOptionsInfoItem, rhs: KingfisherOptionsInfoItem) -> Bool { switch (lhs, rhs) { case (.targetCache(_), .targetCache(_)): return true + case (.originalCache(_), .originalCache(_)): return true case (.downloader(_), .downloader(_)): return true case (.transition(_), .transition(_)): return true case (.downloadPriority(_), .downloadPriority(_)): return true case (.forceRefresh, .forceRefresh): return true + case (.fromMemoryCacheOrRefresh, .fromMemoryCacheOrRefresh): return true case (.forceTransition, .forceTransition): return true case (.cacheMemoryOnly, .cacheMemoryOnly): return true + case (.waitForCache, .waitForCache): return true case (.onlyFromCache, .onlyFromCache): return true case (.backgroundDecode, .backgroundDecode): return true case (.callbackDispatchQueue(_), .callbackDispatchQueue(_)): return true case (.scaleFactor(_), .scaleFactor(_)): return true - case (.preloadAllGIFData, .preloadAllGIFData): return true + case (.preloadAllAnimationData, .preloadAllAnimationData): return true case (.requestModifier(_), .requestModifier(_)): return true case (.processor(_), .processor(_)): return true case (.cacheSerializer(_), .cacheSerializer(_)): return true + case (.imageModifier(_), .imageModifier(_)): return true case (.keepCurrentImageWhileLoading, .keepCurrentImageWhileLoading): return true case (.onlyLoadFirstFrame, .onlyLoadFirstFrame): return true + case (.cacheOriginalImage, .cacheOriginalImage): return true default: return false } } + extension Collection where Iterator.Element == KingfisherOptionsInfoItem { - func firstMatchIgnoringAssociatedValue(_ target: Iterator.Element) -> Iterator.Element? { - return index { $0 <== target }.flatMap { self[$0] } + func lastMatchIgnoringAssociatedValue(_ target: Iterator.Element) -> Iterator.Element? { + return reversed().first { $0 <== target } } func removeAllMatchesIgnoringAssociatedValue(_ target: Iterator.Element) -> [Iterator.Element] { - return self.filter { !($0 <== target) } + return filter { !($0 <== target) } } } public extension Collection where Iterator.Element == KingfisherOptionsInfoItem { /// The target `ImageCache` which is used. - public var targetCache: ImageCache { - if let item = firstMatchIgnoringAssociatedValue(.targetCache(.default)), + public var targetCache: ImageCache? { + if let item = lastMatchIgnoringAssociatedValue(.targetCache(.default)), case .targetCache(let cache) = item { return cache } - return ImageCache.default + return nil + } + + /// The original `ImageCache` which is used. + public var originalCache: ImageCache? { + if let item = lastMatchIgnoringAssociatedValue(.originalCache(.default)), + case .originalCache(let cache) = item + { + return cache + } + return targetCache } /// The `ImageDownloader` which is specified. - public var downloader: ImageDownloader { - if let item = firstMatchIgnoringAssociatedValue(.downloader(.default)), + public var downloader: ImageDownloader? { + if let item = lastMatchIgnoringAssociatedValue(.downloader(.default)), case .downloader(let downloader) = item { return downloader } - return ImageDownloader.default + return nil } /// Member for animation transition when using UIImageView. public var transition: ImageTransition { - if let item = firstMatchIgnoringAssociatedValue(.transition(.none)), + if let item = lastMatchIgnoringAssociatedValue(.transition(.none)), case .transition(let transition) = item { return transition @@ -196,7 +240,7 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem /// A `Float` value set as the priority of image download task. The value for it should be /// between 0.0~1.0. public var downloadPriority: Float { - if let item = firstMatchIgnoringAssociatedValue(.downloadPriority(0)), + if let item = lastMatchIgnoringAssociatedValue(.downloadPriority(0)), case .downloadPriority(let priority) = item { return priority @@ -208,6 +252,11 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem public var forceRefresh: Bool { return contains{ $0 <== .forceRefresh } } + + /// Whether an image should be got only from memory cache or download. + public var fromMemoryCacheOrRefresh: Bool { + return contains{ $0 <== .fromMemoryCacheOrRefresh } + } /// Whether the transition should always happen or not. public var forceTransition: Bool { @@ -219,6 +268,11 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem return contains{ $0 <== .cacheMemoryOnly } } + /// Whether the caching operation will be waited or not. + public var waitForCache: Bool { + return contains{ $0 <== .waitForCache } + } + /// Whether only load the images from cache or not. public var onlyFromCache: Bool { return contains{ $0 <== .onlyFromCache } @@ -228,15 +282,15 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem public var backgroundDecode: Bool { return contains{ $0 <== .backgroundDecode } } - - /// Whether the image data should be all loaded at once if it is a GIF. - public var preloadAllGIFData: Bool { - return contains { $0 <== .preloadAllGIFData } + + /// Whether the image data should be all loaded at once if it is an animated image. + public var preloadAllAnimationData: Bool { + return contains { $0 <== .preloadAllAnimationData } } /// The queue of callbacks should happen from Kingfisher. public var callbackDispatchQueue: DispatchQueue { - if let item = firstMatchIgnoringAssociatedValue(.callbackDispatchQueue(nil)), + if let item = lastMatchIgnoringAssociatedValue(.callbackDispatchQueue(nil)), case .callbackDispatchQueue(let queue) = item { return queue ?? DispatchQueue.main @@ -246,7 +300,7 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem /// The scale factor which should be used for the image. public var scaleFactor: CGFloat { - if let item = firstMatchIgnoringAssociatedValue(.scaleFactor(0)), + if let item = lastMatchIgnoringAssociatedValue(.scaleFactor(0)), case .scaleFactor(let scale) = item { return scale @@ -256,7 +310,7 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem /// The `ImageDownloadRequestModifier` will be used before sending a download request. public var modifier: ImageDownloadRequestModifier { - if let item = firstMatchIgnoringAssociatedValue(.requestModifier(NoModifier.default)), + if let item = lastMatchIgnoringAssociatedValue(.requestModifier(NoModifier.default)), case .requestModifier(let modifier) = item { return modifier @@ -266,17 +320,27 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem /// `ImageProcessor` for processing when the downloading finishes. public var processor: ImageProcessor { - if let item = firstMatchIgnoringAssociatedValue(.processor(DefaultImageProcessor.default)), + if let item = lastMatchIgnoringAssociatedValue(.processor(DefaultImageProcessor.default)), case .processor(let processor) = item { return processor } return DefaultImageProcessor.default } + + /// `ImageModifier` for modifying right before the image is displayed. + public var imageModifier: ImageModifier { + if let item = lastMatchIgnoringAssociatedValue(.imageModifier(DefaultImageModifier.default)), + case .imageModifier(let imageModifier) = item + { + return imageModifier + } + return DefaultImageModifier.default + } /// `CacheSerializer` to convert image to data for storing in cache. public var cacheSerializer: CacheSerializer { - if let item = firstMatchIgnoringAssociatedValue(.cacheSerializer(DefaultCacheSerializer.default)), + if let item = lastMatchIgnoringAssociatedValue(.cacheSerializer(DefaultCacheSerializer.default)), case .cacheSerializer(let cacheSerializer) = item { return cacheSerializer @@ -293,4 +357,8 @@ public extension Collection where Iterator.Element == KingfisherOptionsInfoItem public var onlyLoadFirstFrame: Bool { return contains { $0 <== .onlyLoadFirstFrame } } + + public var cacheOriginalImage: Bool { + return contains { $0 <== .cacheOriginalImage } + } } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Placeholder.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Placeholder.swift new file mode 100755 index 0000000..3ebaf0b --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Placeholder.swift @@ -0,0 +1,82 @@ +// +// Placeholder.swift +// Kingfisher +// +// Created by Tieme van Veen on 28/08/2017. +// +// Copyright (c) 2018 Wei Wang +// +// 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. + +#if os(macOS) + import AppKit +#else + import UIKit +#endif + + +/// Represent a placeholder type which could be set while loading as well as +/// loading finished without getting an image. +public protocol Placeholder { + + /// How the placeholder should be added to a given image view. + func add(to imageView: ImageView) + + /// How the placeholder should be removed from a given image view. + func remove(from imageView: ImageView) +} + +/// Default implementation of an image placeholder. The image will be set or +/// reset directly for `image` property of the image view. +extension Placeholder where Self: Image { + + /// How the placeholder should be added to a given image view. + public func add(to imageView: ImageView) { imageView.image = self } + + /// How the placeholder should be removed from a given image view. + public func remove(from imageView: ImageView) { imageView.image = nil } +} + +extension Image: Placeholder {} + +/// Default implementation of an arbitrary view as placeholder. The view will be +/// added as a subview when adding and be removed from its super view when removing. +/// +/// To use your customize View type as placeholder, simply let it conforming to +/// `Placeholder` by `extension MyView: Placeholder {}`. +extension Placeholder where Self: View { + + /// How the placeholder should be added to a given image view. + public func add(to imageView: ImageView) { + imageView.addSubview(self) + + self.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: imageView, attribute: .centerX, multiplier: 1, constant: 0), + NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: imageView, attribute: .centerY, multiplier: 1, constant: 0), + NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: 1, constant: 0), + NSLayoutConstraint(item: self, attribute: .width, relatedBy: .equal, toItem: imageView, attribute: .width, multiplier: 1, constant: 0) + ]) + } + + /// How the placeholder should be removed from a given image view. + public func remove(from imageView: ImageView) { + self.removeFromSuperview() + } +} diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/RequestModifier.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/RequestModifier.swift index 13d655a..1e099bf 100644 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/RequestModifier.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/RequestModifier.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 2016/09/05. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // 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/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Resource.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Resource.swift index c95691a..c71f24d 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Resource.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Resource.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/6. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // 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/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/String+MD5.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/String+MD5.swift index 5563fa1..fa173a9 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/String+MD5.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/String+MD5.swift @@ -21,22 +21,10 @@ Permission is granted to anyone to use this software for any purpose,including c import Foundation -public struct StringProxy { - fileprivate let base: String - init(proxy: String) { - base = proxy - } -} - -extension String: KingfisherCompatible { - public typealias CompatibleType = StringProxy - public var kf: CompatibleType { - return StringProxy(proxy: self) - } -} +extension String: KingfisherCompatible { } -extension StringProxy { - var md5: String { +extension Kingfisher where Base == String { + public var md5: String { if let data = base.data(using: .utf8, allowLossyConversion: true) { let message = data.withUnsafeBytes { bytes -> [UInt8] in @@ -74,8 +62,13 @@ func arrayOfBytes(_ value: T, length: Int? = nil) -> [UInt8] { return bytes } + #if swift(>=4.1) + valuePointer.deinitialize(count: 1) + valuePointer.deallocate() + #else valuePointer.deinitialize() valuePointer.deallocate(capacity: 1) + #endif return bytes } diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ThreadHelper.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ThreadHelper.swift index f0742cd..a737b6e 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ThreadHelper.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ThreadHelper.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/10/9. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // 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/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift index 97d3aab..344c489 100755 --- a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift +++ b/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift @@ -4,7 +4,7 @@ // // Created by Wei Wang on 15/4/13. // -// Copyright (c) 2017 Wei Wang +// Copyright (c) 2018 Wei Wang // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -46,10 +46,13 @@ extension Kingfisher where Base: UIButton { - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread. The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method. + + If `resource` is `nil`, the `placeholder` image will be set and + `completionHandler` will be called with both `error` and `image` being `nil`. */ @discardableResult public func setImage(with resource: Resource?, - for state: UIControlState, + for state: UIControl.State, placeholder: UIImage? = nil, options: KingfisherOptionsInfo? = nil, progressBlock: DownloadProgressBlock? = nil, @@ -62,7 +65,7 @@ extension Kingfisher where Base: UIButton { return .empty } - let options = options ?? KingfisherEmptyOptionsInfo + let options = KingfisherManager.shared.defaultOptions + (options ?? KingfisherEmptyOptionsInfo) if !options.keepCurrentImageWhileLoading { base.setImage(placeholder, for: state) } @@ -82,10 +85,10 @@ extension Kingfisher where Base: UIButton { completionHandler: {[weak base] image, error, cacheType, imageURL in DispatchQueue.main.safeAsync { guard let strongBase = base, imageURL == self.webURL(for: state) else { + completionHandler?(image, error, cacheType, imageURL) return } self.setImageTask(nil) - if image != nil { strongBase.setImage(image, for: state) } @@ -121,10 +124,13 @@ extension Kingfisher where Base: UIButton { - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread. The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method. + + If `resource` is `nil`, the `placeholder` image will be set and + `completionHandler` will be called with both `error` and `image` being `nil`. */ @discardableResult public func setBackgroundImage(with resource: Resource?, - for state: UIControlState, + for state: UIControl.State, placeholder: UIImage? = nil, options: KingfisherOptionsInfo? = nil, progressBlock: DownloadProgressBlock? = nil, @@ -137,7 +143,7 @@ extension Kingfisher where Base: UIButton { return .empty } - let options = options ?? KingfisherEmptyOptionsInfo + let options = KingfisherManager.shared.defaultOptions + (options ?? KingfisherEmptyOptionsInfo) if !options.keepCurrentImageWhileLoading { base.setBackgroundImage(placeholder, for: state) } @@ -157,6 +163,7 @@ extension Kingfisher where Base: UIButton { completionHandler: { [weak base] image, error, cacheType, imageURL in DispatchQueue.main.safeAsync { guard let strongBase = base, imageURL == self.backgroundWebURL(for: state) else { + completionHandler?(image, error, cacheType, imageURL) return } self.setBackgroundImageTask(nil) @@ -193,11 +200,11 @@ extension Kingfisher where Base: UIButton { - returns: Current URL for image. */ - public func webURL(for state: UIControlState) -> URL? { + public func webURL(for state: UIControl.State) -> URL? { return webURLs[NSNumber(value:state.rawValue)] as? URL } - fileprivate func setWebURL(_ url: URL?, for state: UIControlState) { + fileprivate func setWebURL(_ url: URL?, for state: UIControl.State) { webURLs[NSNumber(value:state.rawValue)] = url } @@ -236,11 +243,11 @@ extension Kingfisher where Base: UIButton { - returns: Current URL for background image. */ - public func backgroundWebURL(for state: UIControlState) -> URL? { + public func backgroundWebURL(for state: UIControl.State) -> URL? { return backgroundWebURLs[NSNumber(value:state.rawValue)] as? URL } - fileprivate func setBackgroundWebURL(_ url: URL?, for state: UIControlState) { + fileprivate func setBackgroundWebURL(_ url: URL?, for state: UIControl.State) { backgroundWebURLs[NSNumber(value:state.rawValue)] = url } @@ -265,151 +272,3 @@ extension Kingfisher where Base: UIButton { objc_setAssociatedObject(base, &backgroundImageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } - -// MARK: - Deprecated. Only for back compatibility. -/** -* Set image to use from web for a specified state. Deprecated. Use `kf` namespacing instead. -*/ -extension UIButton { - /** - Set an image to use for a specified state with a resource, a placeholder image, options, progress handler and - completion handler. - - - parameter resource: Resource object contains information such as `cacheKey` and `downloadURL`. - - parameter state: The state that uses the specified image. - - parameter placeholder: A placeholder image when retrieving the image at URL. - - parameter options: A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more. - - parameter progressBlock: Called when the image downloading progress gets updated. - - parameter completionHandler: Called when the image retrieved and set. - - - returns: A task represents the retrieving process. - - - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread. - The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method. - */ - @discardableResult - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated. Use `button.kf.setImage` instead.", - renamed: "kf.setImage") - public func kf_setImage(with resource: Resource?, - for state: UIControlState, - placeholder: UIImage? = nil, - options: KingfisherOptionsInfo? = nil, - progressBlock: DownloadProgressBlock? = nil, - completionHandler: CompletionHandler? = nil) -> RetrieveImageTask - { - return kf.setImage(with: resource, for: state, placeholder: placeholder, options: options, - progressBlock: progressBlock, completionHandler: completionHandler) - } - - /** - Cancel the image download task bounded to the image view if it is running. - Nothing will happen if the downloading has already finished. - */ - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated. Use `button.kf.cancelImageDownloadTask` instead.", - renamed: "kf.cancelImageDownloadTask") - public func kf_cancelImageDownloadTask() { kf.cancelImageDownloadTask() } - - /** - Set the background image to use for a specified state with a resource, - a placeholder image, options progress handler and completion handler. - - - parameter resource: Resource object contains information such as `cacheKey` and `downloadURL`. - - parameter state: The state that uses the specified image. - - parameter placeholder: A placeholder image when retrieving the image at URL. - - parameter options: A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more. - - parameter progressBlock: Called when the image downloading progress gets updated. - - parameter completionHandler: Called when the image retrieved and set. - - - returns: A task represents the retrieving process. - - - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread. - The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method. - */ - @discardableResult - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated. Use `button.kf.setBackgroundImage` instead.", - renamed: "kf.setBackgroundImage") - public func kf_setBackgroundImage(with resource: Resource?, - for state: UIControlState, - placeholder: UIImage? = nil, - options: KingfisherOptionsInfo? = nil, - progressBlock: DownloadProgressBlock? = nil, - completionHandler: CompletionHandler? = nil) -> RetrieveImageTask - { - return kf.setBackgroundImage(with: resource, for: state, placeholder: placeholder, options: options, - progressBlock: progressBlock, completionHandler: completionHandler) - } - - /** - Cancel the background image download task bounded to the image view if it is running. - Nothing will happen if the downloading has already finished. - */ - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated. Use `button.kf.cancelBackgroundImageDownloadTask` instead.", - renamed: "kf.cancelBackgroundImageDownloadTask") - public func kf_cancelBackgroundImageDownloadTask() { kf.cancelBackgroundImageDownloadTask() } - - /** - Get the image URL binded to this button for a specified state. - - - parameter state: The state that uses the specified image. - - - returns: Current URL for image. - */ - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated. Use `button.kf.webURL` instead.", - renamed: "kf.webURL") - public func kf_webURL(for state: UIControlState) -> URL? { return kf.webURL(for: state) } - - @available(*, deprecated, message: "Extensions directly on UIButton are deprecated.",renamed: "kf.setWebURL") - fileprivate func kf_setWebURL(_ url: URL, for state: UIControlState) { kf.setWebURL(url, for: state) } - - @available(*, deprecated, message: "Extensions directly on UIButton are deprecated.",renamed: "kf.webURLs") - fileprivate var kf_webURLs: NSMutableDictionary { return kf.webURLs } - - @available(*, deprecated, message: "Extensions directly on UIButton are deprecated.",renamed: "kf.setWebURLs") - fileprivate func kf_setWebURLs(_ URLs: NSMutableDictionary) { kf.setWebURLs(URLs) } - - @available(*, deprecated, message: "Extensions directly on UIButton are deprecated.",renamed: "kf.imageTask") - fileprivate var kf_imageTask: RetrieveImageTask? { return kf.imageTask } - - @available(*, deprecated, message: "Extensions directly on UIButton are deprecated.",renamed: "kf.setImageTask") - fileprivate func kf_setImageTask(_ task: RetrieveImageTask?) { kf.setImageTask(task) } - - /** - Get the background image URL binded to this button for a specified state. - - - parameter state: The state that uses the specified background image. - - - returns: Current URL for background image. - */ - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated. Use `button.kf.backgroundWebURL` instead.", - renamed: "kf.backgroundWebURL") - public func kf_backgroundWebURL(for state: UIControlState) -> URL? { return kf.backgroundWebURL(for: state) } - - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated.",renamed: "kf.setBackgroundWebURL") - fileprivate func kf_setBackgroundWebURL(_ url: URL, for state: UIControlState) { - kf.setBackgroundWebURL(url, for: state) - } - - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated.",renamed: "kf.backgroundWebURLs") - fileprivate var kf_backgroundWebURLs: NSMutableDictionary { return kf.backgroundWebURLs } - - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated.",renamed: "kf.setBackgroundWebURLs") - fileprivate func kf_setBackgroundWebURLs(_ URLs: NSMutableDictionary) { kf.setBackgroundWebURLs(URLs) } - - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated.",renamed: "kf.backgroundImageTask") - fileprivate var kf_backgroundImageTask: RetrieveImageTask? { return kf.backgroundImageTask } - - @available(*, deprecated, - message: "Extensions directly on UIButton are deprecated.",renamed: "kf.setBackgroundImageTask") - fileprivate func kf_setBackgroundImageTask(_ task: RetrieveImageTask?) { return kf.setBackgroundImageTask(task) } - -} diff --git a/WRCycleScrollViewDemo/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json b/WRCycleScrollViewDemo/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json new file mode 100644 index 0000000..e9def69 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json @@ -0,0 +1,22 @@ +{ + "name": "WRNavigationBar_swift", + "version": "0.1.0", + "summary": "A useful custom navigation bar.", + "description": "WRNavigationBar which allows you to change NavigationBar's appearance dynamically.", + "homepage": "https://github.com/wangrui460/WRNavigationBar_swift", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "EyreFree": "eyrefree@eyrefree.org" + }, + "source": { + "git": "https://github.com/wangrui460/WRNavigationBar_swift.git", + "tag": "0.1.0" + }, + "platforms": { + "ios": "8.0" + }, + "source_files": "WRNavigationBar_swift/Classes/**/*" +} diff --git a/WRCycleScrollViewDemo/Pods/Manifest.lock b/WRCycleScrollViewDemo/Pods/Manifest.lock index f817e01..9d9feb4 100644 --- a/WRCycleScrollViewDemo/Pods/Manifest.lock +++ b/WRCycleScrollViewDemo/Pods/Manifest.lock @@ -1,12 +1,28 @@ PODS: - - Kingfisher (3.6.2) + - Kingfisher (4.10.1) + - WRNavigationBar_swift (0.1.0) DEPENDENCIES: - - Kingfisher + - Kingfisher (= 4.10.1) + - WRNavigationBar_swift (from `https://github.com/EFRenovation/WRNavigationBar_swift.git`) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Kingfisher + +EXTERNAL SOURCES: + WRNavigationBar_swift: + :git: https://github.com/EFRenovation/WRNavigationBar_swift.git + +CHECKOUT OPTIONS: + WRNavigationBar_swift: + :commit: a0527391cb2ef39b782ccb7dc392c283669f8b83 + :git: https://github.com/EFRenovation/WRNavigationBar_swift.git SPEC CHECKSUMS: - Kingfisher: 2c94e72c6830622c71d06adf4ea024c37d316830 + Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0 + WRNavigationBar_swift: b49ca280deb24616af40abae09d8ec593e75ac64 -PODFILE CHECKSUM: 6daf8f1d76fe64163802c6a83d3d697d2866e5e0 +PODFILE CHECKSUM: e877ef69660efc780bee4089dade3acd6a65a80c -COCOAPODS: 1.2.1 +COCOAPODS: 1.5.3 diff --git a/WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj b/WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj index 4ff6912..001ee2f 100644 --- a/WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj +++ b/WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,106 +7,141 @@ objects = { /* Begin PBXBuildFile section */ - 0E9CC28AC8E34FE8E1C87E933E04BC7A /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 449745419F19FD32556B5DB4C4713E19 /* ImageProcessor.swift */; }; - 179523942E7D1E3EB210EF05E2C7AE79 /* Kingfisher.h in Headers */ = {isa = PBXBuildFile; fileRef = 814A249890448FEA6045B315BCF3CBDD /* Kingfisher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2D41430007CE8464586F521838A882C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; - 2E5E570FFC49EF98550401421A243C0F /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB06CA9125048730F6F8EDD92103BD0 /* CacheSerializer.swift */; }; - 33395912F2FFA355C4C36B7EDEAA3DA7 /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EACA73146F2EFD5728BDDE27435FBD5 /* ImageView+Kingfisher.swift */; }; - 33A14E817C0FA585D5DA3A55E453299D /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC672E8EA725C5D07B841DD0564BE8A /* Image.swift */; }; - 3414E1D9CB15149A296E16C45967B021 /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = A095EF160FF9234364CDD94B8926E24A /* ImagePrefetcher.swift */; }; - 342AE33215135AD56B73580012DC22AB /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F4491E340CD8AFA20CA333A7248C0A /* AnimatedImageView.swift */; }; - 378B44CAA91C2106076668FDE72E1E02 /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7F836E9F331D1DFAA871B794EC40647 /* KingfisherOptionsInfo.swift */; }; - 4089E39F76F86466B8DDD39A1C1ABB6B /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59DB5A84662EBAFEC776E1D05FC2A56 /* Filter.swift */; }; - 4732AF73094C36A6EBD23D4604911E70 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; - 52A280AB4852FDE92DF09B5E79D5C2AA /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE39F8F9D08B99E2AC56305CB28004D2 /* Indicator.swift */; }; - 6A375593407BC7937234B2B6A0811760 /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9856B231053FF41FC9B14ACCC6F9215C /* Kingfisher-dummy.m */; }; - 6CD63E1564618B6213B98E0ABBC3127C /* ThreadHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D06CAA9AFC94CB86E9CB96D78BD0923 /* ThreadHelper.swift */; }; - 6DA770087D354CDCD3889CDAE7C4C698 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE6AD548C8531F1E89A4AC6B1C6B3A8 /* Box.swift */; }; - 7636F846675C9F4ED96E00C6C19A4890 /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBB1ACC8AAF2B55915F99167EE149FA6 /* KingfisherManager.swift */; }; - 86B7DA678C8705523C300947117C0706 /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA1EE6FB137B9949B921A201014D9660 /* ImageTransition.swift */; }; - 8DA7E6883118CB3C8132B64D3D43AE0B /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCAABA051F2B62FEC94F6629032960D /* Resource.swift */; }; - 9DBD850905A6847B4AF2A6E6FC16B88B /* Pods-WRCycleScrollViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0470001404DF060D0FAF78230B30DE /* Pods-WRCycleScrollViewDemo-dummy.m */; }; - 9F826F893E86EB86591B637A1CE4B13A /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFD3C40826560CCA979FBF1A30879C5D /* String+MD5.swift */; }; - A8F35D1EBAEF99D38F02A0B8CA5D8FBE /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A24D7C6D5AC7A569D95092B9FA066ABA /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9CC5ED97D29C6C3DE22B78A9AA2AD91 /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6211E96F580D34F3E3F84D65BD80EC24 /* Kingfisher.swift */; }; - DC6080C64C269628C3F5107BE87055E2 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94DE4AC69094EC3015FFF1BF0AD4AFE7 /* ImageDownloader.swift */; }; - E9571FAF5B5251BA220DA7C1FBEE1440 /* Pods-WRCycleScrollViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B3B009A739A5143DE7EE9365C3F2C633 /* Pods-WRCycleScrollViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA816A580C3858934ED6FE92040C26DD /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 799CA99214B1F57CE947563E43D6E995 /* RequestModifier.swift */; }; - EE89512E8D36E67CDC525DB9D5BBF5A7 /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4022814E31F041CA8E6FFA328C8639 /* UIButton+Kingfisher.swift */; }; - F5C8C3F45F42FBDE5D87000C71178D20 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F46EFC5CDAF57A92A7B136FFD3525675 /* CFNetwork.framework */; }; - F8E957950566622A3E4B61AACE8F0B4A /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C72AFC42CED429C7A71F7A7704D20C /* ImageCache.swift */; }; + 0096C6816AC3D92834AB65C49518C177 /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */; }; + 03E0A134F1DDF33EA16F004F1A230CA1 /* FormatIndicatedCacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */; }; + 103228D906B112AA75562E8B17179127 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */; }; + 114397DE4A2DC0204868A79F4BE13769 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A1419F008FE1993459210F31E14AE /* Filter.swift */; }; + 1A46E04D326B224412B9B9EC4A23B611 /* Pods-WRCycleScrollViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA495AEC0E5B0E946D5D98D55C3CFA7F /* Pods-WRCycleScrollViewDemo-dummy.m */; }; + 2283375C0C99789CF47EEDA0CE9D3D80 /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */; }; + 2ABE0F8940C00BD429E33ED7F7C9EA1D /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */; }; + 2F07303D654FD044F366E213D63ED6D5 /* WRNavigationBar_swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32BD5E726818CAA61F34A00C07BC0D33 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; + 3464228E4F1F63DBCA803CC848A6A8C0 /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */; }; + 403E3E170DCF269D5CBA1C530ECA901B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; + 4074AA6F2557EF7970DEDE67B04433B6 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */; }; + 498DC29155467AC093701C1AF5EE3807 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */; }; + 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6438B3A2CEACB4D724E0BC8762F909B4 /* WRCustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */; }; + 6486781D756A9D71FE5C6E56CC9A343F /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */; }; + 79D243A74336D282DFD51E88B45EF085 /* WRNavigationBar_swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */; }; + 7B2A61E55C43E9B12E5B7DD852456AEE /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */; }; + 82252AC9595554C901DACEFD19E2A9E0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; + 84CF440A4E3CCDEE93FA2475748A9934 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F46EFC5CDAF57A92A7B136FFD3525675 /* CFNetwork.framework */; }; + 95156987028D309F91AC55FBDFE01643 /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */; }; + A8A79840E81BFA3D8DCC29BE71F1AEC4 /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */; }; + A9D2A6547EE5F6532EF8D1F1870BF158 /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */; }; + AD58B6CD6B08064EA2BC1B439643F5FA /* Pods-WRCycleScrollViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 91F3DD554153F8E4D41B0437D0BAF72D /* Pods-WRCycleScrollViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B564B930C3B6CCFCC109ABF374B21CE6 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */; }; + B924069CD75769E22765912C66A87BF3 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */; }; + BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */ = {isa = PBXBuildFile; fileRef = 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BE9FB5E8188E0B68DB277B09A06E79BA /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */; }; + C32C7FE70764DE37935F6A5D80CB17C7 /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */; }; + CE38861F1268294930C074FC3F807E55 /* ThreadHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */; }; + CEEB7C897409C08DF53289E307AB987C /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */; }; + D1575AAADDCEA395E3828EBAC2A772FA /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */; }; + DA7A5ECA4C0B39776007BE89B99227EF /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */; }; + E9E5F082818BE1AA4722E77DD066450F /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */; }; + EC5F157BC02D1F26152FBC01C3886D6D /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */; }; + FED97351EC4705507DAB175106B819C8 /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 08FDCB812AC1C6889C89FD6B33D9906F /* PBXContainerItemProxy */ = { + 19B7615C0DD9DE012AAC36AE0F32641D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = C4944FEC314D1A66588651D006273ADE; + remoteGlobalIDString = 4F87037150ABE2C9238B54E8F6E33F36; remoteInfo = Kingfisher; }; + D9C97F29CCA88067EF0B68A1FA662B21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E2CC60083DC7D84D0D176C293F3954C9; + remoteInfo = WRNavigationBar_swift; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0CCAABA051F2B62FEC94F6629032960D /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/Resource.swift; sourceTree = ""; }; - 0EACA73146F2EFD5728BDDE27435FBD5 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/ImageView+Kingfisher.swift"; sourceTree = ""; }; - 1919BBE22CC8221327B2CBE2103DF6CC /* Pods_WRCycleScrollViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollViewDemo.framework; path = "Pods-WRCycleScrollViewDemo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 21E6897D9D583C76EB2159C24BA06F99 /* Pods-WRCycleScrollViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WRCycleScrollViewDemo-acknowledgements.markdown"; sourceTree = ""; }; - 40F4491E340CD8AFA20CA333A7248C0A /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/AnimatedImageView.swift; sourceTree = ""; }; - 449745419F19FD32556B5DB4C4713E19 /* ImageProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessor.swift; path = Sources/ImageProcessor.swift; sourceTree = ""; }; - 5207B9BA1FAC60A316B91128301138B6 /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Kingfisher.modulemap; sourceTree = ""; }; - 5D06CAA9AFC94CB86E9CB96D78BD0923 /* ThreadHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadHelper.swift; path = Sources/ThreadHelper.swift; sourceTree = ""; }; - 6211E96F580D34F3E3F84D65BD80EC24 /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/Kingfisher.swift; sourceTree = ""; }; - 6300616FDC50C597FDE18FDA6BCC1FB5 /* Pods-WRCycleScrollViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollViewDemo-frameworks.sh"; sourceTree = ""; }; - 728526B37DDDA029802BB62E46A42B33 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 018EC9305B73CB94F30D6D49EE9FFBAE /* Pods_WRCycleScrollViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollViewDemo.framework; path = "Pods-WRCycleScrollViewDemo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/AnimatedImageView.swift; sourceTree = ""; }; + 10284B99AAE8D85089D3C62EC1F87ED2 /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-prefix.pch"; sourceTree = ""; }; + 1760EEE5CF89F97F04E541BCDFE1D80A /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher.framework; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRCustomNavigationBar.swift; path = WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift; sourceTree = ""; }; + 2504D92B937C8312E816566BE54869C9 /* WRNavigationBar_swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = WRNavigationBar_swift.modulemap; sourceTree = ""; }; + 2C3469703B3994D9F6299B8D8358E9EB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WRNavigationBar_swift.xcconfig; sourceTree = ""; }; + 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/String+MD5.swift"; sourceTree = ""; }; + 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = ""; }; + 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/KingfisherOptionsInfo.swift; sourceTree = ""; }; + 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/RequestModifier.swift; sourceTree = ""; }; + 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/Resource.swift; sourceTree = ""; }; + 3EB686D290BC382AFD6C82A343E1CF13 /* Pods-WRCycleScrollViewDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollViewDemo-resources.sh"; sourceTree = ""; }; + 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/KingfisherManager.swift; sourceTree = ""; }; + 4042CBAEF9E2051D1728E3B085B22E2D /* Pods-WRCycleScrollViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollViewDemo-frameworks.sh"; sourceTree = ""; }; + 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Kingfisher.h; path = Sources/Kingfisher.h; sourceTree = ""; }; + 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/ImageTransition.swift; sourceTree = ""; }; + 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageModifier.swift; path = Sources/ImageModifier.swift; sourceTree = ""; }; + 51D67D51760EBEA761B4FFF92E258863 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 540A1419F008FE1993459210F31E14AE /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Filter.swift; sourceTree = ""; }; + 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/UIButton+Kingfisher.swift"; sourceTree = ""; }; + 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/ImageView+Kingfisher.swift"; sourceTree = ""; }; + 6CB331E6C6B5E83CB11FDCAAB42FF6FF /* Pods-WRCycleScrollViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollViewDemo.release.xcconfig"; sourceTree = ""; }; 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 76637BC143D489A46B5686D045824A8E /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher.framework; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 799CA99214B1F57CE947563E43D6E995 /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/RequestModifier.swift; sourceTree = ""; }; - 7E472934E9C86C6DB482A8B56206A0A3 /* Pods-WRCycleScrollViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-WRCycleScrollViewDemo.modulemap"; sourceTree = ""; }; - 814A249890448FEA6045B315BCF3CBDD /* Kingfisher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Kingfisher.h; path = Sources/Kingfisher.h; sourceTree = ""; }; + 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Indicator.swift; sourceTree = ""; }; + 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/FormatIndicatedCacheSerializer.swift; sourceTree = ""; }; + 91F3DD554153F8E4D41B0437D0BAF72D /* Pods-WRCycleScrollViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WRCycleScrollViewDemo-umbrella.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; }; - 94DE4AC69094EC3015FFF1BF0AD4AFE7 /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/ImageDownloader.swift; sourceTree = ""; }; - 968C4EE1CB49CA730B177A530E6BC12F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9856B231053FF41FC9B14ACCC6F9215C /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = ""; }; - 9DE6AD548C8531F1E89A4AC6B1C6B3A8 /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Box.swift; sourceTree = ""; }; - 9E4022814E31F041CA8E6FFA328C8639 /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/UIButton+Kingfisher.swift"; sourceTree = ""; }; - 9EC672E8EA725C5D07B841DD0564BE8A /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image.swift; sourceTree = ""; }; - A095EF160FF9234364CDD94B8926E24A /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/ImagePrefetcher.swift; sourceTree = ""; }; - A24D7C6D5AC7A569D95092B9FA066ABA /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = ""; }; - A59DB5A84662EBAFEC776E1D05FC2A56 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Filter.swift; sourceTree = ""; }; - AA1EE6FB137B9949B921A201014D9660 /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/ImageTransition.swift; sourceTree = ""; }; - AFD3C40826560CCA979FBF1A30879C5D /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/String+MD5.swift"; sourceTree = ""; }; - B3B009A739A5143DE7EE9365C3F2C633 /* Pods-WRCycleScrollViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WRCycleScrollViewDemo-umbrella.h"; sourceTree = ""; }; - B686839DA5A64ECF178113ACBB5FE4E0 /* Pods-WRCycleScrollViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WRCycleScrollViewDemo-acknowledgements.plist"; sourceTree = ""; }; - B91565307788E3521AED3E3FB64255AA /* Pods-WRCycleScrollViewDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollViewDemo-resources.sh"; sourceTree = ""; }; - BC79E2E5D62D71F36463838727DAA58D /* Kingfisher.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.xcconfig; sourceTree = ""; }; - C290F623DA1362AC54504E3A6F9860FA /* Pods-WRCycleScrollViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollViewDemo.release.xcconfig"; sourceTree = ""; }; - CDB06CA9125048730F6F8EDD92103BD0 /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/CacheSerializer.swift; sourceTree = ""; }; - CDE0B277521173BAAD6491551A7FC92A /* Pods-WRCycleScrollViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollViewDemo.debug.xcconfig"; sourceTree = ""; }; - D7A3C90E9DF742791B93F3793008064F /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-prefix.pch"; sourceTree = ""; }; - DE39F8F9D08B99E2AC56305CB28004D2 /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Indicator.swift; sourceTree = ""; }; - E7F836E9F331D1DFAA871B794EC40647 /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/KingfisherOptionsInfo.swift; sourceTree = ""; }; - ED0470001404DF060D0FAF78230B30DE /* Pods-WRCycleScrollViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WRCycleScrollViewDemo-dummy.m"; sourceTree = ""; }; - F0C72AFC42CED429C7A71F7A7704D20C /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = ""; }; + 95E5D1E8A9B406BC3E5BAB24813B1589 /* Pods-WRCycleScrollViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WRCycleScrollViewDemo.modulemap"; sourceTree = ""; }; + 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.xcconfig; sourceTree = ""; }; + 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadHelper.swift; path = Sources/ThreadHelper.swift; sourceTree = ""; }; + A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image.swift; sourceTree = ""; }; + A6ED1DBD3A1B3007D44B9A4844C2F456 /* Pods-WRCycleScrollViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WRCycleScrollViewDemo-acknowledgements.markdown"; sourceTree = ""; }; + B0D60D21186BDCCB820D124F66182B6B /* WRNavigationBar_swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRNavigationBar_swift-prefix.pch"; sourceTree = ""; }; + B18AFD25E7809DC8483C40D48A215A66 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollViewDemo.debug.xcconfig"; sourceTree = ""; }; + B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessor.swift; path = Sources/ImageProcessor.swift; sourceTree = ""; }; + BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Placeholder.swift; path = Sources/Placeholder.swift; sourceTree = ""; }; + C6F28CFD3648E4B549E3BEF3EAF67A1D /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Kingfisher.modulemap; sourceTree = ""; }; + C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/ImagePrefetcher.swift; sourceTree = ""; }; + CA495AEC0E5B0E946D5D98D55C3CFA7F /* Pods-WRCycleScrollViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WRCycleScrollViewDemo-dummy.m"; sourceTree = ""; }; + CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRNavigationBar.swift; path = WRNavigationBar_swift/Classes/WRNavigationBar.swift; sourceTree = ""; }; + D50BD1950F45CF0E5827559D0D4FE355 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = ""; }; + DCF6925055ADA6CC967E607BFB5F3980 /* Pods-WRCycleScrollViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WRCycleScrollViewDemo-acknowledgements.plist"; sourceTree = ""; }; + DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/ImageDownloader.swift; sourceTree = ""; }; + E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = ""; }; + E41319130961652A85272BA59104CB1B /* WRNavigationBar_swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = WRNavigationBar_swift.framework; path = WRNavigationBar_swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRNavigationBar_swift-umbrella.h"; sourceTree = ""; }; + E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Box.swift; sourceTree = ""; }; + EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/CacheSerializer.swift; sourceTree = ""; }; + F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/Kingfisher.swift; sourceTree = ""; }; F46EFC5CDAF57A92A7B136FFD3525675 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; - FBB1ACC8AAF2B55915F99167EE149FA6 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/KingfisherManager.swift; sourceTree = ""; }; + F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WRNavigationBar_swift-dummy.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - CF6F90D56AB50B60C0044320A8176AD9 /* Frameworks */ = { + 681233658848532795A9CF1D33B54781 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4732AF73094C36A6EBD23D4604911E70 /* Foundation.framework in Frameworks */, + 32BD5E726818CAA61F34A00C07BC0D33 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ED03E5917B811BACFE75189AE0C2A469 /* Frameworks */ = { + A05AD251435FB24E096BBA193F9C99F0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F5C8C3F45F42FBDE5D87000C71178D20 /* CFNetwork.framework in Frameworks */, - 2D41430007CE8464586F521838A882C2 /* Foundation.framework in Frameworks */, + 84CF440A4E3CCDEE93FA2475748A9934 /* CFNetwork.framework in Frameworks */, + 403E3E170DCF269D5CBA1C530ECA901B /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FBA69F5E1EFCE177CD2E8A0860EF0E31 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 82252AC9595554C901DACEFD19E2A9E0 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -116,38 +151,29 @@ 0A7761265548491332891BE52B03E86E /* Targets Support Files */ = { isa = PBXGroup; children = ( - 0B2FF889A68823EC19830C3947AE3FC9 /* Pods-WRCycleScrollViewDemo */, + 1911884ABAE585C138712D520BD16312 /* Pods-WRCycleScrollViewDemo */, ); name = "Targets Support Files"; sourceTree = ""; }; - 0B2FF889A68823EC19830C3947AE3FC9 /* Pods-WRCycleScrollViewDemo */ = { + 1911884ABAE585C138712D520BD16312 /* Pods-WRCycleScrollViewDemo */ = { isa = PBXGroup; children = ( - 728526B37DDDA029802BB62E46A42B33 /* Info.plist */, - 7E472934E9C86C6DB482A8B56206A0A3 /* Pods-WRCycleScrollViewDemo.modulemap */, - 21E6897D9D583C76EB2159C24BA06F99 /* Pods-WRCycleScrollViewDemo-acknowledgements.markdown */, - B686839DA5A64ECF178113ACBB5FE4E0 /* Pods-WRCycleScrollViewDemo-acknowledgements.plist */, - ED0470001404DF060D0FAF78230B30DE /* Pods-WRCycleScrollViewDemo-dummy.m */, - 6300616FDC50C597FDE18FDA6BCC1FB5 /* Pods-WRCycleScrollViewDemo-frameworks.sh */, - B91565307788E3521AED3E3FB64255AA /* Pods-WRCycleScrollViewDemo-resources.sh */, - B3B009A739A5143DE7EE9365C3F2C633 /* Pods-WRCycleScrollViewDemo-umbrella.h */, - CDE0B277521173BAAD6491551A7FC92A /* Pods-WRCycleScrollViewDemo.debug.xcconfig */, - C290F623DA1362AC54504E3A6F9860FA /* Pods-WRCycleScrollViewDemo.release.xcconfig */, + 2C3469703B3994D9F6299B8D8358E9EB /* Info.plist */, + 95E5D1E8A9B406BC3E5BAB24813B1589 /* Pods-WRCycleScrollViewDemo.modulemap */, + A6ED1DBD3A1B3007D44B9A4844C2F456 /* Pods-WRCycleScrollViewDemo-acknowledgements.markdown */, + DCF6925055ADA6CC967E607BFB5F3980 /* Pods-WRCycleScrollViewDemo-acknowledgements.plist */, + CA495AEC0E5B0E946D5D98D55C3CFA7F /* Pods-WRCycleScrollViewDemo-dummy.m */, + 4042CBAEF9E2051D1728E3B085B22E2D /* Pods-WRCycleScrollViewDemo-frameworks.sh */, + 3EB686D290BC382AFD6C82A343E1CF13 /* Pods-WRCycleScrollViewDemo-resources.sh */, + 91F3DD554153F8E4D41B0437D0BAF72D /* Pods-WRCycleScrollViewDemo-umbrella.h */, + B18AFD25E7809DC8483C40D48A215A66 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */, + 6CB331E6C6B5E83CB11FDCAAB42FF6FF /* Pods-WRCycleScrollViewDemo.release.xcconfig */, ); name = "Pods-WRCycleScrollViewDemo"; path = "Target Support Files/Pods-WRCycleScrollViewDemo"; sourceTree = ""; }; - 24709664645625CD16ABF8FA52C64DF8 /* Products */ = { - isa = PBXGroup; - children = ( - 76637BC143D489A46B5686D045824A8E /* Kingfisher.framework */, - 1919BBE22CC8221327B2CBE2103DF6CC /* Pods_WRCycleScrollViewDemo.framework */, - ); - name = Products; - sourceTree = ""; - }; 3DC75C8869B42AB93D04871325A0707E /* iOS */ = { isa = PBXGroup; children = ( @@ -165,12 +191,14 @@ name = Frameworks; sourceTree = ""; }; - 6D6A3E96995405C682083EAC9705D118 /* Pods */ = { + 7A1834B703BF86842385CF8638852888 /* Products */ = { isa = PBXGroup; children = ( - BC43CE0E4B9A087C6F738A912A8078EB /* Kingfisher */, + 1760EEE5CF89F97F04E541BCDFE1D80A /* Kingfisher.framework */, + 018EC9305B73CB94F30D6D49EE9FFBAE /* Pods_WRCycleScrollViewDemo.framework */, + E41319130961652A85272BA59104CB1B /* WRNavigationBar_swift.framework */, ); - name = Pods; + name = Products; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { @@ -178,112 +206,175 @@ children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, - 6D6A3E96995405C682083EAC9705D118 /* Pods */, - 24709664645625CD16ABF8FA52C64DF8 /* Products */, + C68A42DFF98C4F734F14D49FE295D994 /* Pods */, + 7A1834B703BF86842385CF8638852888 /* Products */, 0A7761265548491332891BE52B03E86E /* Targets Support Files */, ); sourceTree = ""; }; - BC43CE0E4B9A087C6F738A912A8078EB /* Kingfisher */ = { + 8E9E743985FA5BF4B6799736D428D0B3 /* Support Files */ = { isa = PBXGroup; children = ( - 40F4491E340CD8AFA20CA333A7248C0A /* AnimatedImageView.swift */, - 9DE6AD548C8531F1E89A4AC6B1C6B3A8 /* Box.swift */, - CDB06CA9125048730F6F8EDD92103BD0 /* CacheSerializer.swift */, - A59DB5A84662EBAFEC776E1D05FC2A56 /* Filter.swift */, - 9EC672E8EA725C5D07B841DD0564BE8A /* Image.swift */, - F0C72AFC42CED429C7A71F7A7704D20C /* ImageCache.swift */, - 94DE4AC69094EC3015FFF1BF0AD4AFE7 /* ImageDownloader.swift */, - A095EF160FF9234364CDD94B8926E24A /* ImagePrefetcher.swift */, - 449745419F19FD32556B5DB4C4713E19 /* ImageProcessor.swift */, - AA1EE6FB137B9949B921A201014D9660 /* ImageTransition.swift */, - 0EACA73146F2EFD5728BDDE27435FBD5 /* ImageView+Kingfisher.swift */, - DE39F8F9D08B99E2AC56305CB28004D2 /* Indicator.swift */, - 814A249890448FEA6045B315BCF3CBDD /* Kingfisher.h */, - 6211E96F580D34F3E3F84D65BD80EC24 /* Kingfisher.swift */, - FBB1ACC8AAF2B55915F99167EE149FA6 /* KingfisherManager.swift */, - E7F836E9F331D1DFAA871B794EC40647 /* KingfisherOptionsInfo.swift */, - 799CA99214B1F57CE947563E43D6E995 /* RequestModifier.swift */, - 0CCAABA051F2B62FEC94F6629032960D /* Resource.swift */, - AFD3C40826560CCA979FBF1A30879C5D /* String+MD5.swift */, - 5D06CAA9AFC94CB86E9CB96D78BD0923 /* ThreadHelper.swift */, - 9E4022814E31F041CA8E6FFA328C8639 /* UIButton+Kingfisher.swift */, - DF56DAAF6901EA25B7722FFAC391B276 /* Support Files */, + D50BD1950F45CF0E5827559D0D4FE355 /* Info.plist */, + 2504D92B937C8312E816566BE54869C9 /* WRNavigationBar_swift.modulemap */, + 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.xcconfig */, + F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */, + B0D60D21186BDCCB820D124F66182B6B /* WRNavigationBar_swift-prefix.pch */, + E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */, ); - name = Kingfisher; - path = Kingfisher; + name = "Support Files"; + path = "../Target Support Files/WRNavigationBar_swift"; sourceTree = ""; }; - DF56DAAF6901EA25B7722FFAC391B276 /* Support Files */ = { + 946577F5851341F796A35BDDBA9359BA /* Support Files */ = { isa = PBXGroup; children = ( - 968C4EE1CB49CA730B177A530E6BC12F /* Info.plist */, - 5207B9BA1FAC60A316B91128301138B6 /* Kingfisher.modulemap */, - BC79E2E5D62D71F36463838727DAA58D /* Kingfisher.xcconfig */, - 9856B231053FF41FC9B14ACCC6F9215C /* Kingfisher-dummy.m */, - D7A3C90E9DF742791B93F3793008064F /* Kingfisher-prefix.pch */, - A24D7C6D5AC7A569D95092B9FA066ABA /* Kingfisher-umbrella.h */, + 51D67D51760EBEA761B4FFF92E258863 /* Info.plist */, + C6F28CFD3648E4B549E3BEF3EAF67A1D /* Kingfisher.modulemap */, + 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */, + 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */, + 10284B99AAE8D85089D3C62EC1F87ED2 /* Kingfisher-prefix.pch */, + D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */, ); name = "Support Files"; path = "../Target Support Files/Kingfisher"; sourceTree = ""; }; + A4BEDE3CFC9F9192B13945C5F9738F02 /* Kingfisher */ = { + isa = PBXGroup; + children = ( + 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */, + E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */, + EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */, + 540A1419F008FE1993459210F31E14AE /* Filter.swift */, + 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */, + A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */, + E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */, + DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */, + 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */, + C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */, + B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */, + 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */, + 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */, + 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */, + 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */, + F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */, + 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */, + 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */, + BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */, + 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */, + 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */, + 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */, + 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */, + 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */, + 946577F5851341F796A35BDDBA9359BA /* Support Files */, + ); + name = Kingfisher; + path = Kingfisher; + sourceTree = ""; + }; + C68A42DFF98C4F734F14D49FE295D994 /* Pods */ = { + isa = PBXGroup; + children = ( + A4BEDE3CFC9F9192B13945C5F9738F02 /* Kingfisher */, + ECB807DC83A33908DEBF5E0AF819A2BA /* WRNavigationBar_swift */, + ); + name = Pods; + sourceTree = ""; + }; + ECB807DC83A33908DEBF5E0AF819A2BA /* WRNavigationBar_swift */ = { + isa = PBXGroup; + children = ( + 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */, + CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */, + 8E9E743985FA5BF4B6799736D428D0B3 /* Support Files */, + ); + name = WRNavigationBar_swift; + path = WRNavigationBar_swift; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0F94B6BFE5A6242FBBB0BE3D27F7CEE9 /* Headers */ = { + BADBBCEED9A9F8B15B7F98467EA6FB0E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */, + BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C33B82D865A3D622C632C36A2B4CB34B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - A8F35D1EBAEF99D38F02A0B8CA5D8FBE /* Kingfisher-umbrella.h in Headers */, - 179523942E7D1E3EB210EF05E2C7AE79 /* Kingfisher.h in Headers */, + AD58B6CD6B08064EA2BC1B439643F5FA /* Pods-WRCycleScrollViewDemo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 79CA11A0325D4CBA1F44C5973A1EA835 /* Headers */ = { + CD7E3C3B5C90A4681B58338CE994881F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E9571FAF5B5251BA220DA7C1FBEE1440 /* Pods-WRCycleScrollViewDemo-umbrella.h in Headers */, + 2F07303D654FD044F366E213D63ED6D5 /* WRNavigationBar_swift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - A45C8A53181AB812941FA06ADA5C320E /* Pods-WRCycleScrollViewDemo */ = { + 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */ = { isa = PBXNativeTarget; - buildConfigurationList = E8F88CEF419BEBEB12DFC4E249144785 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollViewDemo" */; + buildConfigurationList = 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */; buildPhases = ( - DE8A772EAC0DA2C7F43D859076AAEC08 /* Sources */, - CF6F90D56AB50B60C0044320A8176AD9 /* Frameworks */, - 79CA11A0325D4CBA1F44C5973A1EA835 /* Headers */, + 154F6D32400678B08A7CB2E5FD292972 /* Sources */, + A05AD251435FB24E096BBA193F9C99F0 /* Frameworks */, + BADBBCEED9A9F8B15B7F98467EA6FB0E /* Headers */, ); buildRules = ( ); dependencies = ( - 996EE6E2A8A86B38D0D8F1AAFA420FB4 /* PBXTargetDependency */, + ); + name = Kingfisher; + productName = Kingfisher; + productReference = 1760EEE5CF89F97F04E541BCDFE1D80A /* Kingfisher.framework */; + productType = "com.apple.product-type.framework"; + }; + C4FFA3ADCB0D553735F8EBD4E9B0F88B /* Pods-WRCycleScrollViewDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 134910D8B599C1CCD6F1803DA20AA410 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollViewDemo" */; + buildPhases = ( + 4D896E372C548D5BA371DDA879BE91BF /* Sources */, + FBA69F5E1EFCE177CD2E8A0860EF0E31 /* Frameworks */, + C33B82D865A3D622C632C36A2B4CB34B /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 6EEC3DA532A4DDB23DD32499454DDB18 /* PBXTargetDependency */, + 68F08FB80602AF8C45DC559F88CCB713 /* PBXTargetDependency */, ); name = "Pods-WRCycleScrollViewDemo"; productName = "Pods-WRCycleScrollViewDemo"; - productReference = 1919BBE22CC8221327B2CBE2103DF6CC /* Pods_WRCycleScrollViewDemo.framework */; + productReference = 018EC9305B73CB94F30D6D49EE9FFBAE /* Pods_WRCycleScrollViewDemo.framework */; productType = "com.apple.product-type.framework"; }; - C4944FEC314D1A66588651D006273ADE /* Kingfisher */ = { + E2CC60083DC7D84D0D176C293F3954C9 /* WRNavigationBar_swift */ = { isa = PBXNativeTarget; - buildConfigurationList = 76E7EFBCEA1340954A03AA68051C2306 /* Build configuration list for PBXNativeTarget "Kingfisher" */; + buildConfigurationList = 0A6746D9BB092A1C7DA9F5EDFE97D0D1 /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */; buildPhases = ( - EAC7EA95310C5E1E724C632852F7D186 /* Sources */, - ED03E5917B811BACFE75189AE0C2A469 /* Frameworks */, - 0F94B6BFE5A6242FBBB0BE3D27F7CEE9 /* Headers */, + 8FEC1243DA6E750D957E0F9D9FA23FC7 /* Sources */, + 681233658848532795A9CF1D33B54781 /* Frameworks */, + CD7E3C3B5C90A4681B58338CE994881F /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Kingfisher; - productName = Kingfisher; - productReference = 76637BC143D489A46B5686D045824A8E /* Kingfisher.framework */; + name = WRNavigationBar_swift; + productName = WRNavigationBar_swift; + productReference = E41319130961652A85272BA59104CB1B /* WRNavigationBar_swift.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -292,8 +383,8 @@ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0700; + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -303,329 +394,441 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 24709664645625CD16ABF8FA52C64DF8 /* Products */; + productRefGroup = 7A1834B703BF86842385CF8638852888 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - C4944FEC314D1A66588651D006273ADE /* Kingfisher */, - A45C8A53181AB812941FA06ADA5C320E /* Pods-WRCycleScrollViewDemo */, + 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */, + C4FFA3ADCB0D553735F8EBD4E9B0F88B /* Pods-WRCycleScrollViewDemo */, + E2CC60083DC7D84D0D176C293F3954C9 /* WRNavigationBar_swift */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - DE8A772EAC0DA2C7F43D859076AAEC08 /* Sources */ = { + 154F6D32400678B08A7CB2E5FD292972 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4074AA6F2557EF7970DEDE67B04433B6 /* AnimatedImageView.swift in Sources */, + D1575AAADDCEA395E3828EBAC2A772FA /* Box.swift in Sources */, + A9D2A6547EE5F6532EF8D1F1870BF158 /* CacheSerializer.swift in Sources */, + 114397DE4A2DC0204868A79F4BE13769 /* Filter.swift in Sources */, + 03E0A134F1DDF33EA16F004F1A230CA1 /* FormatIndicatedCacheSerializer.swift in Sources */, + B924069CD75769E22765912C66A87BF3 /* Image.swift in Sources */, + 6486781D756A9D71FE5C6E56CC9A343F /* ImageCache.swift in Sources */, + DA7A5ECA4C0B39776007BE89B99227EF /* ImageDownloader.swift in Sources */, + B564B930C3B6CCFCC109ABF374B21CE6 /* ImageModifier.swift in Sources */, + BE9FB5E8188E0B68DB277B09A06E79BA /* ImagePrefetcher.swift in Sources */, + 2283375C0C99789CF47EEDA0CE9D3D80 /* ImageProcessor.swift in Sources */, + 7B2A61E55C43E9B12E5B7DD852456AEE /* ImageTransition.swift in Sources */, + 0096C6816AC3D92834AB65C49518C177 /* ImageView+Kingfisher.swift in Sources */, + 103228D906B112AA75562E8B17179127 /* Indicator.swift in Sources */, + 95156987028D309F91AC55FBDFE01643 /* Kingfisher-dummy.m in Sources */, + E9E5F082818BE1AA4722E77DD066450F /* Kingfisher.swift in Sources */, + A8A79840E81BFA3D8DCC29BE71F1AEC4 /* KingfisherManager.swift in Sources */, + 2ABE0F8940C00BD429E33ED7F7C9EA1D /* KingfisherOptionsInfo.swift in Sources */, + 498DC29155467AC093701C1AF5EE3807 /* Placeholder.swift in Sources */, + C32C7FE70764DE37935F6A5D80CB17C7 /* RequestModifier.swift in Sources */, + 3464228E4F1F63DBCA803CC848A6A8C0 /* Resource.swift in Sources */, + CEEB7C897409C08DF53289E307AB987C /* String+MD5.swift in Sources */, + CE38861F1268294930C074FC3F807E55 /* ThreadHelper.swift in Sources */, + FED97351EC4705507DAB175106B819C8 /* UIButton+Kingfisher.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D896E372C548D5BA371DDA879BE91BF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9DBD850905A6847B4AF2A6E6FC16B88B /* Pods-WRCycleScrollViewDemo-dummy.m in Sources */, + 1A46E04D326B224412B9B9EC4A23B611 /* Pods-WRCycleScrollViewDemo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - EAC7EA95310C5E1E724C632852F7D186 /* Sources */ = { + 8FEC1243DA6E750D957E0F9D9FA23FC7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 342AE33215135AD56B73580012DC22AB /* AnimatedImageView.swift in Sources */, - 6DA770087D354CDCD3889CDAE7C4C698 /* Box.swift in Sources */, - 2E5E570FFC49EF98550401421A243C0F /* CacheSerializer.swift in Sources */, - 4089E39F76F86466B8DDD39A1C1ABB6B /* Filter.swift in Sources */, - 33A14E817C0FA585D5DA3A55E453299D /* Image.swift in Sources */, - F8E957950566622A3E4B61AACE8F0B4A /* ImageCache.swift in Sources */, - DC6080C64C269628C3F5107BE87055E2 /* ImageDownloader.swift in Sources */, - 3414E1D9CB15149A296E16C45967B021 /* ImagePrefetcher.swift in Sources */, - 0E9CC28AC8E34FE8E1C87E933E04BC7A /* ImageProcessor.swift in Sources */, - 86B7DA678C8705523C300947117C0706 /* ImageTransition.swift in Sources */, - 33395912F2FFA355C4C36B7EDEAA3DA7 /* ImageView+Kingfisher.swift in Sources */, - 52A280AB4852FDE92DF09B5E79D5C2AA /* Indicator.swift in Sources */, - 6A375593407BC7937234B2B6A0811760 /* Kingfisher-dummy.m in Sources */, - C9CC5ED97D29C6C3DE22B78A9AA2AD91 /* Kingfisher.swift in Sources */, - 7636F846675C9F4ED96E00C6C19A4890 /* KingfisherManager.swift in Sources */, - 378B44CAA91C2106076668FDE72E1E02 /* KingfisherOptionsInfo.swift in Sources */, - EA816A580C3858934ED6FE92040C26DD /* RequestModifier.swift in Sources */, - 8DA7E6883118CB3C8132B64D3D43AE0B /* Resource.swift in Sources */, - 9F826F893E86EB86591B637A1CE4B13A /* String+MD5.swift in Sources */, - 6CD63E1564618B6213B98E0ABBC3127C /* ThreadHelper.swift in Sources */, - EE89512E8D36E67CDC525DB9D5BBF5A7 /* UIButton+Kingfisher.swift in Sources */, + 6438B3A2CEACB4D724E0BC8762F909B4 /* WRCustomNavigationBar.swift in Sources */, + EC5F157BC02D1F26152FBC01C3886D6D /* WRNavigationBar.swift in Sources */, + 79D243A74336D282DFD51E88B45EF085 /* WRNavigationBar_swift-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 996EE6E2A8A86B38D0D8F1AAFA420FB4 /* PBXTargetDependency */ = { + 68F08FB80602AF8C45DC559F88CCB713 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = WRNavigationBar_swift; + target = E2CC60083DC7D84D0D176C293F3954C9 /* WRNavigationBar_swift */; + targetProxy = D9C97F29CCA88067EF0B68A1FA662B21 /* PBXContainerItemProxy */; + }; + 6EEC3DA532A4DDB23DD32499454DDB18 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Kingfisher; - target = C4944FEC314D1A66588651D006273ADE /* Kingfisher */; - targetProxy = 08FDCB812AC1C6889C89FD6B33D9906F /* PBXContainerItemProxy */; + target = 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */; + targetProxy = 19B7615C0DD9DE012AAC36AE0F32641D /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 20B5F4B4605A7E04AEE71183A359E092 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = BC79E2E5D62D71F36463838727DAA58D /* Kingfisher.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Kingfisher/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/Kingfisher/Kingfisher.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Kingfisher; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 34FE9531DA9AF2820790339988D5FF41 /* Release */ = { + 1EE19F5DD95931924296F637BF18BD8F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + 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_DIRECT_OBJC_ISA_USAGE = 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_OBJC_ROOT_CLASS = 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 = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; + 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_RELEASE=1", + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; }; - name = Release; + name = Debug; }; - 95643834054F4CBC825BC84417F97B16 /* Release */ = { + 1F25A732760398E965091F0E6E9C39FB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C290F623DA1362AC54504E3A6F9860FA /* Pods-WRCycleScrollViewDemo.release.xcconfig */; + baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Kingfisher/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_WRCycleScrollViewDemo; + MODULEMAP_FILE = "Target Support Files/Kingfisher/Kingfisher.modulemap"; + PRODUCT_MODULE_NAME = Kingfisher; + PRODUCT_NAME = Kingfisher; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - A794525992F2457D34942D108D9E942A /* Debug */ = { + 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BC79E2E5D62D71F36463838727DAA58D /* Kingfisher.xcconfig */; + baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; INFOPLIST_FILE = "Target Support Files/Kingfisher/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/Kingfisher/Kingfisher.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_MODULE_NAME = Kingfisher; PRODUCT_NAME = Kingfisher; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - B45A8B5A3E381311337C70BF499F7261 /* Debug */ = { + 43C5DB047AC29479011B6AB1BA426217 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CDE0B277521173BAAD6491551A7FC92A /* Pods-WRCycleScrollViewDemo.debug.xcconfig */; + baseConfigurationReference = B18AFD25E7809DC8483C40D48A215A66 /* Pods-WRCycleScrollViewDemo.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; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_WRCycleScrollViewDemo; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - C104F7F091290C3D1E248192F07FE689 /* Debug */ = { + 61968215806C6D16D5D97F6A62CD0E19 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6CB331E6C6B5E83CB11FDCAAB42FF6FF /* Pods-WRCycleScrollViewDemo.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-WRCycleScrollViewDemo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.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; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 871EDCFC9428C263E17DA28CB059E3AF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.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/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRNavigationBar_swift/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/WRNavigationBar_swift/WRNavigationBar_swift.modulemap"; + PRODUCT_MODULE_NAME = WRNavigationBar_swift; + PRODUCT_NAME = WRNavigationBar_swift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C64FA0D12319F7517FEEEF813D3D3401 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.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/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRNavigationBar_swift/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/WRNavigationBar_swift/WRNavigationBar_swift.modulemap"; + PRODUCT_MODULE_NAME = WRNavigationBar_swift; + PRODUCT_NAME = WRNavigationBar_swift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F4568DEE257655D290C2B9CEAB37C934 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + 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_DIRECT_OBJC_ISA_USAGE = 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_OBJC_ROOT_CLASS = 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; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; + 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_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; SYMROOT = "${SRCROOT}/../build"; }; - name = Debug; + name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 0A6746D9BB092A1C7DA9F5EDFE97D0D1 /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */ = { isa = XCConfigurationList; buildConfigurations = ( - C104F7F091290C3D1E248192F07FE689 /* Debug */, - 34FE9531DA9AF2820790339988D5FF41 /* Release */, + 871EDCFC9428C263E17DA28CB059E3AF /* Debug */, + C64FA0D12319F7517FEEEF813D3D3401 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 76E7EFBCEA1340954A03AA68051C2306 /* Build configuration list for PBXNativeTarget "Kingfisher" */ = { + 134910D8B599C1CCD6F1803DA20AA410 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollViewDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43C5DB047AC29479011B6AB1BA426217 /* Debug */, + 61968215806C6D16D5D97F6A62CD0E19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - A794525992F2457D34942D108D9E942A /* Debug */, - 20B5F4B4605A7E04AEE71183A359E092 /* Release */, + 1EE19F5DD95931924296F637BF18BD8F /* Debug */, + F4568DEE257655D290C2B9CEAB37C934 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E8F88CEF419BEBEB12DFC4E249144785 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollViewDemo" */ = { + 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */ = { isa = XCConfigurationList; buildConfigurations = ( - B45A8B5A3E381311337C70BF499F7261 /* Debug */, - 95643834054F4CBC825BC84417F97B16 /* Release */, + 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */, + 1F25A732760398E965091F0E6E9C39FB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Info.plist b/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Info.plist index f4b9ea8..eecd805 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Info.plist +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.6.2 + 4.10.1 CFBundleSignature ???? CFBundleVersion diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig b/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig index 6e8fd9e..52db99f 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig @@ -1,12 +1,10 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Kingfisher +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" OTHER_LDFLAGS = -framework "CFNetwork" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Kingfisher PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES -SWIFT_VERSION = 3.0 diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown index 0d6265a..8ea98ba 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown @@ -5,7 +5,7 @@ This application makes use of the following third party libraries: The MIT License (MIT) -Copyright (c) 2017 Wei Wang +Copyright (c) 2018 Wei Wang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26,4 +26,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## WRNavigationBar_swift + +MIT License + +Copyright (c) 2017 + +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/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist index 49c755a..bf78ebf 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist @@ -16,7 +16,7 @@ FooterText The MIT License (MIT) -Copyright (c) 2017 Wei Wang +Copyright (c) 2018 Wei Wang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -44,6 +44,37 @@ SOFTWARE. Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) 2017 + +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 + WRNavigationBar_swift + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh index b1c3c96..a6cadbe 100755 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh @@ -1,11 +1,28 @@ #!/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 @@ -23,9 +40,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # 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")" @@ -54,12 +71,40 @@ install_framework() 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 + 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'" + 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 &" @@ -72,11 +117,19 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # 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 $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + 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" @@ -85,14 +138,17 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Kingfisher/Kingfisher.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework" + install_framework "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Kingfisher/Kingfisher.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework" + install_framework "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh index aed060f..345301f 100755 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh @@ -1,5 +1,13 @@ #!/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}" @@ -8,7 +16,11 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() -case "${TARGETED_DEVICE_FAMILY}" in +# 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" ;; @@ -44,29 +56,29 @@ EOM 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}" + 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}" + 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}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${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\"" + 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\"" + 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\"" + 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) @@ -74,7 +86,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac @@ -88,7 +100,7 @@ if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then fi rm -f "$RESOURCES_TO_COPY" -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +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) @@ -98,5 +110,9 @@ then fi done <<<"$OTHER_XCASSETS" - 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}" + 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/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig index 4336f8f..98cb416 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Kingfisher" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" 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/Kingfisher/Kingfisher.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" -framework "WRNavigationBar_swift" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +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/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig index 4336f8f..98cb416 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Kingfisher" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" 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/Kingfisher/Kingfisher.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" -framework "WRNavigationBar_swift" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +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/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/Info.plist b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/Info.plist new file mode 100644 index 0000000..161a9d3 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m new file mode 100644 index 0000000..8143361 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_WRNavigationBar_swift : NSObject +@end +@implementation PodsDummy_WRNavigationBar_swift +@end diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-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/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h new file mode 100644 index 0000000..cde05c7 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-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 WRNavigationBar_swiftVersionNumber; +FOUNDATION_EXPORT const unsigned char WRNavigationBar_swiftVersionString[]; + diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap new file mode 100644 index 0000000..03b3365 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap @@ -0,0 +1,6 @@ +framework module WRNavigationBar_swift { + umbrella header "WRNavigationBar_swift-umbrella.h" + + export * + module * { export * } +} diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig new file mode 100644 index 0000000..73a556d --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/WRNavigationBar_swift +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/LICENSE b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/LICENSE new file mode 100644 index 0000000..8864d4a --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 + +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. diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/README.md b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/README.md new file mode 100644 index 0000000..fa7f958 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/README.md @@ -0,0 +1,141 @@ + +![image](https://github.com/wangrui460/WRNavigationBar/raw/master/screenshots/WRNavigationBar.png) + +[For Objective-C:https://github.com/wangrui460/WRNavigationBar](https://github.com/wangrui460/WRNavigationBar) + + +------------------------------------------------------------ + +## Requirements +- iOS 8+ +- Xcode 8+ + + +## Demo + +![导航栏显示渐变色](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/导航栏显示渐变色.gif) + +![导航栏显示图片](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/导航栏显示图片.gif) + +![新浪微博个人中心](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/新浪微博个人中心.gif) + +![qq空间](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/qq空间.gif) + +![知乎日报](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/知乎日报.gif) + +![QQ我的资料页](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/QQ我的资料页.gif) + +![蚂蚁森林](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/蚂蚁森林.gif) + +![连续多个界面导航栏透明](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/连续多个界面导航栏透明.gif) + +![自定义导航栏](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/自定义导航栏.gif) + +![移动导航栏](https://github.com/wangrui460/WRNavigationBar_swift/raw/master/screenshots/移动导航栏.gif) + + +## Installation + +> **手动拖入** +> 将 WRNavigationBar 文件夹拽入项目中即可使用 + +## How To Use + +具体使用方法请参考Demo +

+// 一行代码搞定导航栏颜色
+navBarBarTintColor = .white
+// 一行代码搞定导航栏透明度
+navBarBackgroundAlpha = alpha
+// 一行代码搞定导航栏两边按钮颜色
+navBarTintColor = UIColor(red: 0, green: 0.478431, blue: 1, alpha: 1.0)
+// 一行代码搞定导航栏上标题颜色
+navBarTitleColor = .black
+// 一行代码搞定状态栏是 default 还是 lightContent
+statusBarStyle = .default
+// 一行代码搞定导航栏底部分割线是否隐藏
+navBarShadowImageHidden = true;
+
+ +

+// 设置导航栏默认的背景颜色
+UIColor.defaultNavBarBarTintColor = UIColor.init(red: 0/255.0, green: 175/255.0, blue: 240/255.0, alpha: 1)
+// 设置导航栏所有按钮的默认颜色
+UIColor.defaultNavBarTintColor = .white
+// 设置导航栏标题默认颜色
+UIColor.defaultNavBarTitleColor = .white
+// 统一设置状态栏样式
+UIColor.defaultStatusBarStyle = .lightContent
+// 如果需要设置导航栏底部分割线隐藏,可以在这里统一设置
+UIColor.defaultShadowImageHidden = true
+
+ + +## See detail +我的简书: [韦德460](http://www.jianshu.com/p/7e92451ab0b2) + + +## Update +- **2017.12.09** +解决问题:解决导航栏颜色和标题颜色改变失败的bug + +- **2017.12.09** +解决问题:解决点击返回按钮导航栏标题颜色闪烁的问题 + +-**2017.11.29**- +更新:解决部分用户设置导航栏无效的问题~ + +-**2017.11.29**- +更新:支持自定义导航栏~ + +- **2017.11.25** +更新:更新到 Swift 4,适配iOS 11、iPhone X,自定义导航栏再等两天~ + +- **2017.07.22** +添加新DEMO:连续多个界面导航栏透明 + +- **2017.07.09** +解决问题:当一个控制器中包含多个控制器时,导航栏颜色或透明度不正常的问题 + +- **2017.07.04** +添加新功能:全局设置导航栏显示图片(不建议在非自定义导航栏中使用) + +- **2017.07.01** +添加新功能:导航栏可显示图片 + +- **2017.06.29** +添加新功能:可单独设置每个控制器对应导航栏底部分割线是否隐藏 + +- **2017.06.29** +解决问题:解决引入WRNavigationBar后,无法设置导航栏标题大小的问题 + +- **2017.06.19** +解决问题:解决移动导航栏后右滑返回中途取消导致的导航栏错位的问题 + +- **2017.06.15** +解决问题:解决scrollView正在滑动的时候,点击返回按钮,导航栏颜色变化突兀的问题 + +- **2017.05.21** +解决问题:解决push导航栏没有渐变动画太突兀的问题 + +- **2017.05.20** +解决问题:解决侧滑返回导航栏没有渐变动画太突兀的**问题 + +- **2017.05.16** +新增Demo:完成自定义导航栏实现透明渐变等效果 + +- **2017.05.12** +解决问题:侧滑一点松开透明的导航栏会变不透明 + +## Features + + +# Contact me +- Weibo: [@wangrui460](http://weibo.com/wangrui460) +- Email: wangruidev@gmail.com +- QQ:1204607318 (基本不用) + +# License + +WRNavigationBar is available under the MIT license. See the LICENSE file for more info. + diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift new file mode 100644 index 0000000..da32b27 --- /dev/null +++ b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift @@ -0,0 +1,301 @@ +// +// WRCustomNavigationBar.swift +// WRNavigationBar_swift +// +// Created by itwangrui on 2017/11/25. +// Copyright © 2017年 wangrui. All rights reserved. +// + +import UIKit + +fileprivate let WRDefaultTitleSize:CGFloat = 18 +fileprivate let WRDefaultTitleColor = UIColor.black +fileprivate let WRDefaultBackgroundColor = UIColor.white +fileprivate let WRScreenWidth = UIScreen.main.bounds.size.width + + +// MARK: - Router +public extension UIViewController +{ + // A页面 弹出 登录页面B + // presentedViewController: A页面 + // presentingViewController: B页面 + + func wr_toLastViewController(animated:Bool) + { + if self.navigationController != nil + { + if self.navigationController?.viewControllers.count == 1 + { + self.dismiss(animated: animated, completion: nil) + } else { + self.navigationController?.popViewController(animated: animated) + } + } + else if self.presentingViewController != nil { + self.dismiss(animated: animated, completion: nil) + } + } + + class func wr_currentViewController() -> UIViewController + { + if let rootVC = UIApplication.shared.delegate?.window??.rootViewController { + return self.wr_currentViewController(from: rootVC) + } else { + return UIViewController() + } + } + + class func wr_currentViewController(from fromVC:UIViewController) -> UIViewController + { + if fromVC.isKind(of: UINavigationController.self) { + let navigationController = fromVC as! UINavigationController + return wr_currentViewController(from: navigationController.viewControllers.last!) + } + else if fromVC.isKind(of: UITabBarController.self) { + let tabBarController = fromVC as! UITabBarController + return wr_currentViewController(from: tabBarController.selectedViewController!) + } + else if fromVC.presentedViewController != nil { + return wr_currentViewController(from:fromVC.presentingViewController!) + } + else { + return fromVC + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +public class WRCustomNavigationBar: UIView +{ + public var onClickLeftButton:(()->())? + public var onClickRightButton:(()->())? + public var title:String? { + willSet { + titleLabel.isHidden = false + titleLabel.text = newValue + } + } + public var titleLabelColor:UIColor? { + willSet { + titleLabel.textColor = newValue + } + } + public var titleLabelFont:UIFont? { + willSet { + titleLabel.font = newValue + } + } + public var barBackgroundColor:UIColor? { + willSet { + backgroundImageView.isHidden = true + backgroundView.isHidden = false + backgroundView.backgroundColor = newValue + } + } + public var barBackgroundImage:UIImage? { + willSet { + backgroundView.isHidden = true + backgroundImageView.isHidden = false + backgroundImageView.image = newValue + } + } + + // fileprivate UI variable + fileprivate lazy var titleLabel:UILabel = { + let label = UILabel() + label.textColor = WRDefaultTitleColor + label.font = UIFont.systemFont(ofSize: WRDefaultTitleSize) + label.textAlignment = .center + label.isHidden = true + return label + }() + + public lazy var leftButton:UIButton = { + let button = UIButton() + button.imageView?.contentMode = .center + button.isHidden = true + button.addTarget(self, action: #selector(clickBack), for: .touchUpInside) + return button + }() + + public lazy var rightButton:UIButton = { + let button = UIButton() + button.imageView?.contentMode = .center + button.isHidden = true + button.addTarget(self, action: #selector(clickRight), for: .touchUpInside) + return button + }() + + fileprivate lazy var bottomLine:UIView = { + let view = UIView() + view.backgroundColor = UIColor(red: (218.0/255.0), green: (218.0/255.0), blue: (218.0/255.0), alpha: 1.0) + return view + }() + + fileprivate lazy var backgroundView:UIView = { + let view = UIView() + return view + }() + + fileprivate lazy var backgroundImageView:UIImageView = { + let imgView = UIImageView() + imgView.isHidden = true + return imgView + }() + + // fileprivate other variable + fileprivate static var isIphoneX:Bool { + get { + return UIScreen.main.bounds.equalTo(CGRect(x: 0, y: 0, width: 375, height: 812)) + } + } + fileprivate static var navBarBottom:Int { + get { + return isIphoneX ? 88 : 64 + } + } + + // init + public class func CustomNavigationBar() -> WRCustomNavigationBar { + let frame = CGRect(x: 0, y: 0, width: WRScreenWidth, height: CGFloat(navBarBottom)) + return WRCustomNavigationBar(frame: frame) + } + public override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupView() + } + + public func setupView() + { + addSubview(backgroundView) + addSubview(backgroundImageView) + addSubview(leftButton) + addSubview(titleLabel) + addSubview(rightButton) + addSubview(bottomLine) + updateFrame() + backgroundColor = UIColor.clear + backgroundView.backgroundColor = WRDefaultBackgroundColor + } + public func updateFrame() + { + let top:CGFloat = WRCustomNavigationBar.isIphoneX ? 44 : 20 + let margin:CGFloat = 0 + let buttonHeight:CGFloat = 44 + let buttonWidth:CGFloat = 44 + let titleLabelHeight:CGFloat = 44 + let titleLabelWidth:CGFloat = 180 + + backgroundView.frame = self.bounds + backgroundImageView.frame = self.bounds + leftButton.frame = CGRect(x: margin, y: top, width: buttonWidth, height: buttonHeight) + rightButton.frame = CGRect(x: WRScreenWidth-buttonWidth-margin, y: top, width: buttonWidth, height: buttonHeight) + titleLabel.frame = CGRect(x: (WRScreenWidth-titleLabelWidth)/2.0, y: top, width: titleLabelWidth, height: titleLabelHeight) + bottomLine.frame = CGRect(x: 0, y: bounds.height-0.5, width: WRScreenWidth, height: 0.5) + } +} + + +public extension WRCustomNavigationBar +{ + func wr_setBottomLineHidden(hidden:Bool) { + bottomLine.isHidden = hidden + } + func wr_setBackgroundAlpha(alpha:CGFloat) { + backgroundView.alpha = alpha + backgroundImageView.alpha = alpha + bottomLine.alpha = alpha + } + func wr_setTintColor(color:UIColor) { + leftButton.setTitleColor(color, for: .normal) + rightButton.setTitleColor(color, for: .normal) + titleLabel.textColor = color + } + + // 左右按钮共有方法 + func wr_setLeftButton(normal:UIImage, highlighted:UIImage) { + wr_setLeftButton(normal: normal, highlighted: highlighted, title: nil, titleColor: nil) + } + func wr_setLeftButton(image:UIImage) { + wr_setLeftButton(normal: image, highlighted: image, title: nil, titleColor: nil) + } + func wr_setLeftButton(title:String, titleColor:UIColor) { + wr_setLeftButton(normal: nil, highlighted: nil, title: title, titleColor: titleColor) + } + + func wr_setRightButton(normal:UIImage, highlighted:UIImage) { + wr_setRightButton(normal: normal, highlighted: highlighted, title: nil, titleColor: nil) + } + func wr_setRightButton(image:UIImage) { + wr_setRightButton(normal: image, highlighted: image, title: nil, titleColor: nil) + } + func wr_setRightButton(title:String, titleColor:UIColor) { + wr_setRightButton(normal: nil, highlighted: nil, title: title, titleColor: titleColor) + } + + + // 左右按钮私有方法 + private func wr_setLeftButton(normal:UIImage?, highlighted:UIImage?, title:String?, titleColor:UIColor?) { + leftButton.isHidden = false + leftButton.setImage(normal, for: .normal) + leftButton.setImage(highlighted, for: .highlighted) + leftButton.setTitle(title, for: .normal) + leftButton.setTitleColor(titleColor, for: .normal) + } + private func wr_setRightButton(normal:UIImage?, highlighted:UIImage?, title:String?, titleColor:UIColor?) { + rightButton.isHidden = false + rightButton.setImage(normal, for: .normal) + rightButton.setImage(highlighted, for: .highlighted) + rightButton.setTitle(title, for: .normal) + rightButton.setTitleColor(titleColor, for: .normal) + } +} + + +// MARK: - 导航栏左右按钮事件 +public extension WRCustomNavigationBar +{ + @objc func clickBack() { + if let onClickBack = onClickLeftButton { + onClickBack() + } else { + let currentVC = UIViewController.wr_currentViewController() + currentVC.wr_toLastViewController(animated: true) + } + } + @objc func clickRight() { + if let onClickRight = onClickRightButton { + onClickRight() + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRNavigationBar/WRNavigationBar.swift b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift similarity index 66% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRNavigationBar/WRNavigationBar.swift rename to WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift index 0a67f49..af120c7 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRNavigationBar/WRNavigationBar.swift +++ b/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift @@ -4,16 +4,16 @@ // // Created by wangrui on 2017/4/19. // Copyright © 2017年 wangrui. All rights reserved. - -// 超级好用!!! +// // Github地址:https://github.com/wangrui460/WRNavigationBar_swift import UIKit -extension UINavigationBar +public extension UINavigationBar { fileprivate struct AssociatedKeys { - static var backgroundView:UIView = UIView() + static var backgroundView: UIView = UIView() + static var backgroundImageView: UIImageView = UIImageView() } fileprivate var backgroundView:UIView? { @@ -28,14 +28,46 @@ extension UINavigationBar } } + fileprivate var backgroundImageView:UIImageView? { + get { + guard let bgImageView = objc_getAssociatedObject(self, &AssociatedKeys.backgroundImageView) as? UIImageView else { + return nil + } + return bgImageView + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.backgroundImageView, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + // set navigationBar backgroundImage + fileprivate func wr_setBackgroundImage(image:UIImage) + { + backgroundView?.removeFromSuperview() + backgroundView = nil + if (backgroundImageView == nil) + { + // add a image(nil color) to _UIBarBackground make it clear + setBackgroundImage(UIImage(), for: .default) + backgroundImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: Int(bounds.width), height: WRNavigationBar.navBarBottom())) + backgroundImageView?.autoresizingMask = .flexibleWidth + // _UIBarBackground is first subView for navigationBar + subviews.first?.insertSubview(backgroundImageView ?? UIImageView(), at: 0) + } + backgroundImageView?.image = image + } + // set navigationBar barTintColor fileprivate func wr_setBackgroundColor(color:UIColor) { + backgroundImageView?.removeFromSuperview() + backgroundImageView = nil if (backgroundView == nil) { // add a image(nil color) to _UIBarBackground make it clear setBackgroundImage(UIImage(), for: .default) - backgroundView = UIView(frame: CGRect(x: 0, y: 0, width: Int(bounds.width), height: 64)) + backgroundView = UIView(frame: CGRect(x: 0, y: 0, width: Int(bounds.width), height: WRNavigationBar.navBarBottom())) + backgroundView?.autoresizingMask = .flexibleWidth // _UIBarBackground is first subView for navigationBar subviews.first?.insertSubview(backgroundView ?? UIView(), at: 0) } @@ -45,8 +77,17 @@ extension UINavigationBar // set _UIBarBackground alpha (_UIBarBackground subviews alpha <= _UIBarBackground alpha) fileprivate func wr_setBackgroundAlpha(alpha:CGFloat) { - let barBackgroundView = subviews[0] - barBackgroundView.alpha = alpha + if let barBackgroundView = subviews.first + { + if #available(iOS 11.0, *) + { // sometimes we can't change _UIBarBackground alpha + for view in barBackgroundView.subviews { + view.alpha = alpha + } + } else { + barBackgroundView.alpha = alpha + } + } } // 设置导航栏所有BarButtonItem的透明度 @@ -108,9 +149,8 @@ extension UINavigationBar // call swizzling methods active 主动调用交换方法 private static let onceToken = UUID().uuidString - open override class func initialize() + public static func wrAwake() { - guard self == UINavigationBar.self else { return } DispatchQueue.once(token: onceToken) { let needSwizzleSelectorArr = [ @@ -119,9 +159,10 @@ extension UINavigationBar for selector in needSwizzleSelectorArr { let str = ("wr_" + selector.description) - let originalMethod = class_getInstanceMethod(self, selector) - let swizzledMethod = class_getInstanceMethod(self, Selector(str)) - method_exchangeImplementations(originalMethod, swizzledMethod) + if let originalMethod = class_getInstanceMethod(self, selector), + let swizzledMethod = class_getInstanceMethod(self, Selector(str)) { + method_exchangeImplementations(originalMethod, swizzledMethod) + } } } } @@ -129,7 +170,7 @@ extension UINavigationBar //========================================================================== // MARK: swizzling pop //========================================================================== - func wr_setTitleTextAttributes(_ newTitleTextAttributes:[String : Any]?) + @objc func wr_setTitleTextAttributes(_ newTitleTextAttributes:[String : Any]?) { guard var attributes = newTitleTextAttributes else { return @@ -142,7 +183,7 @@ extension UINavigationBar var titleColor:UIColor? for attribute in originTitleTextAttributes { - if attribute.key == NSForegroundColorAttributeName { + if attribute.key == NSAttributedString.Key.foregroundColor { titleColor = attribute.value as? UIColor break } @@ -153,8 +194,8 @@ extension UINavigationBar return } - if attributes[NSForegroundColorAttributeName] == nil { - attributes.updateValue(originTitleColor, forKey: NSForegroundColorAttributeName) + if attributes[NSAttributedString.Key.foregroundColor.rawValue] == nil { + attributes.updateValue(originTitleColor, forKey: NSAttributedString.Key.foregroundColor.rawValue) } wr_setTitleTextAttributes(attributes) } @@ -163,10 +204,15 @@ extension UINavigationBar //========================================================================== // MARK: - UINavigationController //========================================================================== -extension UINavigationController +public extension UINavigationController { - override open var preferredStatusBarStyle: UIStatusBarStyle { - return topViewController?.statusBarStyle ?? UIColor.defaultStatusBarStyle + open override var preferredStatusBarStyle: UIStatusBarStyle { + return topViewController?.statusBarStyle ?? WRNavigationBar.defaultStatusBarStyle + } + + fileprivate func setNeedsNavigationBarUpdate(backgroundImage: UIImage) + { + navigationBar.wr_setBackgroundImage(image: backgroundImage) } fileprivate func setNeedsNavigationBarUpdate(barTintColor: UIColor) @@ -191,47 +237,46 @@ extension UINavigationController fileprivate func setNeedsNavigationBarUpdate(titleColor: UIColor) { guard let titleTextAttributes = navigationBar.titleTextAttributes else { - navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:titleColor] + navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor:titleColor] return } var newTitleTextAttributes = titleTextAttributes - newTitleTextAttributes.updateValue(titleColor, forKey: NSForegroundColorAttributeName) + newTitleTextAttributes.updateValue(titleColor, forKey: NSAttributedString.Key.foregroundColor) navigationBar.titleTextAttributes = newTitleTextAttributes } fileprivate func updateNavigationBar(fromVC: UIViewController?, toVC: UIViewController?, progress: CGFloat) { // change navBarBarTintColor - let fromBarTintColor = fromVC?.navBarBarTintColor ?? .defaultNavBarBarTintColor - let toBarTintColor = toVC?.navBarBarTintColor ?? .defaultNavBarBarTintColor - let newBarTintColor = UIColor.middleColor(fromColor: fromBarTintColor, toColor: toBarTintColor, percent: progress) + let fromBarTintColor = fromVC?.navBarBarTintColor ?? WRNavigationBar.defaultNavBarBarTintColor + let toBarTintColor = toVC?.navBarBarTintColor ?? WRNavigationBar.defaultNavBarBarTintColor + let newBarTintColor = WRNavigationBar.middleColor(fromColor: fromBarTintColor, toColor: toBarTintColor, percent: progress) setNeedsNavigationBarUpdate(barTintColor: newBarTintColor) // change navBarTintColor - let fromTintColor = fromVC?.navBarTintColor ?? .defaultNavBarTintColor - let toTintColor = toVC?.navBarTintColor ?? .defaultNavBarTintColor - let newTintColor = UIColor.middleColor(fromColor: fromTintColor, toColor: toTintColor, percent: progress) + let fromTintColor = fromVC?.navBarTintColor ?? WRNavigationBar.defaultNavBarTintColor + let toTintColor = toVC?.navBarTintColor ?? WRNavigationBar.defaultNavBarTintColor + let newTintColor = WRNavigationBar.middleColor(fromColor: fromTintColor, toColor: toTintColor, percent: progress) setNeedsNavigationBarUpdate(tintColor: newTintColor) // change navBarTitleColor - let fromTitleColor = fromVC?.navBarTitleColor ?? .defaultNavBarTitleColor - let toTitleColor = toVC?.navBarTitleColor ?? .defaultNavBarTitleColor - let newTitleColor = UIColor.middleColor(fromColor: fromTitleColor, toColor: toTitleColor, percent: progress) - setNeedsNavigationBarUpdate(titleColor: newTitleColor) +// let fromTitleColor = fromVC?.navBarTitleColor ?? WRNavigationBar.defaultNavBarTitleColor +// let toTitleColor = toVC?.navBarTitleColor ?? WRNavigationBar.defaultNavBarTitleColor +// let newTitleColor = WRNavigationBar.middleColor(fromColor: fromTitleColor, toColor: toTitleColor, percent: progress) +// setNeedsNavigationBarUpdate(titleColor: newTitleColor) // change navBar _UIBarBackground alpha - let fromBarBackgroundAlpha = fromVC?.navBarBackgroundAlpha ?? UIColor.defaultBackgroundAlpha - let toBarBackgroundAlpha = toVC?.navBarBackgroundAlpha ?? UIColor.defaultBackgroundAlpha - let newBarBackgroundAlpha = UIColor.middleAlpha(fromAlpha: fromBarBackgroundAlpha, toAlpha: toBarBackgroundAlpha, percent: progress) + let fromBarBackgroundAlpha = fromVC?.navBarBackgroundAlpha ?? WRNavigationBar.defaultBackgroundAlpha + let toBarBackgroundAlpha = toVC?.navBarBackgroundAlpha ?? WRNavigationBar.defaultBackgroundAlpha + let newBarBackgroundAlpha = WRNavigationBar.middleAlpha(fromAlpha: fromBarBackgroundAlpha, toAlpha: toBarBackgroundAlpha, percent: progress) setNeedsNavigationBarUpdate(barBackgroundAlpha: newBarBackgroundAlpha) } // call swizzling methods active 主动调用交换方法 private static let onceToken = UUID().uuidString - open override class func initialize() + public static func fatherAwake() { - guard self == UINavigationController.self else { return } DispatchQueue.once(token: onceToken) { let needSwizzleSelectorArr = [ @@ -240,13 +285,14 @@ extension UINavigationController #selector(popToRootViewController), #selector(pushViewController) ] - + for selector in needSwizzleSelectorArr { // _updateInteractiveTransition: => wr_updateInteractiveTransition: let str = ("wr_" + selector.description).replacingOccurrences(of: "__", with: "_") - let originalMethod = class_getInstanceMethod(self, selector) - let swizzledMethod = class_getInstanceMethod(self, Selector(str)) - method_exchangeImplementations(originalMethod, swizzledMethod) + if let originalMethod = class_getInstanceMethod(self, selector), + let swizzledMethod = class_getInstanceMethod(self, Selector(str)) { + method_exchangeImplementations(originalMethod, swizzledMethod) + } } } } @@ -265,12 +311,13 @@ extension UINavigationController } // swizzling system method: popToViewController - func wr_popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]? + @objc func wr_popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]? { + setNeedsNavigationBarUpdate(titleColor: viewController.navBarTitleColor) var displayLink:CADisplayLink? = CADisplayLink(target: self, selector: #selector(popNeedDisplay)) // UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响 // NSRunLoopCommonModes contains kCFRunLoopDefaultMode and UITrackingRunLoopMode - displayLink?.add(to: RunLoop.main, forMode: .commonModes) + displayLink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common) CATransaction.setCompletionBlock { displayLink?.invalidate() displayLink = nil @@ -284,10 +331,10 @@ extension UINavigationController } // swizzling system method: popToRootViewControllerAnimated - func wr_popToRootViewControllerAnimated(_ animated: Bool) -> [UIViewController]? + @objc func wr_popToRootViewControllerAnimated(_ animated: Bool) -> [UIViewController]? { var displayLink:CADisplayLink? = CADisplayLink(target: self, selector: #selector(popNeedDisplay)) - displayLink?.add(to: RunLoop.main, forMode: .commonModes) + displayLink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common) CATransaction.setCompletionBlock { displayLink?.invalidate() displayLink = nil @@ -331,10 +378,10 @@ extension UINavigationController } // swizzling system method: pushViewController - func wr_pushViewController(_ viewController: UIViewController, animated: Bool) + @objc func wr_pushViewController(_ viewController: UIViewController, animated: Bool) { var displayLink:CADisplayLink? = CADisplayLink(target: self, selector: #selector(pushNeedDisplay)) - displayLink?.add(to: RunLoop.main, forMode: .defaultRunLoopMode) + displayLink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common) CATransaction.setCompletionBlock { displayLink?.invalidate() displayLink = nil @@ -397,8 +444,8 @@ extension UINavigationController: UINavigationBarDelegate private func dealInteractionChanges(_ context: UIViewControllerTransitionCoordinatorContext) { let animations: (UITransitionContextViewControllerKey) -> () = { - let curColor = context.viewController(forKey: $0)?.navBarBarTintColor ?? UIColor.defaultNavBarBarTintColor - let curAlpha = context.viewController(forKey: $0)?.navBarBackgroundAlpha ?? UIColor.defaultBackgroundAlpha + let curColor = context.viewController(forKey: $0)?.navBarBarTintColor ?? WRNavigationBar.defaultNavBarBarTintColor + let curAlpha = context.viewController(forKey: $0)?.navBarBackgroundAlpha ?? WRNavigationBar.defaultBackgroundAlpha self.setNeedsNavigationBarUpdate(barTintColor: curColor) self.setNeedsNavigationBarUpdate(barBackgroundAlpha: curAlpha) @@ -423,7 +470,7 @@ extension UINavigationController: UINavigationBarDelegate } // swizzling system method: _updateInteractiveTransition - func wr_updateInteractiveTransition(_ percentComplete: CGFloat) + @objc func wr_updateInteractiveTransition(_ percentComplete: CGFloat) { guard let topViewController = topViewController, let coordinator = topViewController.transitionCoordinator else { @@ -442,17 +489,19 @@ extension UINavigationController: UINavigationBarDelegate //============================================================================= // MARK: - store navigationBar barTintColor and tintColor every viewController //============================================================================= -extension UIViewController +public extension UIViewController { fileprivate struct AssociatedKeys { static var pushToCurrentVCFinished: Bool = false static var pushToNextVCFinished:Bool = false - static var navBarBarTintColor: UIColor = UIColor.defaultNavBarBarTintColor + static var navBarBackgroundImage: UIImage = UIImage() + + static var navBarBarTintColor: UIColor = WRNavigationBar.defaultNavBarBarTintColor static var navBarBackgroundAlpha:CGFloat = 1.0 - static var navBarTintColor: UIColor = UIColor.defaultNavBarTintColor - static var navBarTitleColor: UIColor = UIColor.defaultNavBarTitleColor + static var navBarTintColor: UIColor = WRNavigationBar.defaultNavBarTintColor + static var navBarTitleColor: UIColor = WRNavigationBar.defaultNavBarTitleColor static var statusBarStyle: UIStatusBarStyle = UIStatusBarStyle.default static var navBarShadowImageHidden: Bool = false @@ -485,11 +534,31 @@ extension UIViewController } } + // you can set navigationBar backgroundImage + var navBarBackgroundImage: UIImage? + { + get { + guard let bgImage = objc_getAssociatedObject(self, &AssociatedKeys.navBarBackgroundImage) as? UIImage else { + return WRNavigationBar.defaultNavBarBackgroundImage + } + return bgImage + } +// set { +// if customNavBar.isKind(of: UINavigationBar.self) { +// let navBar = customNavBar as! UINavigationBar +// navBar.wr_setBackgroundImage(image: newValue!) +// } +// else { +// objc_setAssociatedObject(self, &AssociatedKeys.navBarBackgroundImage, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) +// } +// } + } + // navigationBar barTintColor var navBarBarTintColor: UIColor { get { guard let barTintColor = objc_getAssociatedObject(self, &AssociatedKeys.navBarBarTintColor) as? UIColor else { - return UIColor.defaultNavBarBarTintColor + return WRNavigationBar.defaultNavBarBarTintColor } return barTintColor } @@ -497,12 +566,11 @@ extension UIViewController objc_setAssociatedObject(self, &AssociatedKeys.navBarBarTintColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) if customNavBar.isKind(of: UINavigationBar.self) { - let navBar = customNavBar as! UINavigationBar - navBar.wr_setBackgroundColor(color: newValue) +// let navBar = customNavBar as! UINavigationBar +// navBar.wr_setBackgroundColor(color: newValue) } - else - { - if pushToCurrentVCFinished == true && pushToNextVCFinished == false { + else { + if canUpdateNavBarBarTintColorOrBackgroundAlpha == true { navigationController?.setNeedsNavigationBarUpdate(barTintColor: newValue) } } @@ -521,23 +589,32 @@ extension UIViewController objc_setAssociatedObject(self, &AssociatedKeys.navBarBackgroundAlpha, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) if customNavBar.isKind(of: UINavigationBar.self) { - let navBar = customNavBar as! UINavigationBar - navBar.wr_setBackgroundAlpha(alpha: newValue) +// let navBar = customNavBar as! UINavigationBar +// navBar.wr_setBackgroundAlpha(alpha: newValue) } - else - { - if pushToCurrentVCFinished == true && pushToNextVCFinished == false { + else { + if canUpdateNavBarBarTintColorOrBackgroundAlpha == true { navigationController?.setNeedsNavigationBarUpdate(barBackgroundAlpha: newValue) } } } } + private var canUpdateNavBarBarTintColorOrBackgroundAlpha:Bool { + get { + let isRootViewController = self.navigationController?.viewControllers.first == self + if (pushToCurrentVCFinished == true || isRootViewController == true) && pushToNextVCFinished == false { + return true + } else { + return false + } + } + } // navigationBar tintColor var navBarTintColor: UIColor { get { guard let tintColor = objc_getAssociatedObject(self, &AssociatedKeys.navBarTintColor) as? UIColor else { - return UIColor.defaultNavBarTintColor + return WRNavigationBar.defaultNavBarTintColor } return tintColor } @@ -545,8 +622,8 @@ extension UIViewController objc_setAssociatedObject(self, &AssociatedKeys.navBarTintColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) if customNavBar.isKind(of: UINavigationBar.self) { - let navBar = customNavBar as! UINavigationBar - navBar.tintColor = newValue +// let navBar = customNavBar as! UINavigationBar +// navBar.tintColor = newValue } else { @@ -561,7 +638,7 @@ extension UIViewController var navBarTitleColor: UIColor { get { guard let titleColor = objc_getAssociatedObject(self, &AssociatedKeys.navBarTitleColor) as? UIColor else { - return UIColor.defaultNavBarTitleColor + return WRNavigationBar.defaultNavBarTitleColor } return titleColor } @@ -569,8 +646,8 @@ extension UIViewController objc_setAssociatedObject(self, &AssociatedKeys.navBarTitleColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) if customNavBar.isKind(of: UINavigationBar.self) { - let navBar = customNavBar as! UINavigationBar - navBar.titleTextAttributes = [NSForegroundColorAttributeName:newValue] +// let navBar = customNavBar as! UINavigationBar +// navBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor:newValue] } else { @@ -585,7 +662,7 @@ extension UIViewController var statusBarStyle: UIStatusBarStyle { get { guard let style = objc_getAssociatedObject(self, &AssociatedKeys.statusBarStyle) as? UIStatusBarStyle else { - return UIColor.defaultStatusBarStyle + return WRNavigationBar.defaultStatusBarStyle } return style } @@ -599,7 +676,7 @@ extension UIViewController var navBarShadowImageHidden:Bool { get { guard let isHidden = objc_getAssociatedObject(self, &AssociatedKeys.navBarShadowImageHidden) as? Bool else { - return UIColor.defaultShadowImageHidden + return WRNavigationBar.defaultShadowImageHidden } return isHidden } @@ -624,12 +701,8 @@ extension UIViewController // swizzling two system methods: viewWillAppear(_:) and viewWillDisappear(_:) private static let onceToken = UUID().uuidString - open override class func initialize() + @objc public static func wrAwake() { - guard self == UIViewController.self else { - return - } - DispatchQueue.once(token: onceToken) { let needSwizzleSelectors = [ @@ -637,40 +710,72 @@ extension UIViewController #selector(viewWillDisappear(_:)), #selector(viewDidAppear(_:)) ] - + for selector in needSwizzleSelectors { let newSelectorStr = "wr_" + selector.description - let originalMethod = class_getInstanceMethod(self, selector) - let swizzledMethod = class_getInstanceMethod(self, Selector(newSelectorStr)) - method_exchangeImplementations(originalMethod, swizzledMethod) + if let originalMethod = class_getInstanceMethod(self, selector), + let swizzledMethod = class_getInstanceMethod(self, Selector(newSelectorStr)) { + method_exchangeImplementations(originalMethod, swizzledMethod) + } } } } - func wr_viewWillAppear(_ animated: Bool) + @objc func wr_viewWillAppear(_ animated: Bool) { - pushToNextVCFinished = false - navigationController?.setNeedsNavigationBarUpdate(tintColor: navBarTintColor) - navigationController?.setNeedsNavigationBarUpdate(titleColor: navBarTitleColor) + if canUpdateNavigationBar() == true { + pushToNextVCFinished = false + navigationController?.setNeedsNavigationBarUpdate(tintColor: navBarTintColor) + navigationController?.setNeedsNavigationBarUpdate(titleColor: navBarTitleColor) + } wr_viewWillAppear(animated) } - func wr_viewWillDisappear(_ animated: Bool) + @objc func wr_viewWillDisappear(_ animated: Bool) { - pushToNextVCFinished = true + if canUpdateNavigationBar() == true { + pushToNextVCFinished = true + } wr_viewWillDisappear(animated) } - func wr_viewDidAppear(_ animated: Bool) + @objc func wr_viewDidAppear(_ animated: Bool) { - navigationController?.setNeedsNavigationBarUpdate(barTintColor: navBarBarTintColor) - navigationController?.setNeedsNavigationBarUpdate(barBackgroundAlpha: navBarBackgroundAlpha) - navigationController?.setNeedsNavigationBarUpdate(tintColor: navBarTintColor) - navigationController?.setNeedsNavigationBarUpdate(titleColor: navBarTitleColor) - navigationController?.setNeedsNavigationBarUpdate(hideShadowImage: navBarShadowImageHidden) + + if self.navigationController?.viewControllers.first != self { + self.pushToCurrentVCFinished = true + } + if canUpdateNavigationBar() == true + { + if let navBarBgImage = navBarBackgroundImage { + navigationController?.setNeedsNavigationBarUpdate(backgroundImage: navBarBgImage) + } else { + navigationController?.setNeedsNavigationBarUpdate(barTintColor: navBarBarTintColor) + } + navigationController?.setNeedsNavigationBarUpdate(barBackgroundAlpha: navBarBackgroundAlpha) + navigationController?.setNeedsNavigationBarUpdate(tintColor: navBarTintColor) + navigationController?.setNeedsNavigationBarUpdate(titleColor: navBarTitleColor) + navigationController?.setNeedsNavigationBarUpdate(hideShadowImage: navBarShadowImageHidden) + } wr_viewDidAppear(animated) } + + func canUpdateNavigationBar() -> Bool + { + let viewFrame = view.frame + let maxFrame = UIScreen.main.bounds + let middleFrame = CGRect(x: 0, y: WRNavigationBar.navBarBottom(), width: WRNavigationBar.screenWidth(), height: WRNavigationBar.screenHeight()-WRNavigationBar.navBarBottom()) + let minFrame = CGRect(x: 0, y: WRNavigationBar.navBarBottom(), width: WRNavigationBar.screenWidth(), height: WRNavigationBar.screenHeight()-WRNavigationBar.navBarBottom()-WRNavigationBar.tabBarHeight()) + // 蝙蝠🦇 + let isBat = viewFrame.equalTo(maxFrame) || viewFrame.equalTo(middleFrame) || viewFrame.equalTo(minFrame) + if self.navigationController != nil && isBat == true { + return true + } else { + return false + } + } + } //==================================================================================== @@ -701,17 +806,19 @@ extension DispatchQueue { //=========================================================================================== // MARK: - default navigationBar barTintColor、tintColor and statusBarStyle YOU CAN CHANGE!!! //=========================================================================================== -extension UIColor +public class WRNavigationBar { fileprivate struct AssociatedKeys { // default is system attributes static var defNavBarBarTintColor: UIColor = UIColor.white + static var defNavBarBackgroundImage: UIImage = UIImage() static var defNavBarTintColor: UIColor = UIColor(red: 0, green: 0.478431, blue: 1, alpha: 1.0) static var defNavBarTitleColor: UIColor = UIColor.black static var defStatusBarStyle: UIStatusBarStyle = UIStatusBarStyle.default static var defShadowImageHidden: Bool = false } - class var defaultNavBarBarTintColor: UIColor { + + public class var defaultNavBarBarTintColor: UIColor { get { guard let def = objc_getAssociatedObject(self, &AssociatedKeys.defNavBarBarTintColor) as? UIColor else { return AssociatedKeys.defNavBarBarTintColor @@ -723,7 +830,19 @@ extension UIColor } } - class var defaultNavBarTintColor: UIColor { + public class var defaultNavBarBackgroundImage: UIImage? { + get { + guard let def = objc_getAssociatedObject(self, &AssociatedKeys.defNavBarBackgroundImage) as? UIImage else { + return nil + } + return def + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.defNavBarBackgroundImage, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + public class var defaultNavBarTintColor: UIColor { get { guard let def = objc_getAssociatedObject(self, &AssociatedKeys.defNavBarTintColor) as? UIColor else { return AssociatedKeys.defNavBarTintColor @@ -735,7 +854,7 @@ extension UIColor } } - class var defaultNavBarTitleColor: UIColor { + public class var defaultNavBarTitleColor: UIColor { get { guard let def = objc_getAssociatedObject(self, &AssociatedKeys.defNavBarTitleColor) as? UIColor else { return AssociatedKeys.defNavBarTitleColor @@ -747,7 +866,7 @@ extension UIColor } } - class var defaultStatusBarStyle: UIStatusBarStyle { + public class var defaultStatusBarStyle: UIStatusBarStyle { get { guard let def = objc_getAssociatedObject(self, &AssociatedKeys.defStatusBarStyle) as? UIStatusBarStyle else { return .default @@ -759,7 +878,7 @@ extension UIColor } } - class var defaultShadowImageHidden: Bool { + public class var defaultShadowImageHidden: Bool { get { guard let def = objc_getAssociatedObject(self, &AssociatedKeys.defShadowImageHidden) as? Bool else { return false @@ -771,7 +890,7 @@ extension UIColor } } - class var defaultBackgroundAlpha: CGFloat { + public class var defaultBackgroundAlpha: CGFloat { get { return 1.0 } @@ -810,8 +929,68 @@ extension UIColor } } +public extension WRNavigationBar +{ + class func isIphoneX() -> Bool { + return UIScreen.main.bounds.equalTo(CGRect(x: 0, y: 0, width: 375, height: 812)) + } + class func navBarBottom() -> Int { + return self.isIphoneX() ? 88 : 64; + } + class func tabBarHeight() -> Int { + return self.isIphoneX() ? 83 : 49; + } + class func screenWidth() -> Int { + return Int(UIScreen.main.bounds.size.width) + } + class func screenHeight() -> Int { + return Int(UIScreen.main.bounds.size.height) + } +} + + + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +class NothingToSeeHere +{ + static func harmlessFunction(){ +// let typeCount = Int(objc_getClassList(nil, 0)) +// let types = UnsafeMutablePointer.allocate(capacity: typeCount) +// let autoreleaseintTypes = AutoreleasingUnsafeMutablePointer(types) +// objc_getClassList(autoreleaseintTypes, Int32(typeCount)) //获取所有的类 +// for index in 0 ..< typeCount { +// (types[index] as? WRAwakeProtocol.Type)?.wrAwake() //如果该类实现了SelfAware协议,那么调用 awake 方法 +// (types[index] as? WRFatherAwakeProtocol.Type)?.fatherAwake() +// } +// types.deallocate(capacity: typeCount) + UINavigationBar.wrAwake() + UIViewController.wrAwake() + UINavigationController.fatherAwake() + } +} + +// 2. 让APP启动时只执行一次 harmlessFunction 方法 +extension UIApplication +{ + private static let runOnce:Void = { //使用静态属性以保证只调用一次(该属性是个方法) + NothingToSeeHere.harmlessFunction() + }() + + open override var next: UIResponder?{ //重写next属性 + UIApplication.runOnce + return super.next + } +} + +// 3. 自定义类实现 WRAwakeProtocol 协议,重写 wrAwake 方法 +// 自定义类实现 WRFatherAwakeProtocol 协议,重写 fatherAwake 方法 + + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj b/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj index e95347e..c704f36 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj +++ b/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj @@ -7,13 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + 12C6C44F21F023DA0001D33E /* WRCycleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44B21F023DA0001D33E /* WRCycleScrollView.swift */; }; + 12C6C45021F023DA0001D33E /* WRProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44C21F023DA0001D33E /* WRProxy.swift */; }; + 12C6C45121F023DA0001D33E /* WRPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44D21F023DA0001D33E /* WRPageControl.swift */; }; + 12C6C45221F023DA0001D33E /* WRCycleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44E21F023DA0001D33E /* WRCycleCell.swift */; }; 1A09DC171F0535A40046E853 /* NoEndlessController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC161F0535A40046E853 /* NoEndlessController.swift */; }; 1A09DC191F0536A20046E853 /* NoPageControlController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC181F0536A20046E853 /* NoPageControlController.swift */; }; - 1A09DC1C1F05396F0046E853 /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC1B1F05396F0046E853 /* WRNavigationBar.swift */; }; 1A09DC1E1F05431B0046E853 /* ZhiHuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC1D1F05431B0046E853 /* ZhiHuController.swift */; }; 1A5D14121EFA3B6A00FD1F5F /* StoryBoardController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A5D14111EFA3B6A00FD1F5F /* StoryBoardController.storyboard */; }; 1A5D14141EFA3FA700FD1F5F /* SBController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A5D14131EFA3FA700FD1F5F /* SBController.swift */; }; - 1A9DD0531ECA078000533BE9 /* WRProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9DD0521ECA078000533BE9 /* WRProxy.swift */; }; 1AC097B51EC58670000F7206 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097B41EC58670000F7206 /* AppDelegate.swift */; }; 1AC097B71EC58670000F7206 /* LocalImgController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097B61EC58670000F7206 /* LocalImgController.swift */; }; 1AC097BC1EC58670000F7206 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1AC097BB1EC58670000F7206 /* Assets.xcassets */; }; @@ -21,9 +23,6 @@ 1AC097CA1EC58670000F7206 /* WRCycleScrollViewDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097C91EC58670000F7206 /* WRCycleScrollViewDemoTests.swift */; }; 1AC097D51EC5ADB4000F7206 /* DemoListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097D41EC5ADB4000F7206 /* DemoListController.swift */; }; 1AC097D71EC5B2E9000F7206 /* ServerImgController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097D61EC5B2E9000F7206 /* ServerImgController.swift */; }; - 1AC097DA1EC5BAB8000F7206 /* WRCycleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097D91EC5BAB8000F7206 /* WRCycleCell.swift */; }; - 1AC097DC1EC5BAF1000F7206 /* WRCycleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097DB1EC5BAF1000F7206 /* WRCycleScrollView.swift */; }; - 3425F3501FBAC6AF000666C8 /* WRPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3425F34F1FBAC6AF000666C8 /* WRPageControl.swift */; }; 3425F3521FBAE049000666C8 /* CustomDotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3425F3511FBAE049000666C8 /* CustomDotController.swift */; }; 3425F3541FBAECCE000666C8 /* StandaloneDotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3425F3531FBAECCE000666C8 /* StandaloneDotController.swift */; }; FF78CC64A5D22B4B3B0104A1 /* Pods_WRCycleScrollViewDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78F99DB515338C31DDC6F59E /* Pods_WRCycleScrollViewDemo.framework */; }; @@ -40,13 +39,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 12C6C44B21F023DA0001D33E /* WRCycleScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRCycleScrollView.swift; path = ../../../WRCycleScrollView/WRCycleScrollView.swift; sourceTree = ""; }; + 12C6C44C21F023DA0001D33E /* WRProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRProxy.swift; path = ../../../WRCycleScrollView/WRProxy.swift; sourceTree = ""; }; + 12C6C44D21F023DA0001D33E /* WRPageControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRPageControl.swift; path = ../../../WRCycleScrollView/WRPageControl.swift; sourceTree = ""; }; + 12C6C44E21F023DA0001D33E /* WRCycleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRCycleCell.swift; path = ../../../WRCycleScrollView/WRCycleCell.swift; sourceTree = ""; }; 1A09DC161F0535A40046E853 /* NoEndlessController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoEndlessController.swift; sourceTree = ""; }; 1A09DC181F0536A20046E853 /* NoPageControlController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoPageControlController.swift; sourceTree = ""; }; - 1A09DC1B1F05396F0046E853 /* WRNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WRNavigationBar.swift; sourceTree = ""; }; 1A09DC1D1F05431B0046E853 /* ZhiHuController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZhiHuController.swift; sourceTree = ""; }; 1A5D14111EFA3B6A00FD1F5F /* StoryBoardController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = StoryBoardController.storyboard; sourceTree = ""; }; 1A5D14131EFA3FA700FD1F5F /* SBController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SBController.swift; sourceTree = ""; }; - 1A9DD0521ECA078000533BE9 /* WRProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WRProxy.swift; sourceTree = ""; }; 1AC097B11EC58670000F7206 /* WRCycleScrollViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WRCycleScrollViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1AC097B41EC58670000F7206 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1AC097B61EC58670000F7206 /* LocalImgController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalImgController.swift; sourceTree = ""; }; @@ -58,9 +59,6 @@ 1AC097CB1EC58670000F7206 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1AC097D41EC5ADB4000F7206 /* DemoListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoListController.swift; sourceTree = ""; }; 1AC097D61EC5B2E9000F7206 /* ServerImgController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerImgController.swift; sourceTree = ""; }; - 1AC097D91EC5BAB8000F7206 /* WRCycleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WRCycleCell.swift; sourceTree = ""; }; - 1AC097DB1EC5BAF1000F7206 /* WRCycleScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WRCycleScrollView.swift; sourceTree = ""; }; - 3425F34F1FBAC6AF000666C8 /* WRPageControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WRPageControl.swift; sourceTree = ""; }; 3425F3511FBAE049000666C8 /* CustomDotController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDotController.swift; sourceTree = ""; }; 3425F3531FBAECCE000666C8 /* StandaloneDotController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandaloneDotController.swift; sourceTree = ""; }; 78F99DB515338C31DDC6F59E /* Pods_WRCycleScrollViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WRCycleScrollViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -87,12 +85,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1A09DC1A1F05396F0046E853 /* WRNavigationBar */ = { + 12C6C44A21F023C80001D33E /* WRCycleScrollView */ = { isa = PBXGroup; children = ( - 1A09DC1B1F05396F0046E853 /* WRNavigationBar.swift */, + 12C6C44E21F023DA0001D33E /* WRCycleCell.swift */, + 12C6C44B21F023DA0001D33E /* WRCycleScrollView.swift */, + 12C6C44D21F023DA0001D33E /* WRPageControl.swift */, + 12C6C44C21F023DA0001D33E /* WRProxy.swift */, ); - path = WRNavigationBar; + path = WRCycleScrollView; sourceTree = ""; }; 1AC097A81EC58670000F7206 = { @@ -118,9 +119,8 @@ 1AC097B31EC58670000F7206 /* WRCycleScrollViewDemo */ = { isa = PBXGroup; children = ( - 1A09DC1A1F05396F0046E853 /* WRNavigationBar */, + 12C6C44A21F023C80001D33E /* WRCycleScrollView */, 1AC097B41EC58670000F7206 /* AppDelegate.swift */, - 1AC097D81EC5B929000F7206 /* WRCycleScrollView */, 1AC097D41EC5ADB4000F7206 /* DemoListController.swift */, 1AC097B61EC58670000F7206 /* LocalImgController.swift */, 1AC097D61EC5B2E9000F7206 /* ServerImgController.swift */, @@ -147,17 +147,6 @@ path = WRCycleScrollViewDemoTests; sourceTree = ""; }; - 1AC097D81EC5B929000F7206 /* WRCycleScrollView */ = { - isa = PBXGroup; - children = ( - 1AC097D91EC5BAB8000F7206 /* WRCycleCell.swift */, - 1AC097DB1EC5BAF1000F7206 /* WRCycleScrollView.swift */, - 1A9DD0521ECA078000533BE9 /* WRProxy.swift */, - 3425F34F1FBAC6AF000666C8 /* WRPageControl.swift */, - ); - path = WRCycleScrollView; - sourceTree = ""; - }; 236F58F6AC6ABB96E39A2765 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -187,7 +176,6 @@ 1AC097AE1EC58670000F7206 /* Frameworks */, 1AC097AF1EC58670000F7206 /* Resources */, 3BAA828292BFB6653889EF22 /* [CP] Embed Pods Frameworks */, - FC3127A1E3F7ABA9E1E56FD3 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -228,12 +216,12 @@ TargetAttributes = { 1AC097B01EC58670000F7206 = { CreatedOnToolsVersion = 8.1; - DevelopmentTeam = 652U6LDTX4; + DevelopmentTeam = P3X2725LYY; ProvisioningStyle = Automatic; }; 1AC097C41EC58670000F7206 = { CreatedOnToolsVersion = 8.1; - DevelopmentTeam = 652U6LDTX4; + DevelopmentTeam = P3X2725LYY; ProvisioningStyle = Automatic; TestTargetID = 1AC097B01EC58670000F7206; }; @@ -285,9 +273,14 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework", + "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WRNavigationBar_swift.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -300,28 +293,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-WRCycleScrollViewDemo-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"; - showEnvVarsInLog = 0; - }; - FC3127A1E3F7ABA9E1E56FD3 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh\"\n"; + 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 */ @@ -331,21 +312,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3425F3501FBAC6AF000666C8 /* WRPageControl.swift in Sources */, 1AC097D71EC5B2E9000F7206 /* ServerImgController.swift in Sources */, 3425F3521FBAE049000666C8 /* CustomDotController.swift in Sources */, 1AC097D51EC5ADB4000F7206 /* DemoListController.swift in Sources */, 3425F3541FBAECCE000666C8 /* StandaloneDotController.swift in Sources */, - 1A09DC1C1F05396F0046E853 /* WRNavigationBar.swift in Sources */, + 12C6C45221F023DA0001D33E /* WRCycleCell.swift in Sources */, 1AC097B71EC58670000F7206 /* LocalImgController.swift in Sources */, - 1AC097DC1EC5BAF1000F7206 /* WRCycleScrollView.swift in Sources */, 1AC097B51EC58670000F7206 /* AppDelegate.swift in Sources */, - 1AC097DA1EC5BAB8000F7206 /* WRCycleCell.swift in Sources */, 1A09DC191F0536A20046E853 /* NoPageControlController.swift in Sources */, 1A09DC1E1F05431B0046E853 /* ZhiHuController.swift in Sources */, + 12C6C45021F023DA0001D33E /* WRProxy.swift in Sources */, + 12C6C44F21F023DA0001D33E /* WRCycleScrollView.swift in Sources */, + 12C6C45121F023DA0001D33E /* WRPageControl.swift in Sources */, 1A5D14141EFA3FA700FD1F5F /* SBController.swift in Sources */, 1A09DC171F0535A40046E853 /* NoEndlessController.swift in Sources */, - 1A9DD0531ECA078000533BE9 /* WRProxy.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -425,6 +405,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -467,6 +448,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -478,13 +460,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - DEVELOPMENT_TEAM = 652U6LDTX4; + DEVELOPMENT_TEAM = P3X2725LYY; INFOPLIST_FILE = WRCycleScrollViewDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; }; name = Debug; }; @@ -494,13 +476,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - DEVELOPMENT_TEAM = 652U6LDTX4; + DEVELOPMENT_TEAM = P3X2725LYY; INFOPLIST_FILE = WRCycleScrollViewDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; }; name = Release; }; @@ -509,12 +491,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = 652U6LDTX4; + DEVELOPMENT_TEAM = P3X2725LYY; INFOPLIST_FILE = WRCycleScrollViewDemoTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemoTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WRCycleScrollViewDemo.app/WRCycleScrollViewDemo"; }; name = Debug; @@ -524,12 +506,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = 652U6LDTX4; + DEVELOPMENT_TEAM = P3X2725LYY; INFOPLIST_FILE = WRCycleScrollViewDemoTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemoTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WRCycleScrollViewDemo.app/WRCycleScrollViewDemo"; }; name = Release; diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift index 6066be1..e695298 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift +++ b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift @@ -8,6 +8,7 @@ // Github地址:https://github.com/wangrui460/WRCycleScrollView import UIKit +import WRNavigationBar_swift let MainNavBarColor = UIColor.init(red: 0/255.0, green: 175/255.0, blue: 240/255.0, alpha: 1) let kScreenWidth = UIScreen.main.bounds.width @@ -21,7 +22,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow.init(frame: UIScreen.main.bounds) @@ -38,10 +39,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate func setNavBarAppearence() { - UIColor.defaultStatusBarStyle = .lightContent - UIColor.defaultNavBarTintColor = UIColor.white - UIColor.defaultNavBarBarTintColor = MainNavBarColor - UIColor.defaultNavBarTitleColor = UIColor.white + WRNavigationBar.defaultStatusBarStyle = .lightContent + WRNavigationBar.defaultNavBarTintColor = UIColor.white + WRNavigationBar.defaultNavBarBarTintColor = MainNavBarColor + WRNavigationBar.defaultNavBarTitleColor = UIColor.white } } @@ -49,7 +50,7 @@ class BaseNavigationController: UINavigationController { override func pushViewController(_ viewController: UIViewController, animated: Bool) { - if childViewControllers.count > 0 { + if children.count > 0 { viewController.hidesBottomBarWhenPushed = true } super.pushViewController(viewController, animated: animated) diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleCell.swift b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleCell.swift deleted file mode 100644 index 26256aa..0000000 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleCell.swift +++ /dev/null @@ -1,158 +0,0 @@ -// -// WRCycleCell.swift -// WRCycleScrollViewDemo -// -// Created by wangrui on 2017/5/12. -// Copyright © 2017年 wangrui. All rights reserved. -// -// Github地址:https://github.com/wangrui460/WRCycleScrollView - -import UIKit -import Kingfisher - -class WRCycleCell: UICollectionViewCell -{ - //======================================================= - // MARK: 对外提供的属性 - //======================================================= - var imgSource:ImgSource = ImgSource.LOCAL(name: "placeholder") { - didSet { - switch imgSource { - case let .SERVER(url): - imgView.kf.setImage(with: url) - case let .LOCAL(name): - imgView.image = UIImage(named: name) - } - } - } - - var placeholderImage: UIImage? - - var descText:String? { - didSet { - descLabel.isHidden = (descText == nil) ? true : false - bottomView.isHidden = (descText == nil) ? true : false - descLabel.text = descText - } - } - - override var frame: CGRect { - didSet { - bounds.size = frame.size - } - } - - var imageContentModel:UIViewContentMode = .scaleAspectFill { - didSet { - imgView.contentMode = imageContentModel - } - } - - var descLabelFont: UIFont = UIFont(name: "Helvetica-Bold", size: 18)! { - didSet { - descLabel.font = descLabelFont - } - } - var descLabelTextColor: UIColor = UIColor.white { - didSet { - descLabel.textColor = descLabelTextColor - } - } - var descLabelHeight: CGFloat = 60 { - didSet { - descLabel.frame.size.height = descLabelHeight - } - } - var descLabelTextAlignment:NSTextAlignment = .left { - didSet { - descLabel.textAlignment = descLabelTextAlignment - } - } - var bottomViewBackgroundColor: UIColor = UIColor.black.withAlphaComponent(0.5) { - didSet { - bottomView.backgroundColor = bottomViewBackgroundColor - } - } - - //======================================================= - // MARK: 内部属性 - //======================================================= - fileprivate var imgView:UIImageView! - fileprivate var descLabel:UILabel! - fileprivate var bottomView:UIView! - - //======================================================= - // MARK: 构造方法 - //======================================================= - override init(frame: CGRect) - { - super.init(frame: frame) - backgroundColor = UIColor.white - setupImgView() - setupDescLabel() - setupBottomView() - } - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - deinit { - print("WRCycleCell deinit") - } - - - //======================================================= - // MARK: 内部方法(layoutSubviews) - //======================================================= - override func layoutSubviews() - { - super.layoutSubviews() - imgView.frame = self.bounds - - if let _ = descText - { - let margin:CGFloat = 16 - let labelWidth = imgView.bounds.width - 2 * margin - let labelHeight = descLabelHeight - let labelY = bounds.height - labelHeight - descLabel.frame = CGRect(x: margin, y: labelY, width: labelWidth, height: labelHeight) - bottomView.frame = CGRect(x: 0, y: labelY, width: imgView.bounds.width, height: labelHeight) - bringSubview(toFront: descLabel) - } - } -} - -//======================================================= -// MARK: - 基本控件(图片、描述文字、底部view) -//======================================================= -extension WRCycleCell -{ - fileprivate func setupImgView() - { - imgView = UIImageView() - imgView.contentMode = imageContentModel - imgView.clipsToBounds = true - addSubview(imgView) - } - - fileprivate func setupDescLabel() - { - descLabel = UILabel() - descLabel.text = descText - descLabel.numberOfLines = 0 - descLabel.font = descLabelFont - descLabel.textColor = descLabelTextColor - descLabel.frame.size.height = descLabelHeight - descLabel.textAlignment = descLabelTextAlignment - addSubview(descLabel) - descLabel.isHidden = true - } - - fileprivate func setupBottomView() - { - bottomView = UIView() - bottomView.backgroundColor = bottomViewBackgroundColor - addSubview(bottomView) - bottomView.isHidden = true - } -} - diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleScrollView.swift b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleScrollView.swift deleted file mode 100644 index dfaa5f7..0000000 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRCycleScrollView.swift +++ /dev/null @@ -1,407 +0,0 @@ -// -// WRCycleScrollView.swift -// WRCycleScrollViewDemo -// -// Created by wangrui on 2017/5/12. -// Copyright © 2017年 wangrui. All rights reserved. -// -// Github地址:https://github.com/wangrui460/WRCycleScrollView - -import UIKit - - -@objc protocol WRCycleScrollViewDelegate -{ - /// 点击图片回调 - @objc optional func cycleScrollViewDidSelect(at index:Int, cycleScrollView:WRCycleScrollView) - /// 图片滚动回调 - @objc optional func cycleScrollViewDidScroll(to index:Int, cycleScrollView:WRCycleScrollView) -} - -class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtocol -{ - - //======================================================= - // MARK: 对外提供的属性 - //======================================================= - weak var delegate:WRCycleScrollViewDelegate? - - var outerPageControlFrame:CGRect? { - didSet { - setupPageControl() - } - } - - /// 数据相关 - var imgsType:ImgType = .SERVER - var localImgArray :[String]? { - didSet { - if let local = localImgArray { - proxy = Proxy(type: .LOCAL, array: local) - reloadData() - } - } - } - var serverImgArray:[String]? { - didSet { - if let server = serverImgArray { - proxy = Proxy(type: .SERVER, array: server) - reloadData() - } - } - } - var descTextArray :[String]? - var placeholderImage: UIImage? - - /// WRCycleCell相关 - var imageContentModel: UIViewContentMode? - var descLabelFont: UIFont? - var descLabelTextColor: UIColor? - var descLabelHeight: CGFloat? - var descLabelTextAlignment:NSTextAlignment? - var bottomViewBackgroundColor: UIColor? - - /// 主要功能需求相关 - override var frame: CGRect { - didSet { - flowLayout?.itemSize = frame.size - collectionView?.frame = bounds - } - } - var isAutoScroll:Bool = true { - didSet { - timer?.invalidate() - timer = nil - if isAutoScroll == true { - setupTimer() - } - } - } - var isEndlessScroll:Bool = true { - didSet { - reloadData() - } - } - var autoScrollInterval: Double = 1.5 - - /// pageControl相关 - var pageControlAliment: PageControlAliment = .CenterBottom - var defaultPageDotImage: UIImage? { - didSet { - setupPageControl() - } - } - var currentPageDotImage: UIImage? { - didSet { - setupPageControl() - } - } - var pageControlPointSpace: CGFloat = 15 { - didSet { - setupPageControl() - } - } - var showPageControl: Bool = true { - didSet { - setupPageControl() - } - } - var currentDotColor: UIColor = UIColor.orange { - didSet { - self.pageControl?.currentPageIndicatorTintColor = currentDotColor - } - } - var otherDotColor: UIColor = UIColor.gray { - didSet { - self.pageControl?.pageIndicatorTintColor = otherDotColor - } - } - - //======================================================= - // MARK: 对外提供的方法 - //======================================================= - func reloadData() - { - timer?.invalidate() - timer = nil - collectionView?.reloadData() - - setupPageControl() - if canChangeCycleCell == true { - changeToFirstCycleCell(animated: false, collectionView: collectionView!) - } - if isAutoScroll == true { - setupTimer() - } - guard let pageControl = self.pageControl else { - return - } - - if showPageControl == true { - if let outFrame = outerPageControlFrame { - self.relayoutPageControl(pageControl: pageControl, outerFrame: outFrame) - } else { - self.relayoutPageControl(pageControl: pageControl) - } - } - } - - - //======================================================= - // MARK: 内部属性 - //======================================================= - let endlessScrollTimes:Int = 128 - fileprivate var imgsCount:Int { - return (isEndlessScroll == true) ? (itemsInSection / endlessScrollTimes) : itemsInSection - } - var itemsInSection:Int { - guard let imgs = proxy?.imgArray else { - return 0 - } - return (isEndlessScroll == true) ? (imgs.count * endlessScrollTimes) : imgs.count - } - fileprivate var firstItem:Int { - return (isEndlessScroll == true) ? (itemsInSection / 2) : 0 - } - fileprivate var canChangeCycleCell:Bool { - guard itemsInSection != 0 , - let _ = collectionView, - let _ = flowLayout else { - return false - } - return true - } - fileprivate var indexOnPageControl:Int { - var curIndex = Int((collectionView!.contentOffset.x + flowLayout!.itemSize.width * 0.5) / flowLayout!.itemSize.width) - curIndex = max(0, curIndex) - return curIndex % imgsCount - } - fileprivate var proxy:Proxy! - fileprivate var flowLayout:UICollectionViewFlowLayout? - fileprivate var collectionView:UICollectionView? - fileprivate let CellID = "WRCycleCell" - fileprivate var pageControl:WRPageControl? - var timer:Timer? - // 标识子控件是否布局完成,布局完成后在layoutSubviews方法中就不执行 changeToFirstCycleCell 方法 - fileprivate var isLoadOver = false - - - //======================================================= - // MARK: 构造方法 - //======================================================= - /// 构造方法 - /// - /// - Parameters: - /// - frame: frame - /// - type: ImagesType default:Server - /// - imgs: localImgArray / serverImgArray default:nil - /// - descs: descTextArray default:nil - init(frame: CGRect, type:ImgType = .SERVER, imgs:[String]? = nil, descs:[String]? = nil, defaultDotImage:UIImage? = nil, currentDotImage:UIImage? = nil, placeholderImage:UIImage? = nil) - { - super.init(frame: frame) - setupCollectionView() - defaultPageDotImage = defaultDotImage - currentPageDotImage = currentDotImage - self.placeholderImage = placeholderImage - imgsType = type - if imgsType == .SERVER { - if let server = imgs { - proxy = Proxy(type: .SERVER, array: server) - } - } - else { - if let local = imgs { - proxy = Proxy(type: .LOCAL, array: local) - } - } - - if let descTexts = descs { - descTextArray = descTexts - } - reloadData() - } - - required init?(coder aDecoder: NSCoder) { - // 支持StoryBoard创建 - super.init(coder: aDecoder) - self.setupCollectionView() - } - - deinit { - collectionView?.delegate = nil - print("WRCycleScrollView deinit") - } - - //======================================================= - // MARK: 内部方法(layoutSubviews、willMove) - //======================================================= - override func layoutSubviews() - { - super.layoutSubviews() - // 解决WRCycleCell自动偏移问题 - collectionView?.contentInset = .zero - if isLoadOver == false && canChangeCycleCell == true { - changeToFirstCycleCell(animated: false, collectionView: collectionView!) - } - - guard let pageControl = self.pageControl else { - return - } - - if showPageControl == true { - if let outFrame = outerPageControlFrame { - self.relayoutPageControl(pageControl: pageControl, outerFrame: outFrame) - } else { - self.relayoutPageControl(pageControl: pageControl) - } - } - } - - override func willMove(toSuperview newSuperview: UIView?) - { // 解决定时器导致的循环引用 - super.willMove(toSuperview: newSuperview) - // 展现的时候newSuper不为nil,离开的时候newSuper为nil - guard let _ = newSuperview else { - timer?.invalidate() - timer = nil - return - } - } -} - -//======================================================= -// MARK: - 定时器、自动滚动、scrollView代理方法 -//======================================================= -extension WRCycleScrollView -{ - func setupTimer() - { - timer = Timer(timeInterval: autoScrollInterval, target: self, selector: #selector(autoChangeCycleCell), userInfo: nil, repeats: true) - RunLoop.main.add(timer!, forMode: .commonModes) - } - - func autoChangeCycleCell() - { - if canChangeCycleCell == true { - changeCycleCell(collectionView: collectionView!) - } - } - - func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { - timer?.invalidate() - } - - func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) - { - if isAutoScroll == true { - setupTimer() - } - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - scrollViewDidEndScrollingAnimation(scrollView) - } - - func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) - { - guard canChangeCycleCell else { - return - } - delegate?.cycleScrollViewDidScroll?(to: indexOnPageControl, cycleScrollView: self) - - if indexOnPageControl >= firstItem { - isLoadOver = true - } - } - - func scrollViewDidScroll(_ scrollView: UIScrollView) - { - guard canChangeCycleCell else { - return - } - pageControl?.currentPage = indexOnPageControl - } -} - -//======================================================= -// MARK: - pageControl页面 -//======================================================= -extension WRCycleScrollView -{ - fileprivate func setupPageControl() - { - pageControl?.removeFromSuperview() - if showPageControl == true - { - pageControl = WRPageControl(frame: CGRect.zero, currentImage: currentPageDotImage, defaultImage: defaultPageDotImage) - pageControl?.numberOfPages = imgsCount - pageControl?.hidesForSinglePage = true - pageControl?.currentPageIndicatorTintColor = self.currentDotColor - pageControl?.pageIndicatorTintColor = self.otherDotColor - pageControl?.isUserInteractionEnabled = false - pageControl?.pointSpace = pageControlPointSpace - - if let _ = outerPageControlFrame { - superview?.addSubview(pageControl!) - } else { - addSubview(pageControl!) - } - } - } -} - -//======================================================= -// MARK: - WRCycleCell 相关 -//======================================================= -extension WRCycleScrollView: UICollectionViewDelegate,UICollectionViewDataSource -{ - fileprivate func setupCollectionView() - { - flowLayout = UICollectionViewFlowLayout() - flowLayout?.itemSize = frame.size - flowLayout?.minimumLineSpacing = 0 - flowLayout?.scrollDirection = .horizontal - - collectionView = UICollectionView(frame: bounds, collectionViewLayout: flowLayout!) - collectionView?.register(WRCycleCell.self, forCellWithReuseIdentifier: CellID) - collectionView?.isPagingEnabled = true - collectionView?.bounces = false - collectionView?.showsVerticalScrollIndicator = false - collectionView?.showsHorizontalScrollIndicator = false - collectionView?.delegate = self - collectionView?.dataSource = self - addSubview(collectionView!) - } - - public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int - { - return itemsInSection - } - - public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell - { - let curIndex = indexPath.item % imgsCount - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellID, for: indexPath) as! WRCycleCell - cell.placeholderImage = placeholderImage - cell.imgSource = proxy[curIndex] - cell.descText = descTextArray?[curIndex] - - if let _ = descTextArray - { - cell.imageContentModel = (imageContentModel == nil) ? cell.imageContentModel : imageContentModel! - cell.descLabelFont = (descLabelFont == nil) ? cell.descLabelFont : descLabelFont! - cell.descLabelTextColor = (descLabelTextColor == nil) ? cell.descLabelTextColor : descLabelTextColor! - cell.descLabelHeight = (descLabelHeight == nil) ? cell.descLabelHeight : descLabelHeight! - cell.descLabelTextAlignment = (descLabelTextAlignment == nil) ? cell.descLabelTextAlignment : descLabelTextAlignment! - cell.bottomViewBackgroundColor = (bottomViewBackgroundColor == nil) ? cell.bottomViewBackgroundColor : bottomViewBackgroundColor! - } - return cell - } - - public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) - { - delegate?.cycleScrollViewDidSelect?(at: indexOnPageControl, cycleScrollView: self) - } -} - - diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRPageControl.swift b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRPageControl.swift deleted file mode 100644 index 4c6208f..0000000 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRPageControl.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// WRPageControl.swift -// WRCycleScrollViewDemo -// -// Created by itwangrui on 2017/11/14. -// Copyright © 2017年 wangrui. All rights reserved. -// - -import UIKit - -private let WRPageControlPointWidth: CGFloat = 7 -private let WRPageControlPointHeight: CGFloat = 20 - -class WRPageControl: UIPageControl -{ - var currentImage: UIImage? - var defaultImage: UIImage? - var pointSpace: CGFloat = 15 - var pageSize: CGSize { - get { - if let curImage = currentImage, let defImage = defaultImage { - let pageH = curImage.size.height - let defDotW = defImage.size.width - let curDotW = curImage.size.width - let pageW = CGFloat(numberOfPages - 1) * (pointSpace + defDotW + defDotW) + curDotW - return CGSize(width: pageW, height: pageH) - } - else { - let pageW = CGFloat(numberOfPages - 1) * (pointSpace + WRPageControlPointWidth) + WRPageControlPointWidth - return CGSize(width: pageW, height: WRPageControlPointHeight) - } - } - } - - override var currentPage: Int { - didSet { - updatePageControl() - } - } - - init(frame: CGRect, currentImage: UIImage?, defaultImage: UIImage?) - { - super.init(frame: frame) - self.currentImage = currentImage - self.defaultImage = defaultImage - } - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - - -// MARK: - update index -extension WRPageControl -{ - func updatePageControl() - { - for index in 0.. CGSize - { - var newSize = CGSize(width: 0, height: 0) - if let curImage = currentImage, let defImage = defaultImage { - if currentIndex == currentPage { - newSize = curImage.size - } else { - newSize = defImage.size - } - } else { - newSize = CGSize(width: WRPageControlPointWidth, height: WRPageControlPointWidth) - } - return newSize - } -} - - diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRProxy.swift b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRProxy.swift deleted file mode 100644 index 7a2424b..0000000 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/WRCycleScrollView/WRProxy.swift +++ /dev/null @@ -1,195 +0,0 @@ -// -// WRProxy.swift -// WRCycleScrollViewDemo -// -// Created by wangrui on 2017/5/15. -// Copyright © 2017年 wangrui. All rights reserved. -// - -import UIKit - -///////////////////////////////////////////////////////////////////////////// -// MARK: 数据 相关 -///////////////////////////////////////////////////////////////////////////// - -// 图片资源 -enum ImgSource { - case SERVER(url:URL) - case LOCAL(name:String) -} - -// 图片类型 -enum ImgType:Int { - case SERVER = 0 // default - case LOCAL = 1 -} - -struct Proxy -{ - var imgType:ImgType = .SERVER - var imgArray:[ImgSource] = [ImgSource]() - - // 下标法获取imgArray中对应索引的ImgSource eg: proxy[0] == imgArray[0] - subscript (index:Int) -> ImgSource { - get { - return imgArray[index] - } - } - - // 构造方法 - init(type:ImgType, array:[String]) - { - imgType = type - if imgType == .SERVER - { - imgArray = array.map({ (urlStr) -> ImgSource in - return ImgSource.SERVER(url: URL(string: urlStr)!) - }) - } - else - { - imgArray = array.map({ (name) -> ImgSource in - return ImgSource.LOCAL(name: name) - }) - } - } -} - - -///////////////////////////////////////////////////////////////////////////// -// MARK: pageControl 相关 -///////////////////////////////////////////////////////////////////////////// - -private let WRPageControlMargin: CGFloat = 15 -private let WRPageControlPointWidth: CGFloat = 2 - -enum PageControlAliment { - case CenterBottom - case RightBottom - case LeftBottom -} - -protocol PageControlAlimentProtocol -{ - // Property in protocol must have explicit { get } or { get set } specifier - var pageControlAliment: PageControlAliment { get set } - var pageControlPointSpace: CGFloat { get set } - func relayoutPageControl(pageControl: WRPageControl) - func relayoutPageControl(pageControl: WRPageControl, outerFrame:CGRect) -} - -extension PageControlAlimentProtocol where Self : UIView -{ // TODO: 等待优化 - func relayoutPageControl(pageControl: WRPageControl) - { - if pageControl.isHidden == false - { - let pageH:CGFloat = 20//pageControl.pageSize.height - let pageY = bounds.height - pageH - let pageW = pageControl.pageSize.width - var pageX:CGFloat = 0 - - switch self.pageControlAliment { - case .CenterBottom: - pageX = CGFloat(self.bounds.width / 2) - pageW * 0.5 - case .RightBottom: - pageX = bounds.width - pageW - WRPageControlMargin - case .LeftBottom: - pageX = bounds.origin.x + WRPageControlMargin - } - pageControl.frame = CGRect(x:pageX, y:pageY, width:pageW, height:pageH) - } - } - func relayoutPageControl(pageControl: WRPageControl, outerFrame:CGRect) - { - if pageControl.isHidden == false { - pageControl.frame = CGRect(x:outerFrame.origin.x, y:outerFrame.origin.y, width:pageControl.pageSize.width, height:pageControl.pageSize.height) - } - } -} - - -///////////////////////////////////////////////////////////////////////////// -// MARK: 无限轮播 相关 -///////////////////////////////////////////////////////////////////////////// - -protocol EndlessScrollProtocol -{ - ///////////////////////////////// - /// 是否自动滚动 - var isAutoScroll: Bool { get set } - /// 自动滚动的时间间隔 - var autoScrollInterval: Double { get set } - /// 用于自动滚动的定时器 - var timer:Timer? { get set } - - ///////////////////////////////// - /// 是否无限轮播 - var isEndlessScroll: Bool { get set } - /// 无线轮播中,一组图片最多轮播多少次 - var endlessScrollTimes: Int { get } - /// 真实的cell数量 - var itemsInSection: Int { get } - - /** 设置定时器,用于自动滚动 */ - func setupTimer() - - /** 滚动到第一个cell (在无限轮播中就是中间的那个cell) */ - func changeToFirstCycleCell(animated: Bool, collectionView: UICollectionView) -} - -extension EndlessScrollProtocol where Self : UIView -{ - func changeCycleCell(collectionView: UICollectionView) - { - guard itemsInSection != 0 else { - return - } - - let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout - let curItem = Int(collectionView.contentOffset.x / flowLayout.itemSize.width) - if curItem == itemsInSection - 1 - { - let animated = (isEndlessScroll == true) ? false : true - changeToFirstCycleCell(animated: animated, collectionView: collectionView) - } - else - { - let indexPath = IndexPath(item: curItem + 1, section: 0) - collectionView.scrollToItem(at: indexPath, at: .init(rawValue: 0), animated: true) - } - } - - func changeToFirstCycleCell(animated: Bool, collectionView: UICollectionView) - { - guard itemsInSection != 0 else { - return - } - - let firstItem = (isEndlessScroll == true) ? (itemsInSection / 2) : 0 - let indexPath = IndexPath(item: firstItem, section: 0) - collectionView.scrollToItem(at: indexPath, at: .init(rawValue: 0), animated: animated) - } -} - - - - - - - - - - - - - - - - - - - - - - diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift index 1ae8cb5..6044d45 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift +++ b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift @@ -18,7 +18,7 @@ class ZhiHuController: UIViewController { lazy var tableView:UITableView = { let table:UITableView = UITableView(frame: CGRect.init(x: 0, y: 0, width: Int(kScreenWidth), height: Int(self.view.bounds.height)), style: .plain) - table.contentInset = UIEdgeInsetsMake(IMAGE_HEIGHT-CGFloat(kNavBarBottom), 0, 0, 0); + table.contentInset = UIEdgeInsets(top: IMAGE_HEIGHT-CGFloat(kNavBarBottom), left: 0, bottom: 0, right: 0); table.showsVerticalScrollIndicator = false table.delegate = self table.dataSource = self From 2b81dc048f84a557ea6a332d804b1aa1fbb9ddde Mon Sep 17 00:00:00 2001 From: EyreFree Date: Thu, 17 Jan 2019 11:49:03 +0800 Subject: [PATCH 2/5] Wrap with CocoaPods --- .gitignore | 58 +- .travis.yml | 14 + Example/Podfile | 12 + .../Podfile.lock | 9 +- .../Pods/Kingfisher/LICENSE | 0 .../Pods/Kingfisher/README.md | 0 .../Sources/AnimatedImageView.swift | 0 .../Pods/Kingfisher/Sources/Box.swift | 0 .../Kingfisher/Sources/CacheSerializer.swift | 0 .../Pods/Kingfisher/Sources/Filter.swift | 0 .../FormatIndicatedCacheSerializer.swift | 0 .../Pods/Kingfisher/Sources/Image.swift | 0 .../Pods/Kingfisher/Sources/ImageCache.swift | 0 .../Kingfisher/Sources/ImageDownloader.swift | 0 .../Kingfisher/Sources/ImageModifier.swift | 0 .../Kingfisher/Sources/ImagePrefetcher.swift | 0 .../Kingfisher/Sources/ImageProcessor.swift | 0 .../Kingfisher/Sources/ImageTransition.swift | 0 .../Sources/ImageView+Kingfisher.swift | 0 .../Pods/Kingfisher/Sources/Indicator.swift | 0 .../Pods/Kingfisher/Sources/Kingfisher.h | 0 .../Pods/Kingfisher/Sources/Kingfisher.swift | 0 .../Sources/KingfisherManager.swift | 0 .../Sources/KingfisherOptionsInfo.swift | 0 .../Pods/Kingfisher/Sources/Placeholder.swift | 0 .../Kingfisher/Sources/RequestModifier.swift | 0 .../Pods/Kingfisher/Sources/Resource.swift | 0 .../Pods/Kingfisher/Sources/String+MD5.swift | 0 .../Kingfisher/Sources/ThreadHelper.swift | 0 .../Sources/UIButton+Kingfisher.swift | 0 .../WRCycleScrollView.podspec.json | 28 + .../WRNavigationBar_swift.podspec.json | 0 .../Pods/Manifest.lock | 9 +- .../Pods/Pods.xcodeproj/project.pbxproj | 841 +++++++++++++----- .../Kingfisher/Info.plist | 0 .../Kingfisher/Kingfisher-dummy.m | 0 .../Kingfisher/Kingfisher-prefix.pch | 0 .../Kingfisher/Kingfisher-umbrella.h | 0 .../Kingfisher/Kingfisher.modulemap | 0 .../Kingfisher/Kingfisher.xcconfig | 0 .../Info.plist | 0 ...rollView_Example-acknowledgements.markdown | 25 + ...eScrollView_Example-acknowledgements.plist | 31 + .../Pods-WRCycleScrollView_Example-dummy.m | 5 + ...ds-WRCycleScrollView_Example-frameworks.sh | 2 + ...ods-WRCycleScrollView_Example-resources.sh | 0 .../Pods-WRCycleScrollView_Example-umbrella.h | 16 + ...s-WRCycleScrollView_Example.debug.xcconfig | 6 +- .../Pods-WRCycleScrollView_Example.modulemap | 6 + ...WRCycleScrollView_Example.release.xcconfig | 6 +- .../Pods-WRCycleScrollView_Tests/Info.plist | 26 + ...ScrollView_Tests-acknowledgements.markdown | 3 + ...cleScrollView_Tests-acknowledgements.plist | 29 + .../Pods-WRCycleScrollView_Tests-dummy.m | 5 + ...Pods-WRCycleScrollView_Tests-frameworks.sh | 146 +++ .../Pods-WRCycleScrollView_Tests-resources.sh | 118 +++ .../Pods-WRCycleScrollView_Tests-umbrella.h | 16 + ...ods-WRCycleScrollView_Tests.debug.xcconfig | 8 + .../Pods-WRCycleScrollView_Tests.modulemap | 6 + ...s-WRCycleScrollView_Tests.release.xcconfig | 8 + .../WRCycleScrollView}/Info.plist | 0 .../WRCycleScrollView-dummy.m | 5 + .../WRCycleScrollView-prefix.pch | 0 .../WRCycleScrollView-umbrella.h | 4 +- .../WRCycleScrollView.modulemap | 6 + .../WRCycleScrollView.xcconfig | 10 + .../WRNavigationBar_swift/Info.plist | 26 + .../WRNavigationBar_swift-dummy.m | 0 .../WRNavigationBar_swift-prefix.pch | 12 + .../WRNavigationBar_swift-umbrella.h | 0 .../WRNavigationBar_swift.modulemap | 0 .../WRNavigationBar_swift.xcconfig | 0 .../Pods/WRNavigationBar_swift/LICENSE | 0 .../Pods/WRNavigationBar_swift/README.md | 0 .../Classes/WRCustomNavigationBar.swift | 0 .../Classes/WRNavigationBar.swift | 0 .../Tests}/Info.plist | 2 + .../Tests/Tests.swift | 16 +- .../project.pbxproj | 622 +++++++++++++ .../contents.xcworkspacedata | 2 +- .../WRCycleScrollView-Example.xcscheme | 117 +++ .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../WRCycleScrollView}/AppDelegate.swift | 8 +- .../Base.lproj/LaunchScreen.xib | 46 + .../Base.lproj/Main.storyboard | 25 +- .../CustomDotController.swift | 1 + .../DemoListController.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/wr@2x.png | Bin .../AppIcon.appiconset/wr@3x.png | Bin .../Images.xcassets}/Contents.json | 0 .../Images.xcassets}/dot/Contents.json | 0 .../dot/currentDot.imageset/Contents.json | 0 .../slider_current_dot.png | Bin .../slider_current_dot@2x.png | Bin .../slider_current_dot@3x.png | Bin .../dot/defaultDot.imageset/Contents.json | 0 .../slider_default_dot.png | Bin .../slider_default_dot@2x.png | Bin .../slider_default_dot@3x.png | Bin .../image11.imageset/Contents.json | 0 .../image11.imageset/image11.png | Bin .../image12.imageset/Contents.json | 0 .../image12.imageset/image12.jpg | Bin .../image13.imageset/Contents.json | 0 .../image13.imageset/image13.png | Bin .../image14.imageset/Contents.json | 0 .../image14.imageset/image14.jpg | Bin .../image15.imageset/Contents.json | 0 .../image15.imageset/image15.jpg | Bin .../Images.xcassets}/localImg1.imageset/1.png | Bin .../localImg1.imageset/Contents.json | 0 .../localImg10.imageset/Contents.json | 0 .../localImg10.imageset/localImg10.jpg | Bin .../Images.xcassets}/localImg2.imageset/2.png | Bin .../localImg2.imageset/Contents.json | 0 .../Images.xcassets}/localImg3.imageset/3.png | Bin .../localImg3.imageset/Contents.json | 0 .../Images.xcassets}/localImg4.imageset/4.png | Bin .../localImg4.imageset/Contents.json | 0 .../Images.xcassets}/localImg5.imageset/5.png | Bin .../localImg5.imageset/Contents.json | 0 .../Images.xcassets}/localImg6.imageset/6.jpg | Bin .../localImg6.imageset/Contents.json | 0 .../localImg7.imageset/Contents.json | 0 .../localImg7.imageset/localImg7.jpg | Bin .../localImg8.imageset/Contents.json | 0 .../localImg8.imageset/localImg8.jpg | Bin .../localImg9.imageset/Contents.json | 0 .../localImg9.imageset/localImg9.jpg | Bin .../placeholder/Contents.json | 0 .../Contents.json | 0 .../placeholder_720x360@2x.png | Bin .../placeholder_720x360@3x.png | Bin .../WRCycleScrollView}/Info.plist | 26 +- .../LocalImgController.swift | 1 + .../NoEndlessController.swift | 1 + .../NoPageControlController.swift | 1 + .../WRCycleScrollView}/SBController.swift | 1 + .../ServerImgController.swift | 1 + .../StandaloneDotController.swift | 1 + .../StoryBoardController.storyboard | 11 +- .../WRCycleScrollView/ViewController.swift | 24 + .../WRCycleScrollView}/ZhiHuController.swift | 1 + WRCycleScrollView.podspec | 23 + WRCycleScrollView/Assets/.gitkeep | 0 WRCycleScrollView/Classes/.gitkeep | 0 .../{ => Classes}/WRCycleCell.swift | 8 +- .../{ => Classes}/WRCycleScrollView.swift | 72 +- .../{ => Classes}/WRPageControl.swift | 6 +- WRCycleScrollView/{ => Classes}/WRProxy.swift | 16 +- WRCycleScrollViewDemo/Podfile | 21 - .../Pods-WRCycleScrollViewDemo-dummy.m | 5 - .../Pods-WRCycleScrollViewDemo.modulemap | 6 - .../project.pbxproj | 552 ------------ .../LaunchImage.launchimage/Contents.json | 49 - _Pods.xcodeproj | 1 + 158 files changed, 2146 insertions(+), 1018 deletions(-) create mode 100644 .travis.yml create mode 100644 Example/Podfile rename {WRCycleScrollViewDemo => Example}/Podfile.lock (72%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/LICENSE (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/README.md (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/AnimatedImageView.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Box.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/CacheSerializer.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Filter.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Image.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImageCache.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImageDownloader.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImageModifier.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImagePrefetcher.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImageProcessor.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImageTransition.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Indicator.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Kingfisher.h (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Kingfisher.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/KingfisherManager.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Placeholder.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/RequestModifier.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/Resource.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/String+MD5.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/ThreadHelper.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift (100%) create mode 100644 Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json rename {WRCycleScrollViewDemo => Example}/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Manifest.lock (72%) rename {WRCycleScrollViewDemo => Example}/Pods/Pods.xcodeproj/project.pbxproj (54%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/Kingfisher/Info.plist (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig (100%) rename {WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example}/Info.plist (100%) rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.markdown (68%) rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.plist (72%) create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-dummy.m rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-frameworks.sh (97%) rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-resources.sh (100%) create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-umbrella.h rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.debug.xcconfig (65%) create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.modulemap rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig => Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.release.xcconfig (65%) create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.release.xcconfig rename {WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift => Example/Pods/Target Support Files/WRCycleScrollView}/Info.plist (100%) create mode 100644 Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-dummy.m rename WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch => Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-prefix.pch (100%) rename WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-umbrella.h => Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-umbrella.h (57%) create mode 100644 Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.modulemap create mode 100644 Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig create mode 100644 Example/Pods/Target Support Files/WRNavigationBar_swift/Info.plist rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m (100%) create mode 100644 Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap (100%) rename {WRCycleScrollViewDemo => Example}/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig (100%) rename {WRCycleScrollViewDemo => Example}/Pods/WRNavigationBar_swift/LICENSE (100%) rename {WRCycleScrollViewDemo => Example}/Pods/WRNavigationBar_swift/README.md (100%) rename {WRCycleScrollViewDemo => Example}/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift (100%) rename {WRCycleScrollViewDemo => Example}/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemoTests => Example/Tests}/Info.plist (92%) rename WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/WRCycleScrollViewDemoTests.swift => Example/Tests/Tests.swift (63%) create mode 100644 Example/WRCycleScrollView.xcodeproj/project.pbxproj rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj => Example/WRCycleScrollView.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (65%) create mode 100644 Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace => Example/WRCycleScrollView.xcworkspace}/contents.xcworkspacedata (75%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace => Example/WRCycleScrollView.xcworkspace}/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/AppDelegate.swift (97%) create mode 100644 Example/WRCycleScrollView/Base.lproj/LaunchScreen.xib rename WRCycleScrollViewDemo/WRCycleScrollViewDemo/Base.lproj/LaunchScreen.storyboard => Example/WRCycleScrollView/Base.lproj/Main.storyboard (57%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/CustomDotController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/DemoListController.swift (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/AppIcon.appiconset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/AppIcon.appiconset/wr@2x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/AppIcon.appiconset/wr@3x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/currentDot.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/currentDot.imageset/slider_current_dot.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/currentDot.imageset/slider_current_dot@2x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/currentDot.imageset/slider_current_dot@3x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/defaultDot.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/defaultDot.imageset/slider_default_dot.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/defaultDot.imageset/slider_default_dot@2x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/dot/defaultDot.imageset/slider_default_dot@3x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image11.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image11.imageset/image11.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image12.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image12.imageset/image12.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image13.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image13.imageset/image13.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image14.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image14.imageset/image14.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image15.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/image15.imageset/image15.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg1.imageset/1.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg1.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg10.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg10.imageset/localImg10.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg2.imageset/2.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg2.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg3.imageset/3.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg3.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg4.imageset/4.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg4.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg5.imageset/5.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg5.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg6.imageset/6.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg6.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg7.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg7.imageset/localImg7.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg8.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg8.imageset/localImg8.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg9.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/localImg9.imageset/localImg9.jpg (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/placeholder/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/placeholder/placeholder_720x360.imageset/Contents.json (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/placeholder/placeholder_720x360.imageset/placeholder_720x360@2x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets => Example/WRCycleScrollView/Images.xcassets}/placeholder/placeholder_720x360.imageset/placeholder_720x360@3x.png (100%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/Info.plist (72%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/LocalImgController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/NoEndlessController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/NoPageControlController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/SBController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/ServerImgController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/StandaloneDotController.swift (98%) rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/StoryBoardController.storyboard (83%) create mode 100644 Example/WRCycleScrollView/ViewController.swift rename {WRCycleScrollViewDemo/WRCycleScrollViewDemo => Example/WRCycleScrollView}/ZhiHuController.swift (99%) create mode 100644 WRCycleScrollView.podspec create mode 100644 WRCycleScrollView/Assets/.gitkeep create mode 100644 WRCycleScrollView/Classes/.gitkeep rename WRCycleScrollView/{ => Classes}/WRCycleCell.swift (96%) rename WRCycleScrollView/{ => Classes}/WRCycleScrollView.swift (86%) rename WRCycleScrollView/{ => Classes}/WRPageControl.swift (96%) rename WRCycleScrollView/{ => Classes}/WRProxy.swift (94%) delete mode 100644 WRCycleScrollViewDemo/Podfile delete mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-dummy.m delete mode 100644 WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap delete mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj delete mode 100644 WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json create mode 120000 _Pods.xcodeproj diff --git a/.gitignore b/.gitignore index 2c22487..93c86d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,8 @@ -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore +# OS X +.DS_Store -## Build generated +# Xcode build/ -DerivedData/ - -## Various settings *.pbxuser !default.pbxuser *.mode1v3 @@ -16,50 +12,26 @@ DerivedData/ *.perspectivev3 !default.perspectivev3 xcuserdata/ - -## Other +*.xccheckout +profile *.moved-aside -*.xcuserstate - -## Obj-C/Swift specific +DerivedData *.hmap *.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -.build/ +# Bundler +.bundle -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ - -# Carthage -# # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build -# fastlane +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Note: if you ignore the Pods directory, make sure to uncomment +# `pod install` in .travis.yml # -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md - -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output +# Pods/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7fdd937 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +# references: +# * https://www.objc.io/issues/6-build-tools/travis-ci/ +# * https://github.com/supermarin/xcpretty#usage + +osx_image: xcode7.3 +language: objective-c +# cache: cocoapods +# podfile: Example/Podfile +# before_install: +# - gem install cocoapods # Since Travis is not always on latest version +# - pod install --project-directory=Example +script: +- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/WRCycleScrollView.xcworkspace -scheme WRCycleScrollView-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty +- pod lib lint diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..2960977 --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,12 @@ +use_frameworks! + +target 'WRCycleScrollView_Example' do + pod 'WRCycleScrollView', :path => '../' + pod 'WRNavigationBar_swift', :git => 'https://github.com/EFRenovation/WRNavigationBar_swift.git' + + target 'WRCycleScrollView_Tests' do + inherit! :search_paths + + + end +end diff --git a/WRCycleScrollViewDemo/Podfile.lock b/Example/Podfile.lock similarity index 72% rename from WRCycleScrollViewDemo/Podfile.lock rename to Example/Podfile.lock index 9d9feb4..6ca67f4 100644 --- a/WRCycleScrollViewDemo/Podfile.lock +++ b/Example/Podfile.lock @@ -1,9 +1,11 @@ PODS: - Kingfisher (4.10.1) + - WRCycleScrollView (0.1.0): + - Kingfisher (>= 4.10.0) - WRNavigationBar_swift (0.1.0) DEPENDENCIES: - - Kingfisher (= 4.10.1) + - WRCycleScrollView (from `../`) - WRNavigationBar_swift (from `https://github.com/EFRenovation/WRNavigationBar_swift.git`) SPEC REPOS: @@ -11,6 +13,8 @@ SPEC REPOS: - Kingfisher EXTERNAL SOURCES: + WRCycleScrollView: + :path: "../" WRNavigationBar_swift: :git: https://github.com/EFRenovation/WRNavigationBar_swift.git @@ -21,8 +25,9 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0 + WRCycleScrollView: d3d873ee075ca797056721d0286df967994df7f2 WRNavigationBar_swift: b49ca280deb24616af40abae09d8ec593e75ac64 -PODFILE CHECKSUM: e877ef69660efc780bee4089dade3acd6a65a80c +PODFILE CHECKSUM: 82eeaaada13c975b714571f2566f79f73d39841f COCOAPODS: 1.5.3 diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE b/Example/Pods/Kingfisher/LICENSE similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/LICENSE rename to Example/Pods/Kingfisher/LICENSE diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/README.md b/Example/Pods/Kingfisher/README.md similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/README.md rename to Example/Pods/Kingfisher/README.md diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/AnimatedImageView.swift b/Example/Pods/Kingfisher/Sources/AnimatedImageView.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/AnimatedImageView.swift rename to Example/Pods/Kingfisher/Sources/AnimatedImageView.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Box.swift b/Example/Pods/Kingfisher/Sources/Box.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Box.swift rename to Example/Pods/Kingfisher/Sources/Box.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/CacheSerializer.swift b/Example/Pods/Kingfisher/Sources/CacheSerializer.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/CacheSerializer.swift rename to Example/Pods/Kingfisher/Sources/CacheSerializer.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Filter.swift b/Example/Pods/Kingfisher/Sources/Filter.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Filter.swift rename to Example/Pods/Kingfisher/Sources/Filter.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift b/Example/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift rename to Example/Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Image.swift b/Example/Pods/Kingfisher/Sources/Image.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Image.swift rename to Example/Pods/Kingfisher/Sources/Image.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageCache.swift b/Example/Pods/Kingfisher/Sources/ImageCache.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageCache.swift rename to Example/Pods/Kingfisher/Sources/ImageCache.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageDownloader.swift b/Example/Pods/Kingfisher/Sources/ImageDownloader.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageDownloader.swift rename to Example/Pods/Kingfisher/Sources/ImageDownloader.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageModifier.swift b/Example/Pods/Kingfisher/Sources/ImageModifier.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageModifier.swift rename to Example/Pods/Kingfisher/Sources/ImageModifier.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImagePrefetcher.swift b/Example/Pods/Kingfisher/Sources/ImagePrefetcher.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImagePrefetcher.swift rename to Example/Pods/Kingfisher/Sources/ImagePrefetcher.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageProcessor.swift b/Example/Pods/Kingfisher/Sources/ImageProcessor.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageProcessor.swift rename to Example/Pods/Kingfisher/Sources/ImageProcessor.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageTransition.swift b/Example/Pods/Kingfisher/Sources/ImageTransition.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageTransition.swift rename to Example/Pods/Kingfisher/Sources/ImageTransition.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift b/Example/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift rename to Example/Pods/Kingfisher/Sources/ImageView+Kingfisher.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Indicator.swift b/Example/Pods/Kingfisher/Sources/Indicator.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Indicator.swift rename to Example/Pods/Kingfisher/Sources/Indicator.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.h b/Example/Pods/Kingfisher/Sources/Kingfisher.h similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.h rename to Example/Pods/Kingfisher/Sources/Kingfisher.h diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.swift b/Example/Pods/Kingfisher/Sources/Kingfisher.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Kingfisher.swift rename to Example/Pods/Kingfisher/Sources/Kingfisher.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherManager.swift b/Example/Pods/Kingfisher/Sources/KingfisherManager.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherManager.swift rename to Example/Pods/Kingfisher/Sources/KingfisherManager.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift b/Example/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift rename to Example/Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Placeholder.swift b/Example/Pods/Kingfisher/Sources/Placeholder.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Placeholder.swift rename to Example/Pods/Kingfisher/Sources/Placeholder.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/RequestModifier.swift b/Example/Pods/Kingfisher/Sources/RequestModifier.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/RequestModifier.swift rename to Example/Pods/Kingfisher/Sources/RequestModifier.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Resource.swift b/Example/Pods/Kingfisher/Sources/Resource.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/Resource.swift rename to Example/Pods/Kingfisher/Sources/Resource.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/String+MD5.swift b/Example/Pods/Kingfisher/Sources/String+MD5.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/String+MD5.swift rename to Example/Pods/Kingfisher/Sources/String+MD5.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ThreadHelper.swift b/Example/Pods/Kingfisher/Sources/ThreadHelper.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/ThreadHelper.swift rename to Example/Pods/Kingfisher/Sources/ThreadHelper.swift diff --git a/WRCycleScrollViewDemo/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift b/Example/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift rename to Example/Pods/Kingfisher/Sources/UIButton+Kingfisher.swift diff --git a/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json b/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json new file mode 100644 index 0000000..bc63a40 --- /dev/null +++ b/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json @@ -0,0 +1,28 @@ +{ + "name": "WRCycleScrollView", + "version": "0.1.0", + "summary": "A cycle scroll view in Swift.", + "description": "'WRCycleScrollView, the only cycle scroll view you need in iOS.'", + "homepage": "https://github.com/wangrui460/WRCycleScrollView", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "wangrui460": "wangruidev@gmail.com" + }, + "source": { + "git": "https://github.com/wangrui460/WRCycleScrollView.git", + "tag": "0.1.0" + }, + "swift_version": "4.2", + "platforms": { + "ios": "8.0" + }, + "source_files": "WRCycleScrollView/Classes/**/*", + "dependencies": { + "Kingfisher": [ + ">= 4.10.0" + ] + } +} diff --git a/WRCycleScrollViewDemo/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json b/Example/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json similarity index 100% rename from WRCycleScrollViewDemo/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json rename to Example/Pods/Local Podspecs/WRNavigationBar_swift.podspec.json diff --git a/WRCycleScrollViewDemo/Pods/Manifest.lock b/Example/Pods/Manifest.lock similarity index 72% rename from WRCycleScrollViewDemo/Pods/Manifest.lock rename to Example/Pods/Manifest.lock index 9d9feb4..6ca67f4 100644 --- a/WRCycleScrollViewDemo/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,9 +1,11 @@ PODS: - Kingfisher (4.10.1) + - WRCycleScrollView (0.1.0): + - Kingfisher (>= 4.10.0) - WRNavigationBar_swift (0.1.0) DEPENDENCIES: - - Kingfisher (= 4.10.1) + - WRCycleScrollView (from `../`) - WRNavigationBar_swift (from `https://github.com/EFRenovation/WRNavigationBar_swift.git`) SPEC REPOS: @@ -11,6 +13,8 @@ SPEC REPOS: - Kingfisher EXTERNAL SOURCES: + WRCycleScrollView: + :path: "../" WRNavigationBar_swift: :git: https://github.com/EFRenovation/WRNavigationBar_swift.git @@ -21,8 +25,9 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0 + WRCycleScrollView: d3d873ee075ca797056721d0286df967994df7f2 WRNavigationBar_swift: b49ca280deb24616af40abae09d8ec593e75ac64 -PODFILE CHECKSUM: e877ef69660efc780bee4089dade3acd6a65a80c +PODFILE CHECKSUM: 82eeaaada13c975b714571f2566f79f73d39841f COCOAPODS: 1.5.3 diff --git a/WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj similarity index 54% rename from WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj rename to Example/Pods/Pods.xcodeproj/project.pbxproj index 001ee2f..49e9c1f 100644 --- a/WRCycleScrollViewDemo/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -9,122 +9,189 @@ /* Begin PBXBuildFile section */ 0096C6816AC3D92834AB65C49518C177 /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */; }; 03E0A134F1DDF33EA16F004F1A230CA1 /* FormatIndicatedCacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */; }; + 0A5C34E6A97D7B296F4BF125B02996FF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; 103228D906B112AA75562E8B17179127 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */; }; 114397DE4A2DC0204868A79F4BE13769 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A1419F008FE1993459210F31E14AE /* Filter.swift */; }; - 1A46E04D326B224412B9B9EC4A23B611 /* Pods-WRCycleScrollViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA495AEC0E5B0E946D5D98D55C3CFA7F /* Pods-WRCycleScrollViewDemo-dummy.m */; }; 2283375C0C99789CF47EEDA0CE9D3D80 /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */; }; + 285FCDD948223F8C39746DBB34F5764E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; 2ABE0F8940C00BD429E33ED7F7C9EA1D /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */; }; - 2F07303D654FD044F366E213D63ED6D5 /* WRNavigationBar_swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 32BD5E726818CAA61F34A00C07BC0D33 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; + 339B55D5AAEF2FF1608FC5B9B527C652 /* WRCustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */; }; 3464228E4F1F63DBCA803CC848A6A8C0 /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */; }; - 403E3E170DCF269D5CBA1C530ECA901B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; + 403E3E170DCF269D5CBA1C530ECA901B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; 4074AA6F2557EF7970DEDE67B04433B6 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */; }; 498DC29155467AC093701C1AF5EE3807 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */; }; 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6438B3A2CEACB4D724E0BC8762F909B4 /* WRCustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */; }; + 55DB31F4733D4E7D77EDC907C671974A /* WRProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A468A27AF802EF198A8FBA0459DC352C /* WRProxy.swift */; }; 6486781D756A9D71FE5C6E56CC9A343F /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */; }; - 79D243A74336D282DFD51E88B45EF085 /* WRNavigationBar_swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */; }; + 6A79B7FA2452A885E59C1E9C8D27B825 /* WRCycleScrollView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 448686418F732BDCFE92016A655A2D8F /* WRCycleScrollView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C6EB20F66C724EECC0ADF8E44A5828F /* Pods-WRCycleScrollView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BAD8B551B86EF819D7F92E0AF3007E4 /* Pods-WRCycleScrollView_Tests-dummy.m */; }; 7B2A61E55C43E9B12E5B7DD852456AEE /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */; }; - 82252AC9595554C901DACEFD19E2A9E0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */; }; - 84CF440A4E3CCDEE93FA2475748A9934 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F46EFC5CDAF57A92A7B136FFD3525675 /* CFNetwork.framework */; }; + 7D96A57FB85423E89BB7B969EC4889AC /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F78CCC4E543AE1ACD02EA7C0B0927E5 /* Kingfisher.framework */; }; + 84CF440A4E3CCDEE93FA2475748A9934 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88C2DC201E57C6FC489FB78275D9E14D /* CFNetwork.framework */; }; + 919CAD03C2FDEB7779F87007326ED8FF /* Pods-WRCycleScrollView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 39F2F051841354DE9D3D31F7C82A4ADD /* Pods-WRCycleScrollView_Example-dummy.m */; }; 95156987028D309F91AC55FBDFE01643 /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */; }; + 9B463CCE173412B9E88CDBC02B729249 /* WRNavigationBar_swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A7A38C64A15962136008EA7D6309D662 /* WRCycleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD6CE23F2D3BE7CAD763E2D8C05A5857 /* WRCycleCell.swift */; }; + A89C2257CE2D9A017AEC02999AF0F03C /* WRNavigationBar_swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */; }; A8A79840E81BFA3D8DCC29BE71F1AEC4 /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */; }; A9D2A6547EE5F6532EF8D1F1870BF158 /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */; }; - AD58B6CD6B08064EA2BC1B439643F5FA /* Pods-WRCycleScrollViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 91F3DD554153F8E4D41B0437D0BAF72D /* Pods-WRCycleScrollViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AA0FBDB7F86E01D8193BC519D1E6D61A /* WRCycleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6432A81970EA122347D0F3E404E7DAE8 /* WRCycleScrollView.swift */; }; B564B930C3B6CCFCC109ABF374B21CE6 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */; }; B924069CD75769E22765912C66A87BF3 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */; }; BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */ = {isa = PBXBuildFile; fileRef = 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */; settings = {ATTRIBUTES = (Public, ); }; }; BE9FB5E8188E0B68DB277B09A06E79BA /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */; }; C32C7FE70764DE37935F6A5D80CB17C7 /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */; }; CE38861F1268294930C074FC3F807E55 /* ThreadHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */; }; + CEC271DBFB3B025EB1AB19314BB205B9 /* WRCycleScrollView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C01B894A0394ABEAA23D6083E48C5984 /* WRCycleScrollView-dummy.m */; }; CEEB7C897409C08DF53289E307AB987C /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */; }; + CFC56213EA9F1DB7FFB38F70E3F92295 /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */; }; D1575AAADDCEA395E3828EBAC2A772FA /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */; }; + D94080C4C5456708261D7145660A8624 /* Pods-WRCycleScrollView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6C02C5046FD44ED65E4ED3C68492683 /* Pods-WRCycleScrollView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D9A5980C2815C9ECB07A92FA51AAD3B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; DA7A5ECA4C0B39776007BE89B99227EF /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */; }; E9E5F082818BE1AA4722E77DD066450F /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */; }; - EC5F157BC02D1F26152FBC01C3886D6D /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */; }; + EF10E20DF9B5910869358E3231C5D6D2 /* WRPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20FC8E5B688DCF847AF9AA7C106DBE69 /* WRPageControl.swift */; }; + F707F9E4E353C42CAC689F78D7EFDC9C /* Pods-WRCycleScrollView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D2E3006EB17CA7A52B13DCC065DB64B /* Pods-WRCycleScrollView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FE22325AE08EFC974DD3ABF725989726 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; FED97351EC4705507DAB175106B819C8 /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 19B7615C0DD9DE012AAC36AE0F32641D /* PBXContainerItemProxy */ = { + 0F7E5A7D64B91C2957EB33BEB6583A55 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = 4F87037150ABE2C9238B54E8F6E33F36; remoteInfo = Kingfisher; }; - D9C97F29CCA88067EF0B68A1FA662B21 /* PBXContainerItemProxy */ = { + 19D87572A957D2D335A24824444781BC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E2CC60083DC7D84D0D176C293F3954C9; + remoteGlobalIDString = 4F87037150ABE2C9238B54E8F6E33F36; + remoteInfo = Kingfisher; + }; + 56C77437AD522C1EE5CF93F067D50C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = B189FF35C8D98F9DBB8CFC28048E2AEF; + remoteInfo = WRCycleScrollView; + }; + 90865381B8BDEC3877E98E5501230808 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 93E71B3067948118A4A87B5873652F63; remoteInfo = WRNavigationBar_swift; }; + B5385F630C8358BF924F857139DB29BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08F04FABB0276A819ABC95C5DB2A90D8; + remoteInfo = "Pods-WRCycleScrollView_Example"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 018EC9305B73CB94F30D6D49EE9FFBAE /* Pods_WRCycleScrollViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollViewDemo.framework; path = "Pods-WRCycleScrollViewDemo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 032A61BE943FC5DF7C4F293DC0CB1099 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 050D02F22CA70B01C84CCFE2223C7AB6 /* Pods-WRCycleScrollView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollView_Tests.debug.xcconfig"; sourceTree = ""; }; + 0718344EF4BE86B2A2420605DA2AD6A5 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/AnimatedImageView.swift; sourceTree = ""; }; 10284B99AAE8D85089D3C62EC1F87ED2 /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-prefix.pch"; sourceTree = ""; }; - 1760EEE5CF89F97F04E541BCDFE1D80A /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher.framework; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 14228F8E5ECCD96DA755134DA775737F /* Pods-WRCycleScrollView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollView_Example-frameworks.sh"; sourceTree = ""; }; 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRCustomNavigationBar.swift; path = WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift; sourceTree = ""; }; + 1909FE118F35F4F2E2FE18A0048940FA /* Pods-WRCycleScrollView_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollView_Example-resources.sh"; sourceTree = ""; }; + 20FC8E5B688DCF847AF9AA7C106DBE69 /* WRPageControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRPageControl.swift; path = WRCycleScrollView/Classes/WRPageControl.swift; sourceTree = ""; }; + 235956EE57BE4C9341A3E5A913701B81 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2504D92B937C8312E816566BE54869C9 /* WRNavigationBar_swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = WRNavigationBar_swift.modulemap; sourceTree = ""; }; - 2C3469703B3994D9F6299B8D8358E9EB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2A1E474CF68F360691CEC837A05E72EB /* Pods-WRCycleScrollView_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WRCycleScrollView_Tests-acknowledgements.markdown"; sourceTree = ""; }; 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WRNavigationBar_swift.xcconfig; sourceTree = ""; }; 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/String+MD5.swift"; sourceTree = ""; }; 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = ""; }; + 31C4B23AB5517FE1237A76A4E81592E9 /* Pods-WRCycleScrollView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WRCycleScrollView_Example-acknowledgements.markdown"; sourceTree = ""; }; + 32CB78FE7E70F5A03ABD7559DD2731C3 /* Pods-WRCycleScrollView_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WRCycleScrollView_Tests-acknowledgements.plist"; sourceTree = ""; }; 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/KingfisherOptionsInfo.swift; sourceTree = ""; }; 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/RequestModifier.swift; sourceTree = ""; }; + 34C994C8ADF25DB7A99D5282B173DB52 /* Pods-WRCycleScrollView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollView_Example.release.xcconfig"; sourceTree = ""; }; 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/Resource.swift; sourceTree = ""; }; - 3EB686D290BC382AFD6C82A343E1CF13 /* Pods-WRCycleScrollViewDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollViewDemo-resources.sh"; sourceTree = ""; }; + 39F2F051841354DE9D3D31F7C82A4ADD /* Pods-WRCycleScrollView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WRCycleScrollView_Example-dummy.m"; sourceTree = ""; }; + 3D2E3006EB17CA7A52B13DCC065DB64B /* Pods-WRCycleScrollView_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WRCycleScrollView_Tests-umbrella.h"; sourceTree = ""; }; 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/KingfisherManager.swift; sourceTree = ""; }; - 4042CBAEF9E2051D1728E3B085B22E2D /* Pods-WRCycleScrollViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollViewDemo-frameworks.sh"; sourceTree = ""; }; 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Kingfisher.h; path = Sources/Kingfisher.h; sourceTree = ""; }; + 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WRCycleScrollView.xcconfig; sourceTree = ""; }; + 448686418F732BDCFE92016A655A2D8F /* WRCycleScrollView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRCycleScrollView-umbrella.h"; sourceTree = ""; }; 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/ImageTransition.swift; sourceTree = ""; }; + 4D49B480BA0807A7860CA159691994A6 /* Pods_WRCycleScrollView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollView_Example.framework; path = "Pods-WRCycleScrollView_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F78CCC4E543AE1ACD02EA7C0B0927E5 /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageModifier.swift; path = Sources/ImageModifier.swift; sourceTree = ""; }; 51D67D51760EBEA761B4FFF92E258863 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 540A1419F008FE1993459210F31E14AE /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Filter.swift; sourceTree = ""; }; 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/UIButton+Kingfisher.swift"; sourceTree = ""; }; + 594E3CD62FDE16C0B3A3D947F1D6CB67 /* WRCycleScrollView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = WRCycleScrollView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/ImageView+Kingfisher.swift"; sourceTree = ""; }; - 6CB331E6C6B5E83CB11FDCAAB42FF6FF /* Pods-WRCycleScrollViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollViewDemo.release.xcconfig"; sourceTree = ""; }; - 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 5BAD8B551B86EF819D7F92E0AF3007E4 /* Pods-WRCycleScrollView_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WRCycleScrollView_Tests-dummy.m"; sourceTree = ""; }; + 6432A81970EA122347D0F3E404E7DAE8 /* WRCycleScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRCycleScrollView.swift; path = WRCycleScrollView/Classes/WRCycleScrollView.swift; sourceTree = ""; }; + 684025C093AE05300D46ADE3C15F7BE8 /* Pods-WRCycleScrollView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WRCycleScrollView_Example.modulemap"; sourceTree = ""; }; + 6EEB73D3A55D2B6F2912D12710C797CA /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher.framework; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7CDCFB0E924F78D6A07F629E95A2E286 /* WRCycleScrollView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = WRCycleScrollView.framework; path = WRCycleScrollView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 87299C1D200EC1FA18A031EDAADF143E /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 88C2DC201E57C6FC489FB78275D9E14D /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + 8A973796C1D7318DF2E90D83A3FD2B87 /* Pods_WRCycleScrollView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollView_Tests.framework; path = "Pods-WRCycleScrollView_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8DF36E6EB7972B677B76E47AE8225C79 /* Pods-WRCycleScrollView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WRCycleScrollView_Example-acknowledgements.plist"; sourceTree = ""; }; 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Indicator.swift; sourceTree = ""; }; 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/FormatIndicatedCacheSerializer.swift; sourceTree = ""; }; - 91F3DD554153F8E4D41B0437D0BAF72D /* Pods-WRCycleScrollViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WRCycleScrollViewDemo-umbrella.h"; sourceTree = ""; }; + 90544B685152BAA80C65C54B3B54B1DB /* WRNavigationBar_swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = WRNavigationBar_swift.framework; path = WRNavigationBar_swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 90C5276BBAFD8D37A4EB0AD9626D7310 /* WRCycleScrollView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = WRCycleScrollView.modulemap; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 95E5D1E8A9B406BC3E5BAB24813B1589 /* Pods-WRCycleScrollViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WRCycleScrollViewDemo.modulemap"; sourceTree = ""; }; + 98F1C0B47C6FF67E8B5AF7BB472614E5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.xcconfig; sourceTree = ""; }; 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadHelper.swift; path = Sources/ThreadHelper.swift; sourceTree = ""; }; A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image.swift; sourceTree = ""; }; - A6ED1DBD3A1B3007D44B9A4844C2F456 /* Pods-WRCycleScrollViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WRCycleScrollViewDemo-acknowledgements.markdown"; sourceTree = ""; }; + A468A27AF802EF198A8FBA0459DC352C /* WRProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRProxy.swift; path = WRCycleScrollView/Classes/WRProxy.swift; sourceTree = ""; }; + A6C02C5046FD44ED65E4ED3C68492683 /* Pods-WRCycleScrollView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WRCycleScrollView_Example-umbrella.h"; sourceTree = ""; }; B0D60D21186BDCCB820D124F66182B6B /* WRNavigationBar_swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRNavigationBar_swift-prefix.pch"; sourceTree = ""; }; - B18AFD25E7809DC8483C40D48A215A66 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollViewDemo.debug.xcconfig"; sourceTree = ""; }; + B33572339F02D2B826F456519CDEA910 /* Pods-WRCycleScrollView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollView_Example.debug.xcconfig"; sourceTree = ""; }; B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessor.swift; path = Sources/ImageProcessor.swift; sourceTree = ""; }; BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Placeholder.swift; path = Sources/Placeholder.swift; sourceTree = ""; }; + BD034AF4EF8EE72A5AAD1DC2E4295E2A /* Pods-WRCycleScrollView_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollView_Tests-frameworks.sh"; sourceTree = ""; }; + C01B894A0394ABEAA23D6083E48C5984 /* WRCycleScrollView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WRCycleScrollView-dummy.m"; sourceTree = ""; }; + C13F2E2738F492C083C96F09B5243EC0 /* Pods-WRCycleScrollView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WRCycleScrollView_Tests.release.xcconfig"; sourceTree = ""; }; C6F28CFD3648E4B549E3BEF3EAF67A1D /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Kingfisher.modulemap; sourceTree = ""; }; C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/ImagePrefetcher.swift; sourceTree = ""; }; - CA495AEC0E5B0E946D5D98D55C3CFA7F /* Pods-WRCycleScrollViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WRCycleScrollViewDemo-dummy.m"; sourceTree = ""; }; CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRNavigationBar.swift; path = WRNavigationBar_swift/Classes/WRNavigationBar.swift; sourceTree = ""; }; + D4EE31010AB02EADBD2D7EDE7979362E /* WRCycleScrollView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRCycleScrollView-prefix.pch"; sourceTree = ""; }; D50BD1950F45CF0E5827559D0D4FE355 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = ""; }; - DCF6925055ADA6CC967E607BFB5F3980 /* Pods-WRCycleScrollViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WRCycleScrollViewDemo-acknowledgements.plist"; sourceTree = ""; }; DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/ImageDownloader.swift; sourceTree = ""; }; E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = ""; }; - E41319130961652A85272BA59104CB1B /* WRNavigationBar_swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = WRNavigationBar_swift.framework; path = WRNavigationBar_swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRNavigationBar_swift-umbrella.h"; sourceTree = ""; }; E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Box.swift; sourceTree = ""; }; + EB400EE900544677CC414FD6B942B8A1 /* Pods-WRCycleScrollView_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollView_Tests-resources.sh"; sourceTree = ""; }; EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/CacheSerializer.swift; sourceTree = ""; }; F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/Kingfisher.swift; sourceTree = ""; }; - F46EFC5CDAF57A92A7B136FFD3525675 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + F2518724D4AC692C8B62EBD854D83B49 /* Pods-WRCycleScrollView_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WRCycleScrollView_Tests.modulemap"; sourceTree = ""; }; F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WRNavigationBar_swift-dummy.m"; sourceTree = ""; }; + FD6CE23F2D3BE7CAD763E2D8C05A5857 /* WRCycleCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRCycleCell.swift; path = WRCycleScrollView/Classes/WRCycleCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 681233658848532795A9CF1D33B54781 /* Frameworks */ = { + 2B044D8F048C27F0B01E7BFE5A7F1109 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 32BD5E726818CAA61F34A00C07BC0D33 /* Foundation.framework in Frameworks */, + 285FCDD948223F8C39746DBB34F5764E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6BFCDA00B46CAE6D68CE21CB96AC734B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A5C34E6A97D7B296F4BF125B02996FF /* Foundation.framework in Frameworks */, + 7D96A57FB85423E89BB7B969EC4889AC /* Kingfisher.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,78 +204,65 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - FBA69F5E1EFCE177CD2E8A0860EF0E31 /* Frameworks */ = { + B8EEECD45032662F11585EF1EF8041D7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FE22325AE08EFC974DD3ABF725989726 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CD29268F8E4F8E9E0BE795161144CC91 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 82252AC9595554C901DACEFD19E2A9E0 /* Foundation.framework in Frameworks */, + D9A5980C2815C9ECB07A92FA51AAD3B9 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0A7761265548491332891BE52B03E86E /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 1911884ABAE585C138712D520BD16312 /* Pods-WRCycleScrollViewDemo */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 1911884ABAE585C138712D520BD16312 /* Pods-WRCycleScrollViewDemo */ = { - isa = PBXGroup; - children = ( - 2C3469703B3994D9F6299B8D8358E9EB /* Info.plist */, - 95E5D1E8A9B406BC3E5BAB24813B1589 /* Pods-WRCycleScrollViewDemo.modulemap */, - A6ED1DBD3A1B3007D44B9A4844C2F456 /* Pods-WRCycleScrollViewDemo-acknowledgements.markdown */, - DCF6925055ADA6CC967E607BFB5F3980 /* Pods-WRCycleScrollViewDemo-acknowledgements.plist */, - CA495AEC0E5B0E946D5D98D55C3CFA7F /* Pods-WRCycleScrollViewDemo-dummy.m */, - 4042CBAEF9E2051D1728E3B085B22E2D /* Pods-WRCycleScrollViewDemo-frameworks.sh */, - 3EB686D290BC382AFD6C82A343E1CF13 /* Pods-WRCycleScrollViewDemo-resources.sh */, - 91F3DD554153F8E4D41B0437D0BAF72D /* Pods-WRCycleScrollViewDemo-umbrella.h */, - B18AFD25E7809DC8483C40D48A215A66 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */, - 6CB331E6C6B5E83CB11FDCAAB42FF6FF /* Pods-WRCycleScrollViewDemo.release.xcconfig */, - ); - name = "Pods-WRCycleScrollViewDemo"; - path = "Target Support Files/Pods-WRCycleScrollViewDemo"; - sourceTree = ""; - }; - 3DC75C8869B42AB93D04871325A0707E /* iOS */ = { + 470E47414B1B460FD8E01FA77BCB40B4 /* Pod */ = { isa = PBXGroup; children = ( - F46EFC5CDAF57A92A7B136FFD3525675 /* CFNetwork.framework */, - 72913984B3E4B2AD01F71E405D688036 /* Foundation.framework */, + 0718344EF4BE86B2A2420605DA2AD6A5 /* LICENSE */, + 87299C1D200EC1FA18A031EDAADF143E /* README.md */, + 594E3CD62FDE16C0B3A3D947F1D6CB67 /* WRCycleScrollView.podspec */, ); - name = iOS; + name = Pod; sourceTree = ""; }; - 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { + 4FE7EC8EF6DB460D28F43BE9283CAD80 /* Products */ = { isa = PBXGroup; children = ( - 3DC75C8869B42AB93D04871325A0707E /* iOS */, + 6EEB73D3A55D2B6F2912D12710C797CA /* Kingfisher.framework */, + 4D49B480BA0807A7860CA159691994A6 /* Pods_WRCycleScrollView_Example.framework */, + 8A973796C1D7318DF2E90D83A3FD2B87 /* Pods_WRCycleScrollView_Tests.framework */, + 7CDCFB0E924F78D6A07F629E95A2E286 /* WRCycleScrollView.framework */, + 90544B685152BAA80C65C54B3B54B1DB /* WRNavigationBar_swift.framework */, ); - name = Frameworks; + name = Products; sourceTree = ""; }; - 7A1834B703BF86842385CF8638852888 /* Products */ = { + 6BE6794BE1D0147A47641BFD88E0C9B1 /* iOS */ = { isa = PBXGroup; children = ( - 1760EEE5CF89F97F04E541BCDFE1D80A /* Kingfisher.framework */, - 018EC9305B73CB94F30D6D49EE9FFBAE /* Pods_WRCycleScrollViewDemo.framework */, - E41319130961652A85272BA59104CB1B /* WRNavigationBar_swift.framework */, + 88C2DC201E57C6FC489FB78275D9E14D /* CFNetwork.framework */, + 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */, ); - name = Products; + name = iOS; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, + B7A942AFCF495689A99F86434BD53193 /* Development Pods */, + A34DC41A4AC9B0D17F82B623BF369E65 /* Frameworks */, C68A42DFF98C4F734F14D49FE295D994 /* Pods */, - 7A1834B703BF86842385CF8638852888 /* Products */, - 0A7761265548491332891BE52B03E86E /* Targets Support Files */, + 4FE7EC8EF6DB460D28F43BE9283CAD80 /* Products */, + A9DB1593C82EA7BF005E2627C3E14A15 /* Targets Support Files */, ); sourceTree = ""; }; @@ -240,6 +294,33 @@ path = "../Target Support Files/Kingfisher"; sourceTree = ""; }; + A34DC41A4AC9B0D17F82B623BF369E65 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4F78CCC4E543AE1ACD02EA7C0B0927E5 /* Kingfisher.framework */, + 6BE6794BE1D0147A47641BFD88E0C9B1 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + A447970996494AB371A9C53C2C0ADF89 /* Pods-WRCycleScrollView_Example */ = { + isa = PBXGroup; + children = ( + 98F1C0B47C6FF67E8B5AF7BB472614E5 /* Info.plist */, + 684025C093AE05300D46ADE3C15F7BE8 /* Pods-WRCycleScrollView_Example.modulemap */, + 31C4B23AB5517FE1237A76A4E81592E9 /* Pods-WRCycleScrollView_Example-acknowledgements.markdown */, + 8DF36E6EB7972B677B76E47AE8225C79 /* Pods-WRCycleScrollView_Example-acknowledgements.plist */, + 39F2F051841354DE9D3D31F7C82A4ADD /* Pods-WRCycleScrollView_Example-dummy.m */, + 14228F8E5ECCD96DA755134DA775737F /* Pods-WRCycleScrollView_Example-frameworks.sh */, + 1909FE118F35F4F2E2FE18A0048940FA /* Pods-WRCycleScrollView_Example-resources.sh */, + A6C02C5046FD44ED65E4ED3C68492683 /* Pods-WRCycleScrollView_Example-umbrella.h */, + B33572339F02D2B826F456519CDEA910 /* Pods-WRCycleScrollView_Example.debug.xcconfig */, + 34C994C8ADF25DB7A99D5282B173DB52 /* Pods-WRCycleScrollView_Example.release.xcconfig */, + ); + name = "Pods-WRCycleScrollView_Example"; + path = "Target Support Files/Pods-WRCycleScrollView_Example"; + sourceTree = ""; + }; A4BEDE3CFC9F9192B13945C5F9738F02 /* Kingfisher */ = { isa = PBXGroup; children = ( @@ -273,6 +354,37 @@ path = Kingfisher; sourceTree = ""; }; + A9DB1593C82EA7BF005E2627C3E14A15 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + A447970996494AB371A9C53C2C0ADF89 /* Pods-WRCycleScrollView_Example */, + E6BA48F940A47CB27600E103DD04CF48 /* Pods-WRCycleScrollView_Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + B28D836A9D2ABBE49171D39BA0B92C36 /* Support Files */ = { + isa = PBXGroup; + children = ( + 032A61BE943FC5DF7C4F293DC0CB1099 /* Info.plist */, + 90C5276BBAFD8D37A4EB0AD9626D7310 /* WRCycleScrollView.modulemap */, + 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.xcconfig */, + C01B894A0394ABEAA23D6083E48C5984 /* WRCycleScrollView-dummy.m */, + D4EE31010AB02EADBD2D7EDE7979362E /* WRCycleScrollView-prefix.pch */, + 448686418F732BDCFE92016A655A2D8F /* WRCycleScrollView-umbrella.h */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/WRCycleScrollView"; + sourceTree = ""; + }; + B7A942AFCF495689A99F86434BD53193 /* Development Pods */ = { + isa = PBXGroup; + children = ( + F7A02DAC84511A3369952B3FFBAF95E3 /* WRCycleScrollView */, + ); + name = "Development Pods"; + sourceTree = ""; + }; C68A42DFF98C4F734F14D49FE295D994 /* Pods */ = { isa = PBXGroup; children = ( @@ -282,6 +394,24 @@ name = Pods; sourceTree = ""; }; + E6BA48F940A47CB27600E103DD04CF48 /* Pods-WRCycleScrollView_Tests */ = { + isa = PBXGroup; + children = ( + 235956EE57BE4C9341A3E5A913701B81 /* Info.plist */, + F2518724D4AC692C8B62EBD854D83B49 /* Pods-WRCycleScrollView_Tests.modulemap */, + 2A1E474CF68F360691CEC837A05E72EB /* Pods-WRCycleScrollView_Tests-acknowledgements.markdown */, + 32CB78FE7E70F5A03ABD7559DD2731C3 /* Pods-WRCycleScrollView_Tests-acknowledgements.plist */, + 5BAD8B551B86EF819D7F92E0AF3007E4 /* Pods-WRCycleScrollView_Tests-dummy.m */, + BD034AF4EF8EE72A5AAD1DC2E4295E2A /* Pods-WRCycleScrollView_Tests-frameworks.sh */, + EB400EE900544677CC414FD6B942B8A1 /* Pods-WRCycleScrollView_Tests-resources.sh */, + 3D2E3006EB17CA7A52B13DCC065DB64B /* Pods-WRCycleScrollView_Tests-umbrella.h */, + 050D02F22CA70B01C84CCFE2223C7AB6 /* Pods-WRCycleScrollView_Tests.debug.xcconfig */, + C13F2E2738F492C083C96F09B5243EC0 /* Pods-WRCycleScrollView_Tests.release.xcconfig */, + ); + name = "Pods-WRCycleScrollView_Tests"; + path = "Target Support Files/Pods-WRCycleScrollView_Tests"; + sourceTree = ""; + }; ECB807DC83A33908DEBF5E0AF819A2BA /* WRNavigationBar_swift */ = { isa = PBXGroup; children = ( @@ -293,37 +423,87 @@ path = WRNavigationBar_swift; sourceTree = ""; }; + F7A02DAC84511A3369952B3FFBAF95E3 /* WRCycleScrollView */ = { + isa = PBXGroup; + children = ( + FD6CE23F2D3BE7CAD763E2D8C05A5857 /* WRCycleCell.swift */, + 6432A81970EA122347D0F3E404E7DAE8 /* WRCycleScrollView.swift */, + 20FC8E5B688DCF847AF9AA7C106DBE69 /* WRPageControl.swift */, + A468A27AF802EF198A8FBA0459DC352C /* WRProxy.swift */, + 470E47414B1B460FD8E01FA77BCB40B4 /* Pod */, + B28D836A9D2ABBE49171D39BA0B92C36 /* Support Files */, + ); + name = WRCycleScrollView; + path = ../..; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - BADBBCEED9A9F8B15B7F98467EA6FB0E /* Headers */ = { + 73BE613FB93F2BBA0D1A190455A93DA0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */, - BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */, + 6A79B7FA2452A885E59C1E9C8D27B825 /* WRCycleScrollView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C33B82D865A3D622C632C36A2B4CB34B /* Headers */ = { + 77343F6FE2F00590359315541EE3B36A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - AD58B6CD6B08064EA2BC1B439643F5FA /* Pods-WRCycleScrollViewDemo-umbrella.h in Headers */, + D94080C4C5456708261D7145660A8624 /* Pods-WRCycleScrollView_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - CD7E3C3B5C90A4681B58338CE994881F /* Headers */ = { + A1608BBC39798D740BF5C50FAAED1514 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2F07303D654FD044F366E213D63ED6D5 /* WRNavigationBar_swift-umbrella.h in Headers */, + F707F9E4E353C42CAC689F78D7EFDC9C /* Pods-WRCycleScrollView_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B5048B82BF08CCEB5868392B2E08573A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B463CCE173412B9E88CDBC02B729249 /* WRNavigationBar_swift-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BADBBCEED9A9F8B15B7F98467EA6FB0E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */, + BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 08F04FABB0276A819ABC95C5DB2A90D8 /* Pods-WRCycleScrollView_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2E0B65340ED60C1BEFC818CD9FF81185 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Example" */; + buildPhases = ( + 196B93854C88CBD596C97477663710A2 /* Sources */, + B8EEECD45032662F11585EF1EF8041D7 /* Frameworks */, + 77343F6FE2F00590359315541EE3B36A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 92E34C524F4023C07C992A656FB18AAD /* PBXTargetDependency */, + 0C32876D6667CA0C17E03593A953CF65 /* PBXTargetDependency */, + B35B92EFC9CED5494F2F873380474A05 /* PBXTargetDependency */, + ); + name = "Pods-WRCycleScrollView_Example"; + productName = "Pods-WRCycleScrollView_Example"; + productReference = 4D49B480BA0807A7860CA159691994A6 /* Pods_WRCycleScrollView_Example.framework */; + productType = "com.apple.product-type.framework"; + }; 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */ = { isa = PBXNativeTarget; buildConfigurationList = 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */; @@ -338,35 +518,34 @@ ); name = Kingfisher; productName = Kingfisher; - productReference = 1760EEE5CF89F97F04E541BCDFE1D80A /* Kingfisher.framework */; + productReference = 6EEB73D3A55D2B6F2912D12710C797CA /* Kingfisher.framework */; productType = "com.apple.product-type.framework"; }; - C4FFA3ADCB0D553735F8EBD4E9B0F88B /* Pods-WRCycleScrollViewDemo */ = { + 5E3FC57C82CFE4F2BD437F74D140C6B5 /* Pods-WRCycleScrollView_Tests */ = { isa = PBXNativeTarget; - buildConfigurationList = 134910D8B599C1CCD6F1803DA20AA410 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollViewDemo" */; + buildConfigurationList = F489F014DB4C214B0F040623742359DA /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Tests" */; buildPhases = ( - 4D896E372C548D5BA371DDA879BE91BF /* Sources */, - FBA69F5E1EFCE177CD2E8A0860EF0E31 /* Frameworks */, - C33B82D865A3D622C632C36A2B4CB34B /* Headers */, + 6ABFA486DC54461D4D910D6C2DEEA61A /* Sources */, + CD29268F8E4F8E9E0BE795161144CC91 /* Frameworks */, + A1608BBC39798D740BF5C50FAAED1514 /* Headers */, ); buildRules = ( ); dependencies = ( - 6EEC3DA532A4DDB23DD32499454DDB18 /* PBXTargetDependency */, - 68F08FB80602AF8C45DC559F88CCB713 /* PBXTargetDependency */, + CEFA7E77250E810792AAAC6585766341 /* PBXTargetDependency */, ); - name = "Pods-WRCycleScrollViewDemo"; - productName = "Pods-WRCycleScrollViewDemo"; - productReference = 018EC9305B73CB94F30D6D49EE9FFBAE /* Pods_WRCycleScrollViewDemo.framework */; + name = "Pods-WRCycleScrollView_Tests"; + productName = "Pods-WRCycleScrollView_Tests"; + productReference = 8A973796C1D7318DF2E90D83A3FD2B87 /* Pods_WRCycleScrollView_Tests.framework */; productType = "com.apple.product-type.framework"; }; - E2CC60083DC7D84D0D176C293F3954C9 /* WRNavigationBar_swift */ = { + 93E71B3067948118A4A87B5873652F63 /* WRNavigationBar_swift */ = { isa = PBXNativeTarget; - buildConfigurationList = 0A6746D9BB092A1C7DA9F5EDFE97D0D1 /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */; + buildConfigurationList = F495FFE5A6FA13AF007AF7EF43CF204B /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */; buildPhases = ( - 8FEC1243DA6E750D957E0F9D9FA23FC7 /* Sources */, - 681233658848532795A9CF1D33B54781 /* Frameworks */, - CD7E3C3B5C90A4681B58338CE994881F /* Headers */, + 6A40AA8C651387CFA0E86ED925EC848A /* Sources */, + 2B044D8F048C27F0B01E7BFE5A7F1109 /* Frameworks */, + B5048B82BF08CCEB5868392B2E08573A /* Headers */, ); buildRules = ( ); @@ -374,7 +553,25 @@ ); name = WRNavigationBar_swift; productName = WRNavigationBar_swift; - productReference = E41319130961652A85272BA59104CB1B /* WRNavigationBar_swift.framework */; + productReference = 90544B685152BAA80C65C54B3B54B1DB /* WRNavigationBar_swift.framework */; + productType = "com.apple.product-type.framework"; + }; + B189FF35C8D98F9DBB8CFC28048E2AEF /* WRCycleScrollView */ = { + isa = PBXNativeTarget; + buildConfigurationList = E5D55B6F3A9153750EC9D0157D146044 /* Build configuration list for PBXNativeTarget "WRCycleScrollView" */; + buildPhases = ( + E69F93D207C180F93656163733D43B8A /* Sources */, + 6BFCDA00B46CAE6D68CE21CB96AC734B /* Frameworks */, + 73BE613FB93F2BBA0D1A190455A93DA0 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 845D168BC1C1DC67D306FAF8EEA87A5B /* PBXTargetDependency */, + ); + name = WRCycleScrollView; + productName = WRCycleScrollView; + productReference = 7CDCFB0E924F78D6A07F629E95A2E286 /* WRCycleScrollView.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -394,13 +591,15 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 7A1834B703BF86842385CF8638852888 /* Products */; + productRefGroup = 4FE7EC8EF6DB460D28F43BE9283CAD80 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */, - C4FFA3ADCB0D553735F8EBD4E9B0F88B /* Pods-WRCycleScrollViewDemo */, - E2CC60083DC7D84D0D176C293F3954C9 /* WRNavigationBar_swift */, + 08F04FABB0276A819ABC95C5DB2A90D8 /* Pods-WRCycleScrollView_Example */, + 5E3FC57C82CFE4F2BD437F74D140C6B5 /* Pods-WRCycleScrollView_Tests */, + B189FF35C8D98F9DBB8CFC28048E2AEF /* WRCycleScrollView */, + 93E71B3067948118A4A87B5873652F63 /* WRNavigationBar_swift */, ); }; /* End PBXProject section */ @@ -437,108 +636,117 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 4D896E372C548D5BA371DDA879BE91BF /* Sources */ = { + 196B93854C88CBD596C97477663710A2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 919CAD03C2FDEB7779F87007326ED8FF /* Pods-WRCycleScrollView_Example-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6A40AA8C651387CFA0E86ED925EC848A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 339B55D5AAEF2FF1608FC5B9B527C652 /* WRCustomNavigationBar.swift in Sources */, + CFC56213EA9F1DB7FFB38F70E3F92295 /* WRNavigationBar.swift in Sources */, + A89C2257CE2D9A017AEC02999AF0F03C /* WRNavigationBar_swift-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6ABFA486DC54461D4D910D6C2DEEA61A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1A46E04D326B224412B9B9EC4A23B611 /* Pods-WRCycleScrollViewDemo-dummy.m in Sources */, + 6C6EB20F66C724EECC0ADF8E44A5828F /* Pods-WRCycleScrollView_Tests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8FEC1243DA6E750D957E0F9D9FA23FC7 /* Sources */ = { + E69F93D207C180F93656163733D43B8A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6438B3A2CEACB4D724E0BC8762F909B4 /* WRCustomNavigationBar.swift in Sources */, - EC5F157BC02D1F26152FBC01C3886D6D /* WRNavigationBar.swift in Sources */, - 79D243A74336D282DFD51E88B45EF085 /* WRNavigationBar_swift-dummy.m in Sources */, + A7A38C64A15962136008EA7D6309D662 /* WRCycleCell.swift in Sources */, + CEC271DBFB3B025EB1AB19314BB205B9 /* WRCycleScrollView-dummy.m in Sources */, + AA0FBDB7F86E01D8193BC519D1E6D61A /* WRCycleScrollView.swift in Sources */, + EF10E20DF9B5910869358E3231C5D6D2 /* WRPageControl.swift in Sources */, + 55DB31F4733D4E7D77EDC907C671974A /* WRProxy.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 68F08FB80602AF8C45DC559F88CCB713 /* PBXTargetDependency */ = { + 0C32876D6667CA0C17E03593A953CF65 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = WRNavigationBar_swift; - target = E2CC60083DC7D84D0D176C293F3954C9 /* WRNavigationBar_swift */; - targetProxy = D9C97F29CCA88067EF0B68A1FA662B21 /* PBXContainerItemProxy */; + name = WRCycleScrollView; + target = B189FF35C8D98F9DBB8CFC28048E2AEF /* WRCycleScrollView */; + targetProxy = 56C77437AD522C1EE5CF93F067D50C21 /* PBXContainerItemProxy */; + }; + 845D168BC1C1DC67D306FAF8EEA87A5B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Kingfisher; + target = 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */; + targetProxy = 0F7E5A7D64B91C2957EB33BEB6583A55 /* PBXContainerItemProxy */; }; - 6EEC3DA532A4DDB23DD32499454DDB18 /* PBXTargetDependency */ = { + 92E34C524F4023C07C992A656FB18AAD /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Kingfisher; target = 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */; - targetProxy = 19B7615C0DD9DE012AAC36AE0F32641D /* PBXContainerItemProxy */; + targetProxy = 19D87572A957D2D335A24824444781BC /* PBXContainerItemProxy */; + }; + B35B92EFC9CED5494F2F873380474A05 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = WRNavigationBar_swift; + target = 93E71B3067948118A4A87B5873652F63 /* WRNavigationBar_swift */; + targetProxy = 90865381B8BDEC3877E98E5501230808 /* PBXContainerItemProxy */; + }; + CEFA7E77250E810792AAAC6585766341 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-WRCycleScrollView_Example"; + target = 08F04FABB0276A819ABC95C5DB2A90D8 /* Pods-WRCycleScrollView_Example */; + targetProxy = B5385F630C8358BF924F857139DB29BD /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 1EE19F5DD95931924296F637BF18BD8F /* Debug */ = { + 12DF7DF7F7E2A771C22A0C508B55E5E8 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C13F2E2738F492C083C96F09B5243EC0 /* Pods-WRCycleScrollView_Tests.release.xcconfig */; 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SYMROOT = "${SRCROOT}/../build"; + 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-WRCycleScrollView_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.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 = Debug; + name = Release; }; - 1F25A732760398E965091F0E6E9C39FB /* Release */ = { + 15C362FAFBE5990A801BF59B93B55C0A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; + baseConfigurationReference = 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -549,14 +757,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Kingfisher/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/WRCycleScrollView/WRCycleScrollView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRCycleScrollView/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/Kingfisher/Kingfisher.modulemap"; - PRODUCT_MODULE_NAME = Kingfisher; - PRODUCT_NAME = Kingfisher; + MODULEMAP_FILE = "Target Support Files/WRCycleScrollView/WRCycleScrollView.modulemap"; + PRODUCT_MODULE_NAME = WRCycleScrollView; + PRODUCT_NAME = WRCycleScrollView; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -569,7 +777,7 @@ }; name = Release; }; - 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */ = { + 1F25A732760398E965091F0E6E9C39FB /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; buildSettings = { @@ -593,19 +801,19 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 43C5DB047AC29479011B6AB1BA426217 /* Debug */ = { + 2B0F146D8205280409DC857C8CF0B27C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B18AFD25E7809DC8483C40D48A215A66 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */; + baseConfigurationReference = 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -615,32 +823,29 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/WRCycleScrollView/WRCycleScrollView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRCycleScrollView/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/WRCycleScrollView/WRCycleScrollView.modulemap"; + PRODUCT_MODULE_NAME = WRCycleScrollView; + PRODUCT_NAME = WRCycleScrollView; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 61968215806C6D16D5D97F6A62CD0E19 /* Release */ = { + 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6CB331E6C6B5E83CB11FDCAAB42FF6FF /* Pods-WRCycleScrollViewDemo.release.xcconfig */; + baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -650,28 +855,26 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Kingfisher/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/Kingfisher/Kingfisher.modulemap"; + PRODUCT_MODULE_NAME = Kingfisher; + PRODUCT_NAME = Kingfisher; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 871EDCFC9428C263E17DA28CB059E3AF /* Debug */ = { + 5551858CC0F5017E81F0D2D436EF9820 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.xcconfig */; buildSettings = { @@ -695,15 +898,114 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 802059283A3ED2AB173AF0F2A31902AD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B33572339F02D2B826F456519CDEA910 /* Pods-WRCycleScrollView_Example.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-WRCycleScrollView_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.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; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - C64FA0D12319F7517FEEEF813D3D3401 /* Release */ = { + 8B33C5230DE4A9DFA6D8F46505DD7AF7 /* 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 = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 8D4971BA4E317AEED734296D352C6E98 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.xcconfig */; buildSettings = { @@ -727,16 +1029,15 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - F4568DEE257655D290C2B9CEAB37C934 /* Release */ = { + B42B54097A876E8A982CBF5DAA91B1AB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -786,7 +1087,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; @@ -794,41 +1095,127 @@ }; name = Release; }; + D6B40A867C8136EA597197B5991DF20B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 050D02F22CA70B01C84CCFE2223C7AB6 /* Pods-WRCycleScrollView_Tests.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-WRCycleScrollView_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.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; + }; + E7AE764CD2BDDB9FED9F828BBD71C402 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 34C994C8ADF25DB7A99D5282B173DB52 /* Pods-WRCycleScrollView_Example.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-WRCycleScrollView_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.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; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0A6746D9BB092A1C7DA9F5EDFE97D0D1 /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 871EDCFC9428C263E17DA28CB059E3AF /* Debug */, - C64FA0D12319F7517FEEEF813D3D3401 /* Release */, + 8B33C5230DE4A9DFA6D8F46505DD7AF7 /* Debug */, + B42B54097A876E8A982CBF5DAA91B1AB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 134910D8B599C1CCD6F1803DA20AA410 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollViewDemo" */ = { + 2E0B65340ED60C1BEFC818CD9FF81185 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - 43C5DB047AC29479011B6AB1BA426217 /* Debug */, - 61968215806C6D16D5D97F6A62CD0E19 /* Release */, + 802059283A3ED2AB173AF0F2A31902AD /* Debug */, + E7AE764CD2BDDB9FED9F828BBD71C402 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1EE19F5DD95931924296F637BF18BD8F /* Debug */, - F4568DEE257655D290C2B9CEAB37C934 /* Release */, + 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */, + 1F25A732760398E965091F0E6E9C39FB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */ = { + E5D55B6F3A9153750EC9D0157D146044 /* Build configuration list for PBXNativeTarget "WRCycleScrollView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */, - 1F25A732760398E965091F0E6E9C39FB /* Release */, + 2B0F146D8205280409DC857C8CF0B27C /* Debug */, + 15C362FAFBE5990A801BF59B93B55C0A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F489F014DB4C214B0F040623742359DA /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D6B40A867C8136EA597197B5991DF20B /* Debug */, + 12DF7DF7F7E2A771C22A0C508B55E5E8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F495FFE5A6FA13AF007AF7EF43CF204B /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8D4971BA4E317AEED734296D352C6E98 /* Debug */, + 5551858CC0F5017E81F0D2D436EF9820 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Info.plist b/Example/Pods/Target Support Files/Kingfisher/Info.plist similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Info.plist rename to Example/Pods/Target Support Files/Kingfisher/Info.plist diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m b/Example/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m rename to Example/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch b/Example/Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch rename to Example/Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h b/Example/Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h rename to Example/Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap b/Example/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap rename to Example/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig b/Example/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig rename to Example/Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Info.plist b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Info.plist similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Info.plist rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Info.plist diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.markdown similarity index 68% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.markdown index 8ea98ba..01b5071 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.markdown @@ -27,6 +27,31 @@ SOFTWARE. +## WRCycleScrollView + +MIT License + +Copyright (c) 2017 + +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. + + ## WRNavigationBar_swift MIT License diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.plist similarity index 72% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.plist index bf78ebf..0f5f304 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-acknowledgements.plist @@ -60,6 +60,37 @@ 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 + WRCycleScrollView + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2017 + +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 diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-dummy.m b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-dummy.m new file mode 100644 index 0000000..0906830 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_WRCycleScrollView_Example : NSObject +@end +@implementation PodsDummy_Pods_WRCycleScrollView_Example +@end diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-frameworks.sh similarity index 97% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-frameworks.sh index a6cadbe..094d43a 100755 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-frameworks.sh @@ -144,10 +144,12 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework" + install_framework "${BUILT_PRODUCTS_DIR}/WRCycleScrollView/WRCycleScrollView.framework" install_framework "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework" + install_framework "${BUILT_PRODUCTS_DIR}/WRCycleScrollView/WRCycleScrollView.framework" install_framework "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-resources.sh similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-resources.sh rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-resources.sh diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-umbrella.h new file mode 100644 index 0000000..65d444b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-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_WRCycleScrollView_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_WRCycleScrollView_ExampleVersionString[]; + diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.debug.xcconfig similarity index 65% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.debug.xcconfig index 98cb416..2bb5f1c 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.debug.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" 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}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" -framework "WRNavigationBar_swift" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView/WRCycleScrollView.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" -framework "WRCycleScrollView" -framework "WRNavigationBar_swift" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.modulemap b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.modulemap new file mode 100644 index 0000000..bca663e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.modulemap @@ -0,0 +1,6 @@ +framework module Pods_WRCycleScrollView_Example { + umbrella header "Pods-WRCycleScrollView_Example-umbrella.h" + + export * + module * { export * } +} diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.release.xcconfig similarity index 65% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig rename to Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.release.xcconfig index 98cb416..2bb5f1c 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.release.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" 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}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" -framework "WRNavigationBar_swift" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView/WRCycleScrollView.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Kingfisher" -framework "WRCycleScrollView" -framework "WRNavigationBar_swift" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/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/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-dummy.m new file mode 100644 index 0000000..39ab621 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_WRCycleScrollView_Tests : NSObject +@end +@implementation PodsDummy_Pods_WRCycleScrollView_Tests +@end diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-frameworks.sh new file mode 100755 index 0000000..08e3eaa --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-frameworks.sh @@ -0,0 +1,146 @@ +#!/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 [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-resources.sh new file mode 100755 index 0000000..345301f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-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/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-umbrella.h new file mode 100644 index 0000000..c4e7a55 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests-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_WRCycleScrollView_TestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_WRCycleScrollView_TestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.debug.xcconfig new file mode 100644 index 0000000..817fb7f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" +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}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView/WRCycleScrollView.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" +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/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.modulemap b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.modulemap new file mode 100644 index 0000000..16ef43e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_WRCycleScrollView_Tests { + umbrella header "Pods-WRCycleScrollView_Tests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.release.xcconfig new file mode 100644 index 0000000..817fb7f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView" "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift" +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}/Kingfisher/Kingfisher.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView/WRCycleScrollView.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework/Headers" +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/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/Info.plist b/Example/Pods/Target Support Files/WRCycleScrollView/Info.plist similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/Info.plist rename to Example/Pods/Target Support Files/WRCycleScrollView/Info.plist diff --git a/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-dummy.m b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-dummy.m new file mode 100644 index 0000000..54115b7 --- /dev/null +++ b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_WRCycleScrollView : NSObject +@end +@implementation PodsDummy_WRCycleScrollView +@end diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-prefix.pch similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch rename to Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-prefix.pch diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-umbrella.h b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-umbrella.h similarity index 57% rename from WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-umbrella.h rename to Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-umbrella.h index 5d97c25..3c29207 100644 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-umbrella.h +++ b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView-umbrella.h @@ -11,6 +11,6 @@ #endif -FOUNDATION_EXPORT double Pods_WRCycleScrollViewDemoVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_WRCycleScrollViewDemoVersionString[]; +FOUNDATION_EXPORT double WRCycleScrollViewVersionNumber; +FOUNDATION_EXPORT const unsigned char WRCycleScrollViewVersionString[]; diff --git a/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.modulemap b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.modulemap new file mode 100644 index 0000000..23837da --- /dev/null +++ b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.modulemap @@ -0,0 +1,6 @@ +framework module WRCycleScrollView { + umbrella header "WRCycleScrollView-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig new file mode 100644 index 0000000..f965c01 --- /dev/null +++ b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/WRNavigationBar_swift/Info.plist b/Example/Pods/Target Support Files/WRNavigationBar_swift/Info.plist new file mode 100644 index 0000000..161a9d3 --- /dev/null +++ b/Example/Pods/Target Support Files/WRNavigationBar_swift/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m b/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m rename to Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-dummy.m diff --git a/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch b/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-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/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h b/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h rename to Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift-umbrella.h diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap b/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap rename to Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.modulemap diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig b/Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig similarity index 100% rename from WRCycleScrollViewDemo/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig rename to Example/Pods/Target Support Files/WRNavigationBar_swift/WRNavigationBar_swift.xcconfig diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/LICENSE b/Example/Pods/WRNavigationBar_swift/LICENSE similarity index 100% rename from WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/LICENSE rename to Example/Pods/WRNavigationBar_swift/LICENSE diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/README.md b/Example/Pods/WRNavigationBar_swift/README.md similarity index 100% rename from WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/README.md rename to Example/Pods/WRNavigationBar_swift/README.md diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift b/Example/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift rename to Example/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift diff --git a/WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift b/Example/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift similarity index 100% rename from WRCycleScrollViewDemo/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift rename to Example/Pods/WRNavigationBar_swift/WRNavigationBar_swift/Classes/WRNavigationBar.swift diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/Info.plist b/Example/Tests/Info.plist similarity index 92% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/Info.plist rename to Example/Tests/Info.plist index 6c6c23c..ba72822 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/Info.plist +++ b/Example/Tests/Info.plist @@ -16,6 +16,8 @@ BNDL CFBundleShortVersionString 1.0 + CFBundleSignature + ???? CFBundleVersion 1 diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/WRCycleScrollViewDemoTests.swift b/Example/Tests/Tests.swift similarity index 63% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/WRCycleScrollViewDemoTests.swift rename to Example/Tests/Tests.swift index 5921e7f..3eaf2cf 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemoTests/WRCycleScrollViewDemoTests.swift +++ b/Example/Tests/Tests.swift @@ -1,15 +1,7 @@ -// -// WRCycleScrollViewDemoTests.swift -// WRCycleScrollViewDemoTests -// -// Created by wangrui on 2017/5/12. -// Copyright © 2017年 wangrui. All rights reserved. -// - import XCTest -@testable import WRCycleScrollViewDemo +import WRCycleScrollView -class WRCycleScrollViewDemoTests: XCTestCase { +class Tests: XCTestCase { override func setUp() { super.setUp() @@ -23,12 +15,12 @@ class WRCycleScrollViewDemoTests: XCTestCase { func testExample() { // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. + XCTAssert(true, "Pass") } func testPerformanceExample() { // This is an example of a performance test case. - self.measure { + self.measure() { // Put the code you want to measure the time of here. } } diff --git a/Example/WRCycleScrollView.xcodeproj/project.pbxproj b/Example/WRCycleScrollView.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9555876 --- /dev/null +++ b/Example/WRCycleScrollView.xcodeproj/project.pbxproj @@ -0,0 +1,622 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 12C6C45C21F029C40001D33E /* NoEndlessController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45321F029C30001D33E /* NoEndlessController.swift */; }; + 12C6C45D21F029C40001D33E /* DemoListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45421F029C30001D33E /* DemoListController.swift */; }; + 12C6C45E21F029C40001D33E /* CustomDotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45521F029C30001D33E /* CustomDotController.swift */; }; + 12C6C45F21F029C40001D33E /* SBController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45621F029C30001D33E /* SBController.swift */; }; + 12C6C46021F029C40001D33E /* ServerImgController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45721F029C30001D33E /* ServerImgController.swift */; }; + 12C6C46121F029C40001D33E /* NoPageControlController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45821F029C30001D33E /* NoPageControlController.swift */; }; + 12C6C46221F029C40001D33E /* LocalImgController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45921F029C30001D33E /* LocalImgController.swift */; }; + 12C6C46321F029C40001D33E /* ZhiHuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45A21F029C40001D33E /* ZhiHuController.swift */; }; + 12C6C46421F029C40001D33E /* StandaloneDotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C45B21F029C40001D33E /* StandaloneDotController.swift */; }; + 12C6C46621F029EA0001D33E /* StoryBoardController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 12C6C46521F029E90001D33E /* StoryBoardController.storyboard */; }; + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; + 9B76C87AE5C0EB338B4BD855 /* Pods_WRCycleScrollView_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E595DF277EFA36B591611B91 /* Pods_WRCycleScrollView_Tests.framework */; }; + 9D2C591517E7D0914899DB51 /* Pods_WRCycleScrollView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E575CCACF2F3D578F6F25BD0 /* Pods_WRCycleScrollView_Example.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 607FACCF1AFB9204008FA782; + remoteInfo = WRCycleScrollView; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 023C7BDEAAEC3F730B72769F /* Pods-WRCycleScrollView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WRCycleScrollView_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.debug.xcconfig"; sourceTree = ""; }; + 12C6C45321F029C30001D33E /* NoEndlessController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoEndlessController.swift; sourceTree = ""; }; + 12C6C45421F029C30001D33E /* DemoListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoListController.swift; sourceTree = ""; }; + 12C6C45521F029C30001D33E /* CustomDotController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomDotController.swift; sourceTree = ""; }; + 12C6C45621F029C30001D33E /* SBController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SBController.swift; sourceTree = ""; }; + 12C6C45721F029C30001D33E /* ServerImgController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerImgController.swift; sourceTree = ""; }; + 12C6C45821F029C30001D33E /* NoPageControlController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoPageControlController.swift; sourceTree = ""; }; + 12C6C45921F029C30001D33E /* LocalImgController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalImgController.swift; sourceTree = ""; }; + 12C6C45A21F029C40001D33E /* ZhiHuController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZhiHuController.swift; sourceTree = ""; }; + 12C6C45B21F029C40001D33E /* StandaloneDotController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StandaloneDotController.swift; sourceTree = ""; }; + 12C6C46521F029E90001D33E /* StoryBoardController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = StoryBoardController.storyboard; sourceTree = ""; }; + 1BEC9B3CAD748E848200B908 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; + 2AA609AC589E7A08E11A90E7 /* Pods-WRCycleScrollView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WRCycleScrollView_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.release.xcconfig"; sourceTree = ""; }; + 55486E999A9BE33D89BB2C4C /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 59A763A0490411F8055759E1 /* Pods-WRCycleScrollView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WRCycleScrollView_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.release.xcconfig"; sourceTree = ""; }; + 607FACD01AFB9204008FA782 /* WRCycleScrollView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WRCycleScrollView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* WRCycleScrollView_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WRCycleScrollView_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; + 7B4B18A56047D64642DD5853 /* WRCycleScrollView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = WRCycleScrollView.podspec; path = ../WRCycleScrollView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BDE4FD60B892993ED428E29B /* Pods-WRCycleScrollView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WRCycleScrollView_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.debug.xcconfig"; sourceTree = ""; }; + E575CCACF2F3D578F6F25BD0 /* Pods_WRCycleScrollView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WRCycleScrollView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E595DF277EFA36B591611B91 /* Pods_WRCycleScrollView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WRCycleScrollView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACCD1AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D2C591517E7D0914899DB51 /* Pods_WRCycleScrollView_Example.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B76C87AE5C0EB338B4BD855 /* Pods_WRCycleScrollView_Tests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4F2FA38D73757289E9359059 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E575CCACF2F3D578F6F25BD0 /* Pods_WRCycleScrollView_Example.framework */, + E595DF277EFA36B591611B91 /* Pods_WRCycleScrollView_Tests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 607FACD21AFB9204008FA782 /* Example for WRCycleScrollView */, + 607FACE81AFB9204008FA782 /* Tests */, + 607FACD11AFB9204008FA782 /* Products */, + CD7C01FD9378462EAAA5606B /* Pods */, + 4F2FA38D73757289E9359059 /* Frameworks */, + ); + sourceTree = ""; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACD01AFB9204008FA782 /* WRCycleScrollView_Example.app */, + 607FACE51AFB9204008FA782 /* WRCycleScrollView_Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 607FACD21AFB9204008FA782 /* Example for WRCycleScrollView */ = { + isa = PBXGroup; + children = ( + 12C6C45521F029C30001D33E /* CustomDotController.swift */, + 12C6C45421F029C30001D33E /* DemoListController.swift */, + 12C6C45921F029C30001D33E /* LocalImgController.swift */, + 12C6C45321F029C30001D33E /* NoEndlessController.swift */, + 12C6C45821F029C30001D33E /* NoPageControlController.swift */, + 12C6C45621F029C30001D33E /* SBController.swift */, + 12C6C45721F029C30001D33E /* ServerImgController.swift */, + 12C6C45B21F029C40001D33E /* StandaloneDotController.swift */, + 12C6C45A21F029C40001D33E /* ZhiHuController.swift */, + 607FACD51AFB9204008FA782 /* AppDelegate.swift */, + 607FACD71AFB9204008FA782 /* ViewController.swift */, + 607FACD31AFB9204008FA782 /* Supporting Files */, + ); + name = "Example for WRCycleScrollView"; + path = WRCycleScrollView; + sourceTree = ""; + }; + 607FACD31AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 12C6C46521F029E90001D33E /* StoryBoardController.storyboard */, + 607FACD91AFB9204008FA782 /* Main.storyboard */, + 607FACDC1AFB9204008FA782 /* Images.xcassets */, + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + 607FACD41AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACE81AFB9204008FA782 /* Tests */ = { + isa = PBXGroup; + children = ( + 607FACEB1AFB9204008FA782 /* Tests.swift */, + 607FACE91AFB9204008FA782 /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 607FACE91AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACEA1AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + 7B4B18A56047D64642DD5853 /* WRCycleScrollView.podspec */, + 1BEC9B3CAD748E848200B908 /* README.md */, + 55486E999A9BE33D89BB2C4C /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + CD7C01FD9378462EAAA5606B /* Pods */ = { + isa = PBXGroup; + children = ( + 023C7BDEAAEC3F730B72769F /* Pods-WRCycleScrollView_Example.debug.xcconfig */, + 2AA609AC589E7A08E11A90E7 /* Pods-WRCycleScrollView_Example.release.xcconfig */, + BDE4FD60B892993ED428E29B /* Pods-WRCycleScrollView_Tests.debug.xcconfig */, + 59A763A0490411F8055759E1 /* Pods-WRCycleScrollView_Tests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 607FACCF1AFB9204008FA782 /* WRCycleScrollView_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WRCycleScrollView_Example" */; + buildPhases = ( + 00680C969C18A4C33DBE3532 /* [CP] Check Pods Manifest.lock */, + 607FACCC1AFB9204008FA782 /* Sources */, + 607FACCD1AFB9204008FA782 /* Frameworks */, + 607FACCE1AFB9204008FA782 /* Resources */, + 7D35FB5880FE04E8DB717BD7 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WRCycleScrollView_Example; + productName = WRCycleScrollView; + productReference = 607FACD01AFB9204008FA782 /* WRCycleScrollView_Example.app */; + productType = "com.apple.product-type.application"; + }; + 607FACE41AFB9204008FA782 /* WRCycleScrollView_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WRCycleScrollView_Tests" */; + buildPhases = ( + BABB832E8EF6827B51B9F6EF /* [CP] Check Pods Manifest.lock */, + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 607FACE71AFB9204008FA782 /* PBXTargetDependency */, + ); + name = WRCycleScrollView_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* WRCycleScrollView_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + DevelopmentTeam = P3X2725LYY; + LastSwiftMigration = 0900; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + DevelopmentTeam = P3X2725LYY; + LastSwiftMigration = 0900; + TestTargetID = 607FACCF1AFB9204008FA782; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "WRCycleScrollView" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 607FACCF1AFB9204008FA782 /* WRCycleScrollView_Example */, + 607FACE41AFB9204008FA782 /* WRCycleScrollView_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACCE1AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, + 12C6C46621F029EA0001D33E /* StoryBoardController.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00680C969C18A4C33DBE3532 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-WRCycleScrollView_Example-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; + }; + 7D35FB5880FE04E8DB717BD7 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework", + "${BUILT_PRODUCTS_DIR}/WRCycleScrollView/WRCycleScrollView.framework", + "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WRCycleScrollView.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WRNavigationBar_swift.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + BABB832E8EF6827B51B9F6EF /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-WRCycleScrollView_Tests-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 */ + 607FACCC1AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 12C6C45D21F029C40001D33E /* DemoListController.swift in Sources */, + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 12C6C45C21F029C40001D33E /* NoEndlessController.swift in Sources */, + 12C6C45E21F029C40001D33E /* CustomDotController.swift in Sources */, + 12C6C46321F029C40001D33E /* ZhiHuController.swift in Sources */, + 12C6C46021F029C40001D33E /* ServerImgController.swift in Sources */, + 12C6C46221F029C40001D33E /* LocalImgController.swift in Sources */, + 12C6C45F21F029C40001D33E /* SBController.swift in Sources */, + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + 12C6C46121F029C40001D33E /* NoPageControlController.swift in Sources */, + 12C6C46421F029C40001D33E /* StandaloneDotController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 607FACCF1AFB9204008FA782 /* WRCycleScrollView_Example */; + targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 607FACD91AFB9204008FA782 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 607FACDA1AFB9204008FA782 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 607FACDF1AFB9204008FA782 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 607FACED1AFB9204008FA782 /* 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_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_NON_LITERAL_NULL_CONVERSION = 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + 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 = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + 607FACEE1AFB9204008FA782 /* 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_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_NON_LITERAL_NULL_CONVERSION = 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + 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 = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 607FACF01AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 023C7BDEAAEC3F730B72769F /* Pods-WRCycleScrollView_Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = P3X2725LYY; + INFOPLIST_FILE = WRCycleScrollView/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + 607FACF11AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2AA609AC589E7A08E11A90E7 /* Pods-WRCycleScrollView_Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = P3X2725LYY; + INFOPLIST_FILE = WRCycleScrollView/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BDE4FD60B892993ED428E29B /* Pods-WRCycleScrollView_Tests.debug.xcconfig */; + buildSettings = { + DEVELOPMENT_TEAM = P3X2725LYY; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WRCycleScrollView_Example.app/WRCycleScrollView_Example"; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 59A763A0490411F8055759E1 /* Pods-WRCycleScrollView_Tests.release.xcconfig */; + buildSettings = { + DEVELOPMENT_TEAM = P3X2725LYY; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WRCycleScrollView_Example.app/WRCycleScrollView_Example"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "WRCycleScrollView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WRCycleScrollView_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF01AFB9204008FA782 /* Debug */, + 607FACF11AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WRCycleScrollView_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/WRCycleScrollView.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 65% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Example/WRCycleScrollView.xcodeproj/project.xcworkspace/contents.xcworkspacedata index d689ca1..51e4e64 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Example/WRCycleScrollView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:WRCycleScrollView.xcodeproj"> diff --git a/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme b/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme new file mode 100644 index 0000000..aa1326e --- /dev/null +++ b/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/contents.xcworkspacedata b/Example/WRCycleScrollView.xcworkspace/contents.xcworkspacedata similarity index 75% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/contents.xcworkspacedata rename to Example/WRCycleScrollView.xcworkspace/contents.xcworkspacedata index 77e4bce..74dd24a 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/contents.xcworkspacedata +++ b/Example/WRCycleScrollView.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:WRCycleScrollView.xcodeproj"> diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/WRCycleScrollView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Example/WRCycleScrollView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift b/Example/WRCycleScrollView/AppDelegate.swift similarity index 97% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift rename to Example/WRCycleScrollView/AppDelegate.swift index e695298..a8cd60b 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/AppDelegate.swift +++ b/Example/WRCycleScrollView/AppDelegate.swift @@ -24,16 +24,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - + window = UIWindow.init(frame: UIScreen.main.bounds) window?.backgroundColor = UIColor.white - + let nav = BaseNavigationController.init(rootViewController: DemoListController()) window?.rootViewController = nav window?.makeKeyAndVisible() - + setNavBarAppearence() - + return true } diff --git a/Example/WRCycleScrollView/Base.lproj/LaunchScreen.xib b/Example/WRCycleScrollView/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..0fbd577 --- /dev/null +++ b/Example/WRCycleScrollView/Base.lproj/LaunchScreen.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Base.lproj/LaunchScreen.storyboard b/Example/WRCycleScrollView/Base.lproj/Main.storyboard similarity index 57% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Base.lproj/LaunchScreen.storyboard rename to Example/WRCycleScrollView/Base.lproj/Main.storyboard index fdf3f97..b8dd8f2 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Base.lproj/LaunchScreen.storyboard +++ b/Example/WRCycleScrollView/Base.lproj/Main.storyboard @@ -1,27 +1,30 @@ - - + + + + + - + + - + - + - - + + - + - + - + - diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/CustomDotController.swift b/Example/WRCycleScrollView/CustomDotController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/CustomDotController.swift rename to Example/WRCycleScrollView/CustomDotController.swift index 9b88700..1b4d43b 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/CustomDotController.swift +++ b/Example/WRCycleScrollView/CustomDotController.swift @@ -7,6 +7,7 @@ // import UIKit +import WRCycleScrollView class CustomDotController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/DemoListController.swift b/Example/WRCycleScrollView/DemoListController.swift similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/DemoListController.swift rename to Example/WRCycleScrollView/DemoListController.swift diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/AppIcon.appiconset/wr@2x.png b/Example/WRCycleScrollView/Images.xcassets/AppIcon.appiconset/wr@2x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/AppIcon.appiconset/wr@2x.png rename to Example/WRCycleScrollView/Images.xcassets/AppIcon.appiconset/wr@2x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/AppIcon.appiconset/wr@3x.png b/Example/WRCycleScrollView/Images.xcassets/AppIcon.appiconset/wr@3x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/AppIcon.appiconset/wr@3x.png rename to Example/WRCycleScrollView/Images.xcassets/AppIcon.appiconset/wr@3x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/Contents.json b/Example/WRCycleScrollView/Images.xcassets/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/Contents.json b/Example/WRCycleScrollView/Images.xcassets/dot/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/dot/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/slider_current_dot.png b/Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/slider_current_dot.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/slider_current_dot.png rename to Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/slider_current_dot.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/slider_current_dot@2x.png b/Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/slider_current_dot@2x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/slider_current_dot@2x.png rename to Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/slider_current_dot@2x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/slider_current_dot@3x.png b/Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/slider_current_dot@3x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/currentDot.imageset/slider_current_dot@3x.png rename to Example/WRCycleScrollView/Images.xcassets/dot/currentDot.imageset/slider_current_dot@3x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/slider_default_dot.png b/Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/slider_default_dot.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/slider_default_dot.png rename to Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/slider_default_dot.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/slider_default_dot@2x.png b/Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/slider_default_dot@2x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/slider_default_dot@2x.png rename to Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/slider_default_dot@2x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/slider_default_dot@3x.png b/Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/slider_default_dot@3x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/dot/defaultDot.imageset/slider_default_dot@3x.png rename to Example/WRCycleScrollView/Images.xcassets/dot/defaultDot.imageset/slider_default_dot@3x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image11.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/image11.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image11.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/image11.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image11.imageset/image11.png b/Example/WRCycleScrollView/Images.xcassets/image11.imageset/image11.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image11.imageset/image11.png rename to Example/WRCycleScrollView/Images.xcassets/image11.imageset/image11.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image12.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/image12.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image12.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/image12.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image12.imageset/image12.jpg b/Example/WRCycleScrollView/Images.xcassets/image12.imageset/image12.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image12.imageset/image12.jpg rename to Example/WRCycleScrollView/Images.xcassets/image12.imageset/image12.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image13.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/image13.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image13.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/image13.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image13.imageset/image13.png b/Example/WRCycleScrollView/Images.xcassets/image13.imageset/image13.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image13.imageset/image13.png rename to Example/WRCycleScrollView/Images.xcassets/image13.imageset/image13.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image14.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/image14.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image14.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/image14.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image14.imageset/image14.jpg b/Example/WRCycleScrollView/Images.xcassets/image14.imageset/image14.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image14.imageset/image14.jpg rename to Example/WRCycleScrollView/Images.xcassets/image14.imageset/image14.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image15.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/image15.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image15.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/image15.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image15.imageset/image15.jpg b/Example/WRCycleScrollView/Images.xcassets/image15.imageset/image15.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/image15.imageset/image15.jpg rename to Example/WRCycleScrollView/Images.xcassets/image15.imageset/image15.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg1.imageset/1.png b/Example/WRCycleScrollView/Images.xcassets/localImg1.imageset/1.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg1.imageset/1.png rename to Example/WRCycleScrollView/Images.xcassets/localImg1.imageset/1.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg1.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg1.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg1.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg1.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg10.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg10.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg10.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg10.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg10.imageset/localImg10.jpg b/Example/WRCycleScrollView/Images.xcassets/localImg10.imageset/localImg10.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg10.imageset/localImg10.jpg rename to Example/WRCycleScrollView/Images.xcassets/localImg10.imageset/localImg10.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg2.imageset/2.png b/Example/WRCycleScrollView/Images.xcassets/localImg2.imageset/2.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg2.imageset/2.png rename to Example/WRCycleScrollView/Images.xcassets/localImg2.imageset/2.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg2.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg2.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg2.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg2.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg3.imageset/3.png b/Example/WRCycleScrollView/Images.xcassets/localImg3.imageset/3.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg3.imageset/3.png rename to Example/WRCycleScrollView/Images.xcassets/localImg3.imageset/3.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg3.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg3.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg3.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg3.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg4.imageset/4.png b/Example/WRCycleScrollView/Images.xcassets/localImg4.imageset/4.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg4.imageset/4.png rename to Example/WRCycleScrollView/Images.xcassets/localImg4.imageset/4.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg4.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg4.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg4.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg4.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg5.imageset/5.png b/Example/WRCycleScrollView/Images.xcassets/localImg5.imageset/5.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg5.imageset/5.png rename to Example/WRCycleScrollView/Images.xcassets/localImg5.imageset/5.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg5.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg5.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg5.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg5.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg6.imageset/6.jpg b/Example/WRCycleScrollView/Images.xcassets/localImg6.imageset/6.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg6.imageset/6.jpg rename to Example/WRCycleScrollView/Images.xcassets/localImg6.imageset/6.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg6.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg6.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg6.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg6.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg7.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg7.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg7.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg7.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg7.imageset/localImg7.jpg b/Example/WRCycleScrollView/Images.xcassets/localImg7.imageset/localImg7.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg7.imageset/localImg7.jpg rename to Example/WRCycleScrollView/Images.xcassets/localImg7.imageset/localImg7.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg8.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg8.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg8.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg8.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg8.imageset/localImg8.jpg b/Example/WRCycleScrollView/Images.xcassets/localImg8.imageset/localImg8.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg8.imageset/localImg8.jpg rename to Example/WRCycleScrollView/Images.xcassets/localImg8.imageset/localImg8.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg9.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/localImg9.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg9.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/localImg9.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg9.imageset/localImg9.jpg b/Example/WRCycleScrollView/Images.xcassets/localImg9.imageset/localImg9.jpg similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/localImg9.imageset/localImg9.jpg rename to Example/WRCycleScrollView/Images.xcassets/localImg9.imageset/localImg9.jpg diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/Contents.json b/Example/WRCycleScrollView/Images.xcassets/placeholder/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/placeholder/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/placeholder_720x360.imageset/Contents.json b/Example/WRCycleScrollView/Images.xcassets/placeholder/placeholder_720x360.imageset/Contents.json similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/placeholder_720x360.imageset/Contents.json rename to Example/WRCycleScrollView/Images.xcassets/placeholder/placeholder_720x360.imageset/Contents.json diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@2x.png b/Example/WRCycleScrollView/Images.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@2x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@2x.png rename to Example/WRCycleScrollView/Images.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@2x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@3x.png b/Example/WRCycleScrollView/Images.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@3x.png similarity index 100% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@3x.png rename to Example/WRCycleScrollView/Images.xcassets/placeholder/placeholder_720x360.imageset/placeholder_720x360@3x.png diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Info.plist b/Example/WRCycleScrollView/Info.plist similarity index 72% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/Info.plist rename to Example/WRCycleScrollView/Info.plist index 5d50898..1debf73 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Info.plist +++ b/Example/WRCycleScrollView/Info.plist @@ -6,10 +6,6 @@ en CFBundleExecutable $(EXECUTABLE_NAME) - CFBundleIcons - - CFBundleIcons~ipad - CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -20,17 +16,16 @@ APPL CFBundleShortVersionString 1.0 + CFBundleSignature + ???? CFBundleVersion 1 LSRequiresIPhoneOS - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - UILaunchStoryboardName LaunchScreen + UIMainStoryboardFile + Main UIRequiredDeviceCapabilities armv7 @@ -39,14 +34,11 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/LocalImgController.swift b/Example/WRCycleScrollView/LocalImgController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/LocalImgController.swift rename to Example/WRCycleScrollView/LocalImgController.swift index 40b2309..de7a268 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/LocalImgController.swift +++ b/Example/WRCycleScrollView/LocalImgController.swift @@ -8,6 +8,7 @@ // Github地址:https://github.com/wangrui460/WRCycleScrollView import UIKit +import WRCycleScrollView class LocalImgController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/NoEndlessController.swift b/Example/WRCycleScrollView/NoEndlessController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/NoEndlessController.swift rename to Example/WRCycleScrollView/NoEndlessController.swift index 79f833d..3cb4fab 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/NoEndlessController.swift +++ b/Example/WRCycleScrollView/NoEndlessController.swift @@ -8,6 +8,7 @@ // Github地址:https://github.com/wangrui460/WRCycleScrollView import UIKit +import WRCycleScrollView class NoEndlessController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/NoPageControlController.swift b/Example/WRCycleScrollView/NoPageControlController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/NoPageControlController.swift rename to Example/WRCycleScrollView/NoPageControlController.swift index beaac71..98eb014 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/NoPageControlController.swift +++ b/Example/WRCycleScrollView/NoPageControlController.swift @@ -8,6 +8,7 @@ // Github地址:https://github.com/wangrui460/WRCycleScrollView import UIKit +import WRCycleScrollView class NoPageControlController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/SBController.swift b/Example/WRCycleScrollView/SBController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/SBController.swift rename to Example/WRCycleScrollView/SBController.swift index 94bc307..65ef36c 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/SBController.swift +++ b/Example/WRCycleScrollView/SBController.swift @@ -7,6 +7,7 @@ // import UIKit +import WRCycleScrollView class SBController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ServerImgController.swift b/Example/WRCycleScrollView/ServerImgController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/ServerImgController.swift rename to Example/WRCycleScrollView/ServerImgController.swift index f0599d5..74f256d 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ServerImgController.swift +++ b/Example/WRCycleScrollView/ServerImgController.swift @@ -8,6 +8,7 @@ // Github地址:https://github.com/wangrui460/WRCycleScrollView import UIKit +import WRCycleScrollView class ServerImgController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/StandaloneDotController.swift b/Example/WRCycleScrollView/StandaloneDotController.swift similarity index 98% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/StandaloneDotController.swift rename to Example/WRCycleScrollView/StandaloneDotController.swift index b378e67..9c65192 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/StandaloneDotController.swift +++ b/Example/WRCycleScrollView/StandaloneDotController.swift @@ -7,6 +7,7 @@ // import UIKit +import WRCycleScrollView class StandaloneDotController: UIViewController { diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/StoryBoardController.storyboard b/Example/WRCycleScrollView/StoryBoardController.storyboard similarity index 83% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/StoryBoardController.storyboard rename to Example/WRCycleScrollView/StoryBoardController.storyboard index 7098da5..6d5db4b 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/StoryBoardController.storyboard +++ b/Example/WRCycleScrollView/StoryBoardController.storyboard @@ -1,19 +1,18 @@ - + - - + - + @@ -22,7 +21,7 @@ - + @@ -38,7 +37,7 @@ - + diff --git a/Example/WRCycleScrollView/ViewController.swift b/Example/WRCycleScrollView/ViewController.swift new file mode 100644 index 0000000..645b891 --- /dev/null +++ b/Example/WRCycleScrollView/ViewController.swift @@ -0,0 +1,24 @@ +// +// ViewController.swift +// WRCycleScrollView +// +// Created by EyreFree on 01/17/2019. +// Copyright (c) 2019 EyreFree. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + +} + diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift b/Example/WRCycleScrollView/ZhiHuController.swift similarity index 99% rename from WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift rename to Example/WRCycleScrollView/ZhiHuController.swift index 6044d45..39d4672 100644 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/ZhiHuController.swift +++ b/Example/WRCycleScrollView/ZhiHuController.swift @@ -8,6 +8,7 @@ // Github地址:https://github.com/wangrui460/WRNavigationBar_swift import UIKit +import WRCycleScrollView private let NAVBAR_COLORCHANGE_POINT:CGFloat = -80 private let IMAGE_HEIGHT:CGFloat = 240 diff --git a/WRCycleScrollView.podspec b/WRCycleScrollView.podspec new file mode 100644 index 0000000..772cc9f --- /dev/null +++ b/WRCycleScrollView.podspec @@ -0,0 +1,23 @@ +Pod::Spec.new do |s| + s.name = 'WRCycleScrollView' + s.version = '0.1.0' + s.summary = 'A cycle scroll view in Swift.' + + s.description = <<-DESC +'WRCycleScrollView, the only cycle scroll view you need in iOS.' + DESC + + s.homepage = 'https://github.com/wangrui460/WRCycleScrollView' + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'wangrui460' => 'wangruidev@gmail.com' } + s.source = { :git => 'https://github.com/wangrui460/WRCycleScrollView.git', :tag => s.version.to_s } + # s.social_media_url = 'https://twitter.com/' + + s.swift_version = "4.2" + s.ios.deployment_target = '8.0' + + s.source_files = 'WRCycleScrollView/Classes/**/*' + + s.dependency 'Kingfisher', '>= 4.10.0' +end diff --git a/WRCycleScrollView/Assets/.gitkeep b/WRCycleScrollView/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/WRCycleScrollView/Classes/.gitkeep b/WRCycleScrollView/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/WRCycleScrollView/WRCycleCell.swift b/WRCycleScrollView/Classes/WRCycleCell.swift similarity index 96% rename from WRCycleScrollView/WRCycleCell.swift rename to WRCycleScrollView/Classes/WRCycleCell.swift index 6de62e9..cd55296 100644 --- a/WRCycleScrollView/WRCycleCell.swift +++ b/WRCycleScrollView/Classes/WRCycleCell.swift @@ -10,7 +10,7 @@ import UIKit import Kingfisher -class WRCycleCell: UICollectionViewCell +public class WRCycleCell: UICollectionViewCell { //======================================================= // MARK: 对外提供的属性 @@ -36,7 +36,7 @@ class WRCycleCell: UICollectionViewCell } } - override var frame: CGRect { + override public var frame: CGRect { didSet { bounds.size = frame.size } @@ -103,7 +103,7 @@ class WRCycleCell: UICollectionViewCell //======================================================= // MARK: 内部方法(layoutSubviews) //======================================================= - override func layoutSubviews() + override public func layoutSubviews() { super.layoutSubviews() imgView.frame = self.bounds @@ -124,7 +124,7 @@ class WRCycleCell: UICollectionViewCell //======================================================= // MARK: - 基本控件(图片、描述文字、底部view) //======================================================= -extension WRCycleCell +public extension WRCycleCell { fileprivate func setupImgView() { diff --git a/WRCycleScrollView/WRCycleScrollView.swift b/WRCycleScrollView/Classes/WRCycleScrollView.swift similarity index 86% rename from WRCycleScrollView/WRCycleScrollView.swift rename to WRCycleScrollView/Classes/WRCycleScrollView.swift index dcf5669..04521a2 100644 --- a/WRCycleScrollView/WRCycleScrollView.swift +++ b/WRCycleScrollView/Classes/WRCycleScrollView.swift @@ -10,7 +10,7 @@ import UIKit -@objc protocol WRCycleScrollViewDelegate +@objc public protocol WRCycleScrollViewDelegate { /// 点击图片回调 @objc optional func cycleScrollViewDidSelect(at index:Int, cycleScrollView:WRCycleScrollView) @@ -18,23 +18,23 @@ import UIKit @objc optional func cycleScrollViewDidScroll(to index:Int, cycleScrollView:WRCycleScrollView) } -class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtocol +public class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtocol { //======================================================= // MARK: 对外提供的属性 //======================================================= - weak var delegate:WRCycleScrollViewDelegate? + public weak var delegate:WRCycleScrollViewDelegate? - var outerPageControlFrame:CGRect? { + public var outerPageControlFrame:CGRect? { didSet { setupPageControl() } } /// 数据相关 - var imgsType:ImgType = .SERVER - var localImgArray :[String]? { + public var imgsType:ImgType = .SERVER + public var localImgArray :[String]? { didSet { if let local = localImgArray { proxy = Proxy(type: .LOCAL, array: local) @@ -42,7 +42,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc } } } - var serverImgArray:[String]? { + public var serverImgArray:[String]? { didSet { if let server = serverImgArray { proxy = Proxy(type: .SERVER, array: server) @@ -50,25 +50,25 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc } } } - var descTextArray :[String]? - var placeholderImage: UIImage? + public var descTextArray :[String]? + public var placeholderImage: UIImage? /// WRCycleCell相关 - var imageContentModel: UIView.ContentMode? - var descLabelFont: UIFont? - var descLabelTextColor: UIColor? - var descLabelHeight: CGFloat? - var descLabelTextAlignment:NSTextAlignment? - var bottomViewBackgroundColor: UIColor? + public var imageContentModel: UIView.ContentMode? + public var descLabelFont: UIFont? + public var descLabelTextColor: UIColor? + public var descLabelHeight: CGFloat? + public var descLabelTextAlignment:NSTextAlignment? + public var bottomViewBackgroundColor: UIColor? /// 主要功能需求相关 - override var frame: CGRect { + override public var frame: CGRect { didSet { flowLayout?.itemSize = frame.size collectionView?.frame = bounds } } - var isAutoScroll:Bool = true { + public var isAutoScroll:Bool = true { didSet { timer?.invalidate() timer = nil @@ -77,41 +77,41 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc } } } - var isEndlessScroll:Bool = true { + public var isEndlessScroll:Bool = true { didSet { reloadData() } } - var autoScrollInterval: Double = 1.5 + public var autoScrollInterval: Double = 1.5 /// pageControl相关 - var pageControlAliment: PageControlAliment = .CenterBottom - var defaultPageDotImage: UIImage? { + public var pageControlAliment: PageControlAliment = .CenterBottom + public var defaultPageDotImage: UIImage? { didSet { setupPageControl() } } - var currentPageDotImage: UIImage? { + public var currentPageDotImage: UIImage? { didSet { setupPageControl() } } - var pageControlPointSpace: CGFloat = 15 { + public var pageControlPointSpace: CGFloat = 15 { didSet { setupPageControl() } } - var showPageControl: Bool = true { + public var showPageControl: Bool = true { didSet { setupPageControl() } } - var currentDotColor: UIColor = UIColor.orange { + public var currentDotColor: UIColor = UIColor.orange { didSet { self.pageControl?.currentPageIndicatorTintColor = currentDotColor } } - var otherDotColor: UIColor = UIColor.gray { + public var otherDotColor: UIColor = UIColor.gray { didSet { self.pageControl?.pageIndicatorTintColor = otherDotColor } @@ -120,7 +120,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc //======================================================= // MARK: 对外提供的方法 //======================================================= - func reloadData() + public func reloadData() { timer?.invalidate() timer = nil @@ -150,11 +150,11 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc //======================================================= // MARK: 内部属性 //======================================================= - let endlessScrollTimes:Int = 128 + public let endlessScrollTimes:Int = 128 fileprivate var imgsCount:Int { return (isEndlessScroll == true) ? (itemsInSection / endlessScrollTimes) : itemsInSection } - var itemsInSection:Int { + public var itemsInSection:Int { guard let imgs = proxy?.imgArray else { return 0 } @@ -181,7 +181,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc fileprivate var collectionView:UICollectionView? fileprivate let CellID = "WRCycleCell" fileprivate var pageControl:WRPageControl? - var timer:Timer? + public var timer:Timer? // 标识子控件是否布局完成,布局完成后在layoutSubviews方法中就不执行 changeToFirstCycleCell 方法 fileprivate var isLoadOver = false @@ -196,7 +196,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc /// - type: ImagesType default:Server /// - imgs: localImgArray / serverImgArray default:nil /// - descs: descTextArray default:nil - init(frame: CGRect, type:ImgType = .SERVER, imgs:[String]? = nil, descs:[String]? = nil, defaultDotImage:UIImage? = nil, currentDotImage:UIImage? = nil, placeholderImage:UIImage? = nil) + public init(frame: CGRect, type:ImgType = .SERVER, imgs:[String]? = nil, descs:[String]? = nil, defaultDotImage:UIImage? = nil, currentDotImage:UIImage? = nil, placeholderImage:UIImage? = nil) { super.init(frame: frame) setupCollectionView() @@ -221,7 +221,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc reloadData() } - required init?(coder aDecoder: NSCoder) { + public required init?(coder aDecoder: NSCoder) { // 支持StoryBoard创建 super.init(coder: aDecoder) self.setupCollectionView() @@ -235,7 +235,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc //======================================================= // MARK: 内部方法(layoutSubviews、willMove) //======================================================= - override func layoutSubviews() + override public func layoutSubviews() { super.layoutSubviews() // 解决WRCycleCell自动偏移问题 @@ -257,7 +257,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc } } - override func willMove(toSuperview newSuperview: UIView?) + override public func willMove(toSuperview newSuperview: UIView?) { // 解决定时器导致的循环引用 super.willMove(toSuperview: newSuperview) // 展现的时候newSuper不为nil,离开的时候newSuper为nil @@ -272,7 +272,7 @@ class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtoc //======================================================= // MARK: - 定时器、自动滚动、scrollView代理方法 //======================================================= -extension WRCycleScrollView +public extension WRCycleScrollView { func setupTimer() { @@ -326,7 +326,7 @@ extension WRCycleScrollView //======================================================= // MARK: - pageControl页面 //======================================================= -extension WRCycleScrollView +public extension WRCycleScrollView { fileprivate func setupPageControl() { diff --git a/WRCycleScrollView/WRPageControl.swift b/WRCycleScrollView/Classes/WRPageControl.swift similarity index 96% rename from WRCycleScrollView/WRPageControl.swift rename to WRCycleScrollView/Classes/WRPageControl.swift index 4c6208f..84e5870 100644 --- a/WRCycleScrollView/WRPageControl.swift +++ b/WRCycleScrollView/Classes/WRPageControl.swift @@ -11,7 +11,7 @@ import UIKit private let WRPageControlPointWidth: CGFloat = 7 private let WRPageControlPointHeight: CGFloat = 20 -class WRPageControl: UIPageControl +public class WRPageControl: UIPageControl { var currentImage: UIImage? var defaultImage: UIImage? @@ -32,7 +32,7 @@ class WRPageControl: UIPageControl } } - override var currentPage: Int { + override public var currentPage: Int { didSet { updatePageControl() } @@ -51,7 +51,7 @@ class WRPageControl: UIPageControl // MARK: - update index -extension WRPageControl +public extension WRPageControl { func updatePageControl() { diff --git a/WRCycleScrollView/WRProxy.swift b/WRCycleScrollView/Classes/WRProxy.swift similarity index 94% rename from WRCycleScrollView/WRProxy.swift rename to WRCycleScrollView/Classes/WRProxy.swift index 7a2424b..f6791a3 100644 --- a/WRCycleScrollView/WRProxy.swift +++ b/WRCycleScrollView/Classes/WRProxy.swift @@ -13,18 +13,18 @@ import UIKit ///////////////////////////////////////////////////////////////////////////// // 图片资源 -enum ImgSource { +public enum ImgSource { case SERVER(url:URL) case LOCAL(name:String) } // 图片类型 -enum ImgType:Int { +public enum ImgType:Int { case SERVER = 0 // default case LOCAL = 1 } -struct Proxy +public struct Proxy { var imgType:ImgType = .SERVER var imgArray:[ImgSource] = [ImgSource]() @@ -63,13 +63,13 @@ struct Proxy private let WRPageControlMargin: CGFloat = 15 private let WRPageControlPointWidth: CGFloat = 2 -enum PageControlAliment { +public enum PageControlAliment { case CenterBottom case RightBottom case LeftBottom } -protocol PageControlAlimentProtocol +public protocol PageControlAlimentProtocol { // Property in protocol must have explicit { get } or { get set } specifier var pageControlAliment: PageControlAliment { get set } @@ -78,7 +78,7 @@ protocol PageControlAlimentProtocol func relayoutPageControl(pageControl: WRPageControl, outerFrame:CGRect) } -extension PageControlAlimentProtocol where Self : UIView +public extension PageControlAlimentProtocol where Self : UIView { // TODO: 等待优化 func relayoutPageControl(pageControl: WRPageControl) { @@ -113,7 +113,7 @@ extension PageControlAlimentProtocol where Self : UIView // MARK: 无限轮播 相关 ///////////////////////////////////////////////////////////////////////////// -protocol EndlessScrollProtocol +public protocol EndlessScrollProtocol { ///////////////////////////////// /// 是否自动滚动 @@ -138,7 +138,7 @@ protocol EndlessScrollProtocol func changeToFirstCycleCell(animated: Bool, collectionView: UICollectionView) } -extension EndlessScrollProtocol where Self : UIView +public extension EndlessScrollProtocol where Self : UIView { func changeCycleCell(collectionView: UICollectionView) { diff --git a/WRCycleScrollViewDemo/Podfile b/WRCycleScrollViewDemo/Podfile deleted file mode 100644 index a759433..0000000 --- a/WRCycleScrollViewDemo/Podfile +++ /dev/null @@ -1,21 +0,0 @@ -# Uncomment this line to define a global platform for your project - -#官方Cocoapods的源/Users/eyrefree/Documents/XWS/WRCycleScrollView/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj -#source 'https://github.com/CocoaPods/Specs.git' - -#本地私有源 -#source 'https://git.oschina.net/scx/JLSpecs.git' - -# 本项目地址 -#source https://github.com/wangrui460 - -# 修改过得第三方库 - - -platform :ios, '8.0' -use_frameworks! - -target 'WRCycleScrollViewDemo' do - pod 'Kingfisher', '4.10.1' - pod 'WRNavigationBar_swift', :git => 'https://github.com/EFRenovation/WRNavigationBar_swift.git' -end diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-dummy.m b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-dummy.m deleted file mode 100644 index c4b7f15..0000000 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_WRCycleScrollViewDemo : NSObject -@end -@implementation PodsDummy_Pods_WRCycleScrollViewDemo -@end diff --git a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap b/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap deleted file mode 100644 index ca54950..0000000 --- a/WRCycleScrollViewDemo/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_WRCycleScrollViewDemo { - umbrella header "Pods-WRCycleScrollViewDemo-umbrella.h" - - export * - module * { export * } -} diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj b/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj deleted file mode 100644 index c704f36..0000000 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,552 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 12C6C44F21F023DA0001D33E /* WRCycleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44B21F023DA0001D33E /* WRCycleScrollView.swift */; }; - 12C6C45021F023DA0001D33E /* WRProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44C21F023DA0001D33E /* WRProxy.swift */; }; - 12C6C45121F023DA0001D33E /* WRPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44D21F023DA0001D33E /* WRPageControl.swift */; }; - 12C6C45221F023DA0001D33E /* WRCycleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C6C44E21F023DA0001D33E /* WRCycleCell.swift */; }; - 1A09DC171F0535A40046E853 /* NoEndlessController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC161F0535A40046E853 /* NoEndlessController.swift */; }; - 1A09DC191F0536A20046E853 /* NoPageControlController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC181F0536A20046E853 /* NoPageControlController.swift */; }; - 1A09DC1E1F05431B0046E853 /* ZhiHuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A09DC1D1F05431B0046E853 /* ZhiHuController.swift */; }; - 1A5D14121EFA3B6A00FD1F5F /* StoryBoardController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A5D14111EFA3B6A00FD1F5F /* StoryBoardController.storyboard */; }; - 1A5D14141EFA3FA700FD1F5F /* SBController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A5D14131EFA3FA700FD1F5F /* SBController.swift */; }; - 1AC097B51EC58670000F7206 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097B41EC58670000F7206 /* AppDelegate.swift */; }; - 1AC097B71EC58670000F7206 /* LocalImgController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097B61EC58670000F7206 /* LocalImgController.swift */; }; - 1AC097BC1EC58670000F7206 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1AC097BB1EC58670000F7206 /* Assets.xcassets */; }; - 1AC097BF1EC58670000F7206 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1AC097BD1EC58670000F7206 /* LaunchScreen.storyboard */; }; - 1AC097CA1EC58670000F7206 /* WRCycleScrollViewDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097C91EC58670000F7206 /* WRCycleScrollViewDemoTests.swift */; }; - 1AC097D51EC5ADB4000F7206 /* DemoListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097D41EC5ADB4000F7206 /* DemoListController.swift */; }; - 1AC097D71EC5B2E9000F7206 /* ServerImgController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AC097D61EC5B2E9000F7206 /* ServerImgController.swift */; }; - 3425F3521FBAE049000666C8 /* CustomDotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3425F3511FBAE049000666C8 /* CustomDotController.swift */; }; - 3425F3541FBAECCE000666C8 /* StandaloneDotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3425F3531FBAECCE000666C8 /* StandaloneDotController.swift */; }; - FF78CC64A5D22B4B3B0104A1 /* Pods_WRCycleScrollViewDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78F99DB515338C31DDC6F59E /* Pods_WRCycleScrollViewDemo.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1AC097C61EC58670000F7206 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1AC097A91EC58670000F7206 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1AC097B01EC58670000F7206; - remoteInfo = WRCycleScrollViewDemo; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 12C6C44B21F023DA0001D33E /* WRCycleScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRCycleScrollView.swift; path = ../../../WRCycleScrollView/WRCycleScrollView.swift; sourceTree = ""; }; - 12C6C44C21F023DA0001D33E /* WRProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRProxy.swift; path = ../../../WRCycleScrollView/WRProxy.swift; sourceTree = ""; }; - 12C6C44D21F023DA0001D33E /* WRPageControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRPageControl.swift; path = ../../../WRCycleScrollView/WRPageControl.swift; sourceTree = ""; }; - 12C6C44E21F023DA0001D33E /* WRCycleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WRCycleCell.swift; path = ../../../WRCycleScrollView/WRCycleCell.swift; sourceTree = ""; }; - 1A09DC161F0535A40046E853 /* NoEndlessController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoEndlessController.swift; sourceTree = ""; }; - 1A09DC181F0536A20046E853 /* NoPageControlController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoPageControlController.swift; sourceTree = ""; }; - 1A09DC1D1F05431B0046E853 /* ZhiHuController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZhiHuController.swift; sourceTree = ""; }; - 1A5D14111EFA3B6A00FD1F5F /* StoryBoardController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = StoryBoardController.storyboard; sourceTree = ""; }; - 1A5D14131EFA3FA700FD1F5F /* SBController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SBController.swift; sourceTree = ""; }; - 1AC097B11EC58670000F7206 /* WRCycleScrollViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WRCycleScrollViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1AC097B41EC58670000F7206 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 1AC097B61EC58670000F7206 /* LocalImgController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalImgController.swift; sourceTree = ""; }; - 1AC097BB1EC58670000F7206 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 1AC097BE1EC58670000F7206 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 1AC097C01EC58670000F7206 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1AC097C51EC58670000F7206 /* WRCycleScrollViewDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WRCycleScrollViewDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1AC097C91EC58670000F7206 /* WRCycleScrollViewDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WRCycleScrollViewDemoTests.swift; sourceTree = ""; }; - 1AC097CB1EC58670000F7206 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1AC097D41EC5ADB4000F7206 /* DemoListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoListController.swift; sourceTree = ""; }; - 1AC097D61EC5B2E9000F7206 /* ServerImgController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerImgController.swift; sourceTree = ""; }; - 3425F3511FBAE049000666C8 /* CustomDotController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDotController.swift; sourceTree = ""; }; - 3425F3531FBAECCE000666C8 /* StandaloneDotController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandaloneDotController.swift; sourceTree = ""; }; - 78F99DB515338C31DDC6F59E /* Pods_WRCycleScrollViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WRCycleScrollViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 90A77BF7D3C01D069D4434A6 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WRCycleScrollViewDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.debug.xcconfig"; sourceTree = ""; }; - 9E50E5441E9DD2F1F27ABDDF /* Pods-WRCycleScrollViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WRCycleScrollViewDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1AC097AE1EC58670000F7206 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FF78CC64A5D22B4B3B0104A1 /* Pods_WRCycleScrollViewDemo.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1AC097C21EC58670000F7206 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 12C6C44A21F023C80001D33E /* WRCycleScrollView */ = { - isa = PBXGroup; - children = ( - 12C6C44E21F023DA0001D33E /* WRCycleCell.swift */, - 12C6C44B21F023DA0001D33E /* WRCycleScrollView.swift */, - 12C6C44D21F023DA0001D33E /* WRPageControl.swift */, - 12C6C44C21F023DA0001D33E /* WRProxy.swift */, - ); - path = WRCycleScrollView; - sourceTree = ""; - }; - 1AC097A81EC58670000F7206 = { - isa = PBXGroup; - children = ( - 1AC097B31EC58670000F7206 /* WRCycleScrollViewDemo */, - 1AC097C81EC58670000F7206 /* WRCycleScrollViewDemoTests */, - 1AC097B21EC58670000F7206 /* Products */, - 7434DA17364FCE0371E74C6F /* Pods */, - 236F58F6AC6ABB96E39A2765 /* Frameworks */, - ); - sourceTree = ""; - }; - 1AC097B21EC58670000F7206 /* Products */ = { - isa = PBXGroup; - children = ( - 1AC097B11EC58670000F7206 /* WRCycleScrollViewDemo.app */, - 1AC097C51EC58670000F7206 /* WRCycleScrollViewDemoTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 1AC097B31EC58670000F7206 /* WRCycleScrollViewDemo */ = { - isa = PBXGroup; - children = ( - 12C6C44A21F023C80001D33E /* WRCycleScrollView */, - 1AC097B41EC58670000F7206 /* AppDelegate.swift */, - 1AC097D41EC5ADB4000F7206 /* DemoListController.swift */, - 1AC097B61EC58670000F7206 /* LocalImgController.swift */, - 1AC097D61EC5B2E9000F7206 /* ServerImgController.swift */, - 1A5D14111EFA3B6A00FD1F5F /* StoryBoardController.storyboard */, - 1A5D14131EFA3FA700FD1F5F /* SBController.swift */, - 1A09DC161F0535A40046E853 /* NoEndlessController.swift */, - 1A09DC181F0536A20046E853 /* NoPageControlController.swift */, - 1A09DC1D1F05431B0046E853 /* ZhiHuController.swift */, - 3425F3511FBAE049000666C8 /* CustomDotController.swift */, - 3425F3531FBAECCE000666C8 /* StandaloneDotController.swift */, - 1AC097BB1EC58670000F7206 /* Assets.xcassets */, - 1AC097BD1EC58670000F7206 /* LaunchScreen.storyboard */, - 1AC097C01EC58670000F7206 /* Info.plist */, - ); - path = WRCycleScrollViewDemo; - sourceTree = ""; - }; - 1AC097C81EC58670000F7206 /* WRCycleScrollViewDemoTests */ = { - isa = PBXGroup; - children = ( - 1AC097C91EC58670000F7206 /* WRCycleScrollViewDemoTests.swift */, - 1AC097CB1EC58670000F7206 /* Info.plist */, - ); - path = WRCycleScrollViewDemoTests; - sourceTree = ""; - }; - 236F58F6AC6ABB96E39A2765 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 78F99DB515338C31DDC6F59E /* Pods_WRCycleScrollViewDemo.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7434DA17364FCE0371E74C6F /* Pods */ = { - isa = PBXGroup; - children = ( - 90A77BF7D3C01D069D4434A6 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */, - 9E50E5441E9DD2F1F27ABDDF /* Pods-WRCycleScrollViewDemo.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1AC097B01EC58670000F7206 /* WRCycleScrollViewDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1AC097CE1EC58670000F7206 /* Build configuration list for PBXNativeTarget "WRCycleScrollViewDemo" */; - buildPhases = ( - 7F653579B77CDD70B12E5D4B /* [CP] Check Pods Manifest.lock */, - 1AC097AD1EC58670000F7206 /* Sources */, - 1AC097AE1EC58670000F7206 /* Frameworks */, - 1AC097AF1EC58670000F7206 /* Resources */, - 3BAA828292BFB6653889EF22 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WRCycleScrollViewDemo; - productName = WRCycleScrollViewDemo; - productReference = 1AC097B11EC58670000F7206 /* WRCycleScrollViewDemo.app */; - productType = "com.apple.product-type.application"; - }; - 1AC097C41EC58670000F7206 /* WRCycleScrollViewDemoTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1AC097D11EC58670000F7206 /* Build configuration list for PBXNativeTarget "WRCycleScrollViewDemoTests" */; - buildPhases = ( - 1AC097C11EC58670000F7206 /* Sources */, - 1AC097C21EC58670000F7206 /* Frameworks */, - 1AC097C31EC58670000F7206 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1AC097C71EC58670000F7206 /* PBXTargetDependency */, - ); - name = WRCycleScrollViewDemoTests; - productName = WRCycleScrollViewDemoTests; - productReference = 1AC097C51EC58670000F7206 /* WRCycleScrollViewDemoTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1AC097A91EC58670000F7206 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0810; - LastUpgradeCheck = 0810; - ORGANIZATIONNAME = wangrui; - TargetAttributes = { - 1AC097B01EC58670000F7206 = { - CreatedOnToolsVersion = 8.1; - DevelopmentTeam = P3X2725LYY; - ProvisioningStyle = Automatic; - }; - 1AC097C41EC58670000F7206 = { - CreatedOnToolsVersion = 8.1; - DevelopmentTeam = P3X2725LYY; - ProvisioningStyle = Automatic; - TestTargetID = 1AC097B01EC58670000F7206; - }; - }; - }; - buildConfigurationList = 1AC097AC1EC58670000F7206 /* Build configuration list for PBXProject "WRCycleScrollViewDemo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 1AC097A81EC58670000F7206; - productRefGroup = 1AC097B21EC58670000F7206 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1AC097B01EC58670000F7206 /* WRCycleScrollViewDemo */, - 1AC097C41EC58670000F7206 /* WRCycleScrollViewDemoTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1AC097AF1EC58670000F7206 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1AC097BF1EC58670000F7206 /* LaunchScreen.storyboard in Resources */, - 1AC097BC1EC58670000F7206 /* Assets.xcassets in Resources */, - 1A5D14121EFA3B6A00FD1F5F /* StoryBoardController.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1AC097C31EC58670000F7206 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3BAA828292BFB6653889EF22 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework", - "${BUILT_PRODUCTS_DIR}/WRNavigationBar_swift/WRNavigationBar_swift.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WRNavigationBar_swift.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WRCycleScrollViewDemo/Pods-WRCycleScrollViewDemo-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 7F653579B77CDD70B12E5D4B /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-WRCycleScrollViewDemo-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 */ - 1AC097AD1EC58670000F7206 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1AC097D71EC5B2E9000F7206 /* ServerImgController.swift in Sources */, - 3425F3521FBAE049000666C8 /* CustomDotController.swift in Sources */, - 1AC097D51EC5ADB4000F7206 /* DemoListController.swift in Sources */, - 3425F3541FBAECCE000666C8 /* StandaloneDotController.swift in Sources */, - 12C6C45221F023DA0001D33E /* WRCycleCell.swift in Sources */, - 1AC097B71EC58670000F7206 /* LocalImgController.swift in Sources */, - 1AC097B51EC58670000F7206 /* AppDelegate.swift in Sources */, - 1A09DC191F0536A20046E853 /* NoPageControlController.swift in Sources */, - 1A09DC1E1F05431B0046E853 /* ZhiHuController.swift in Sources */, - 12C6C45021F023DA0001D33E /* WRProxy.swift in Sources */, - 12C6C44F21F023DA0001D33E /* WRCycleScrollView.swift in Sources */, - 12C6C45121F023DA0001D33E /* WRPageControl.swift in Sources */, - 1A5D14141EFA3FA700FD1F5F /* SBController.swift in Sources */, - 1A09DC171F0535A40046E853 /* NoEndlessController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1AC097C11EC58670000F7206 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1AC097CA1EC58670000F7206 /* WRCycleScrollViewDemoTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1AC097C71EC58670000F7206 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1AC097B01EC58670000F7206 /* WRCycleScrollViewDemo */; - targetProxy = 1AC097C61EC58670000F7206 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 1AC097BD1EC58670000F7206 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 1AC097BE1EC58670000F7206 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1AC097CC1EC58670000F7206 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - 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_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_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - 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_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.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1AC097CD1EC58670000F7206 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - 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_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_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - 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.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1AC097CF1EC58670000F7206 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 90A77BF7D3C01D069D4434A6 /* Pods-WRCycleScrollViewDemo.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - DEVELOPMENT_TEAM = P3X2725LYY; - INFOPLIST_FILE = WRCycleScrollViewDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; - }; - name = Debug; - }; - 1AC097D01EC58670000F7206 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9E50E5441E9DD2F1F27ABDDF /* Pods-WRCycleScrollViewDemo.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - DEVELOPMENT_TEAM = P3X2725LYY; - INFOPLIST_FILE = WRCycleScrollViewDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; - }; - name = Release; - }; - 1AC097D21EC58670000F7206 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = P3X2725LYY; - INFOPLIST_FILE = WRCycleScrollViewDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemoTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WRCycleScrollViewDemo.app/WRCycleScrollViewDemo"; - }; - name = Debug; - }; - 1AC097D31EC58670000F7206 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = P3X2725LYY; - INFOPLIST_FILE = WRCycleScrollViewDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = video.wangrui.com.WRCycleScrollViewDemoTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WRCycleScrollViewDemo.app/WRCycleScrollViewDemo"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1AC097AC1EC58670000F7206 /* Build configuration list for PBXProject "WRCycleScrollViewDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1AC097CC1EC58670000F7206 /* Debug */, - 1AC097CD1EC58670000F7206 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1AC097CE1EC58670000F7206 /* Build configuration list for PBXNativeTarget "WRCycleScrollViewDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1AC097CF1EC58670000F7206 /* Debug */, - 1AC097D01EC58670000F7206 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1AC097D11EC58670000F7206 /* Build configuration list for PBXNativeTarget "WRCycleScrollViewDemoTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1AC097D21EC58670000F7206 /* Debug */, - 1AC097D31EC58670000F7206 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1AC097A91EC58670000F7206 /* Project object */; -} diff --git a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json b/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index 5a29666..0000000 --- a/WRCycleScrollViewDemo/WRCycleScrollViewDemo/Assets.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj new file mode 120000 index 0000000..3c5a8e7 --- /dev/null +++ b/_Pods.xcodeproj @@ -0,0 +1 @@ +Example/Pods/Pods.xcodeproj \ No newline at end of file From e95d24763af80c7049bd14501979c3c4c5a1ab0b Mon Sep 17 00:00:00 2001 From: EyreFree Date: Thu, 17 Jan 2019 11:51:28 +0800 Subject: [PATCH 3/5] Update setting --- .swift-version | 1 + .../WRCycleScrollView.xcodeproj/project.pbxproj | 16 +++++++++------- .../xcschemes/WRCycleScrollView-Example.xcscheme | 4 +--- 3 files changed, 11 insertions(+), 10 deletions(-) create mode 100755 .swift-version diff --git a/.swift-version b/.swift-version new file mode 100755 index 0000000..bf77d54 --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +4.2 diff --git a/Example/WRCycleScrollView.xcodeproj/project.pbxproj b/Example/WRCycleScrollView.xcodeproj/project.pbxproj index 9555876..67bae9a 100644 --- a/Example/WRCycleScrollView.xcodeproj/project.pbxproj +++ b/Example/WRCycleScrollView.xcodeproj/project.pbxproj @@ -237,17 +237,15 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - DevelopmentTeam = P3X2725LYY; LastSwiftMigration = 0900; }; 607FACE41AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - DevelopmentTeam = P3X2725LYY; LastSwiftMigration = 0900; TestTargetID = 607FACCF1AFB9204008FA782; }; @@ -423,12 +421,14 @@ 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; @@ -477,12 +477,14 @@ 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; @@ -517,7 +519,7 @@ baseConfigurationReference = 023C7BDEAAEC3F730B72769F /* Pods-WRCycleScrollView_Example.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = P3X2725LYY; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = WRCycleScrollView/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; @@ -533,7 +535,7 @@ baseConfigurationReference = 2AA609AC589E7A08E11A90E7 /* Pods-WRCycleScrollView_Example.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = P3X2725LYY; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = WRCycleScrollView/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; @@ -548,7 +550,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = BDE4FD60B892993ED428E29B /* Pods-WRCycleScrollView_Tests.debug.xcconfig */; buildSettings = { - DEVELOPMENT_TEAM = P3X2725LYY; + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -571,7 +573,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 59A763A0490411F8055759E1 /* Pods-WRCycleScrollView_Tests.release.xcconfig */; buildSettings = { - DEVELOPMENT_TEAM = P3X2725LYY; + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", diff --git a/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme b/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme index aa1326e..87c5a6a 100644 --- a/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme +++ b/Example/WRCycleScrollView.xcodeproj/xcshareddata/xcschemes/WRCycleScrollView-Example.xcscheme @@ -1,6 +1,6 @@ Date: Thu, 17 Jan 2019 17:42:57 +0800 Subject: [PATCH 4/5] Make control public --- Example/Podfile | 1 + WRCycleScrollView.podspec | 2 -- WRCycleScrollView/Classes/WRCycleCell.swift | 6 +++--- WRCycleScrollView/Classes/WRCycleScrollView.swift | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index 2960977..559882a 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -3,6 +3,7 @@ use_frameworks! target 'WRCycleScrollView_Example' do pod 'WRCycleScrollView', :path => '../' pod 'WRNavigationBar_swift', :git => 'https://github.com/EFRenovation/WRNavigationBar_swift.git' + pod 'Kingfisher', '4.10.1' target 'WRCycleScrollView_Tests' do inherit! :search_paths diff --git a/WRCycleScrollView.podspec b/WRCycleScrollView.podspec index 772cc9f..0e4def7 100644 --- a/WRCycleScrollView.podspec +++ b/WRCycleScrollView.podspec @@ -18,6 +18,4 @@ Pod::Spec.new do |s| s.ios.deployment_target = '8.0' s.source_files = 'WRCycleScrollView/Classes/**/*' - - s.dependency 'Kingfisher', '>= 4.10.0' end diff --git a/WRCycleScrollView/Classes/WRCycleCell.swift b/WRCycleScrollView/Classes/WRCycleCell.swift index cd55296..a0354d9 100644 --- a/WRCycleScrollView/Classes/WRCycleCell.swift +++ b/WRCycleScrollView/Classes/WRCycleCell.swift @@ -77,9 +77,9 @@ public class WRCycleCell: UICollectionViewCell //======================================================= // MARK: 内部属性 //======================================================= - fileprivate var imgView:UIImageView! - fileprivate var descLabel:UILabel! - fileprivate var bottomView:UIView! + public var imgView:UIImageView! + public var descLabel:UILabel! + public var bottomView:UIView! //======================================================= // MARK: 构造方法 diff --git a/WRCycleScrollView/Classes/WRCycleScrollView.swift b/WRCycleScrollView/Classes/WRCycleScrollView.swift index 04521a2..0f6e3ff 100644 --- a/WRCycleScrollView/Classes/WRCycleScrollView.swift +++ b/WRCycleScrollView/Classes/WRCycleScrollView.swift @@ -178,7 +178,7 @@ public class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrol } fileprivate var proxy:Proxy! fileprivate var flowLayout:UICollectionViewFlowLayout? - fileprivate var collectionView:UICollectionView? + public var collectionView:UICollectionView? fileprivate let CellID = "WRCycleCell" fileprivate var pageControl:WRPageControl? public var timer:Timer? From 277e34023b5027f3e5eb110799797b38c2808546 Mon Sep 17 00:00:00 2001 From: EyreFree Date: Fri, 25 Jan 2019 18:34:01 +0800 Subject: [PATCH 5/5] Caching policy can be customized --- Example/Podfile.lock | 8 +- .../WRCycleScrollView.podspec.json | 7 +- Example/Pods/Manifest.lock | 8 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 865 +++++++++--------- .../WRCycleScrollView.xcconfig | 1 - Example/WRCycleScrollView/AppDelegate.swift | 8 + WRCycleScrollView/Classes/WRCycleCell.swift | 3 +- .../Classes/WRCycleScrollView.swift | 8 +- 8 files changed, 469 insertions(+), 439 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 6ca67f4..ec88c6a 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,10 +1,10 @@ PODS: - Kingfisher (4.10.1) - - WRCycleScrollView (0.1.0): - - Kingfisher (>= 4.10.0) + - WRCycleScrollView (0.1.0) - WRNavigationBar_swift (0.1.0) DEPENDENCIES: + - Kingfisher (= 4.10.1) - WRCycleScrollView (from `../`) - WRNavigationBar_swift (from `https://github.com/EFRenovation/WRNavigationBar_swift.git`) @@ -25,9 +25,9 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0 - WRCycleScrollView: d3d873ee075ca797056721d0286df967994df7f2 + WRCycleScrollView: 06e6fa71feefcc0da9e23d75ec6133f4614e6ac8 WRNavigationBar_swift: b49ca280deb24616af40abae09d8ec593e75ac64 -PODFILE CHECKSUM: 82eeaaada13c975b714571f2566f79f73d39841f +PODFILE CHECKSUM: 2b5278d7ddb14b20a3ab4b9bcbfff518c13499bf COCOAPODS: 1.5.3 diff --git a/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json b/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json index bc63a40..67a56b3 100644 --- a/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json +++ b/Example/Pods/Local Podspecs/WRCycleScrollView.podspec.json @@ -19,10 +19,5 @@ "platforms": { "ios": "8.0" }, - "source_files": "WRCycleScrollView/Classes/**/*", - "dependencies": { - "Kingfisher": [ - ">= 4.10.0" - ] - } + "source_files": "WRCycleScrollView/Classes/**/*" } diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 6ca67f4..ec88c6a 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,10 +1,10 @@ PODS: - Kingfisher (4.10.1) - - WRCycleScrollView (0.1.0): - - Kingfisher (>= 4.10.0) + - WRCycleScrollView (0.1.0) - WRNavigationBar_swift (0.1.0) DEPENDENCIES: + - Kingfisher (= 4.10.1) - WRCycleScrollView (from `../`) - WRNavigationBar_swift (from `https://github.com/EFRenovation/WRNavigationBar_swift.git`) @@ -25,9 +25,9 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0 - WRCycleScrollView: d3d873ee075ca797056721d0286df967994df7f2 + WRCycleScrollView: 06e6fa71feefcc0da9e23d75ec6133f4614e6ac8 WRNavigationBar_swift: b49ca280deb24616af40abae09d8ec593e75ac64 -PODFILE CHECKSUM: 82eeaaada13c975b714571f2566f79f73d39841f +PODFILE CHECKSUM: 2b5278d7ddb14b20a3ab4b9bcbfff518c13499bf COCOAPODS: 1.5.3 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 49e9c1f..a44b4a5 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,89 +7,81 @@ objects = { /* Begin PBXBuildFile section */ - 0096C6816AC3D92834AB65C49518C177 /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */; }; - 03E0A134F1DDF33EA16F004F1A230CA1 /* FormatIndicatedCacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */; }; - 0A5C34E6A97D7B296F4BF125B02996FF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; - 103228D906B112AA75562E8B17179127 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */; }; - 114397DE4A2DC0204868A79F4BE13769 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A1419F008FE1993459210F31E14AE /* Filter.swift */; }; - 2283375C0C99789CF47EEDA0CE9D3D80 /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */; }; - 285FCDD948223F8C39746DBB34F5764E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; - 2ABE0F8940C00BD429E33ED7F7C9EA1D /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */; }; - 339B55D5AAEF2FF1608FC5B9B527C652 /* WRCustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */; }; - 3464228E4F1F63DBCA803CC848A6A8C0 /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */; }; - 403E3E170DCF269D5CBA1C530ECA901B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; - 4074AA6F2557EF7970DEDE67B04433B6 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */; }; - 498DC29155467AC093701C1AF5EE3807 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */; }; - 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 55DB31F4733D4E7D77EDC907C671974A /* WRProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A468A27AF802EF198A8FBA0459DC352C /* WRProxy.swift */; }; - 6486781D756A9D71FE5C6E56CC9A343F /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */; }; - 6A79B7FA2452A885E59C1E9C8D27B825 /* WRCycleScrollView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 448686418F732BDCFE92016A655A2D8F /* WRCycleScrollView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6C6EB20F66C724EECC0ADF8E44A5828F /* Pods-WRCycleScrollView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BAD8B551B86EF819D7F92E0AF3007E4 /* Pods-WRCycleScrollView_Tests-dummy.m */; }; - 7B2A61E55C43E9B12E5B7DD852456AEE /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */; }; - 7D96A57FB85423E89BB7B969EC4889AC /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F78CCC4E543AE1ACD02EA7C0B0927E5 /* Kingfisher.framework */; }; - 84CF440A4E3CCDEE93FA2475748A9934 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88C2DC201E57C6FC489FB78275D9E14D /* CFNetwork.framework */; }; - 919CAD03C2FDEB7779F87007326ED8FF /* Pods-WRCycleScrollView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 39F2F051841354DE9D3D31F7C82A4ADD /* Pods-WRCycleScrollView_Example-dummy.m */; }; - 95156987028D309F91AC55FBDFE01643 /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */; }; - 9B463CCE173412B9E88CDBC02B729249 /* WRNavigationBar_swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A7A38C64A15962136008EA7D6309D662 /* WRCycleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD6CE23F2D3BE7CAD763E2D8C05A5857 /* WRCycleCell.swift */; }; - A89C2257CE2D9A017AEC02999AF0F03C /* WRNavigationBar_swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */; }; - A8A79840E81BFA3D8DCC29BE71F1AEC4 /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */; }; - A9D2A6547EE5F6532EF8D1F1870BF158 /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */; }; - AA0FBDB7F86E01D8193BC519D1E6D61A /* WRCycleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6432A81970EA122347D0F3E404E7DAE8 /* WRCycleScrollView.swift */; }; - B564B930C3B6CCFCC109ABF374B21CE6 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */; }; - B924069CD75769E22765912C66A87BF3 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */; }; - BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */ = {isa = PBXBuildFile; fileRef = 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BE9FB5E8188E0B68DB277B09A06E79BA /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */; }; - C32C7FE70764DE37935F6A5D80CB17C7 /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */; }; - CE38861F1268294930C074FC3F807E55 /* ThreadHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */; }; - CEC271DBFB3B025EB1AB19314BB205B9 /* WRCycleScrollView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C01B894A0394ABEAA23D6083E48C5984 /* WRCycleScrollView-dummy.m */; }; - CEEB7C897409C08DF53289E307AB987C /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */; }; - CFC56213EA9F1DB7FFB38F70E3F92295 /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */; }; - D1575AAADDCEA395E3828EBAC2A772FA /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */; }; - D94080C4C5456708261D7145660A8624 /* Pods-WRCycleScrollView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6C02C5046FD44ED65E4ED3C68492683 /* Pods-WRCycleScrollView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D9A5980C2815C9ECB07A92FA51AAD3B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; - DA7A5ECA4C0B39776007BE89B99227EF /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */; }; - E9E5F082818BE1AA4722E77DD066450F /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */; }; - EF10E20DF9B5910869358E3231C5D6D2 /* WRPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20FC8E5B688DCF847AF9AA7C106DBE69 /* WRPageControl.swift */; }; - F707F9E4E353C42CAC689F78D7EFDC9C /* Pods-WRCycleScrollView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D2E3006EB17CA7A52B13DCC065DB64B /* Pods-WRCycleScrollView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FE22325AE08EFC974DD3ABF725989726 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */; }; - FED97351EC4705507DAB175106B819C8 /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */; }; + 008D5DDE0942B5C3EC51E6D4557DFD64 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD91A794051E9A201170B5D32FB2ABC /* Placeholder.swift */; }; + 07C0515BAB41A01EDFCB5164FB622170 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */; }; + 086BAE73F01CE25AC66212719BC6318F /* WRProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A468A27AF802EF198A8FBA0459DC352C /* WRProxy.swift */; }; + 179FCD8BC40E115DFA9C05F603A878A9 /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3998D02F475E479DB5B1AA7B08724E82 /* Resource.swift */; }; + 20FEB969513418DFAC5090C858D10516 /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1392C019F5AFAED74735A8AC43D1331 /* Kingfisher.swift */; }; + 252F76EE369738D9666F96D467804897 /* Pods-WRCycleScrollView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6C02C5046FD44ED65E4ED3C68492683 /* Pods-WRCycleScrollView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2A497804E75D7D691D237F7ECCB60146 /* WRPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20FC8E5B688DCF847AF9AA7C106DBE69 /* WRPageControl.swift */; }; + 2EDA6F44064253ACF1ADD5305BAE9C16 /* WRNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4C4E8B4E11869D2A76BCB9FAFF3080 /* WRNavigationBar.swift */; }; + 2F84C0A84F2B5A0E9E3073417CA651C3 /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */; }; + 34AEF9EE16EAEAF7FA0E66A48982F0C8 /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */; }; + 3554E5702FFEA0C2FC74B19EEC7D6325 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */; }; + 41D22E6F4C3E24D8FE690DE6D644AC3E /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C90821DC8E5C4524FFD867B3527117F1 /* ImagePrefetcher.swift */; }; + 453378DA661AD7FCBA79D1BFA59302EB /* FormatIndicatedCacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F9AFB06B9B6045CF1C11762CA62CC61 /* FormatIndicatedCacheSerializer.swift */; }; + 4C418D0A7AAC3D859D700558DC43D9FF /* WRCycleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD6CE23F2D3BE7CAD763E2D8C05A5857 /* WRCycleCell.swift */; }; + 4ED321BECF421B0F1A5737A3272C5487 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603384C09291849D9D2546407F00E2BC /* Foundation.framework */; }; + 56069123D290CCC95B9CE84570775470 /* Pods-WRCycleScrollView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 39F2F051841354DE9D3D31F7C82A4ADD /* Pods-WRCycleScrollView_Example-dummy.m */; }; + 56BEC83974E0E941F93C3CF834B78BBA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603384C09291849D9D2546407F00E2BC /* Foundation.framework */; }; + 5B65093D744FF830E7053B796B8F719B /* WRCycleScrollView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C01B894A0394ABEAA23D6083E48C5984 /* WRCycleScrollView-dummy.m */; }; + 66CCE448DAB752E36445FD69CD761C93 /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC09CA2166145C1AE8642B10E14FC93 /* KingfisherManager.swift */; }; + 74991D9F2A55044D75545D00A70C8CA9 /* Kingfisher.h in Headers */ = {isa = PBXBuildFile; fileRef = 40479E557AA1AF792FBA62BA54E70204 /* Kingfisher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75A1E4900C0AA7CE6E2454C64AA169E2 /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */; }; + 80C433B4D3695F2D158DBCE57E434900 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 197533FE6D1EE58A9FBC68F6E56036E0 /* CFNetwork.framework */; }; + 833B4550B26D2A945E08C978BB7BD505 /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7227638748671F7F7B26BF32E7886A /* String+MD5.swift */; }; + 84DC0F8D711C0F5FF2C72B5B6F3601C4 /* WRNavigationBar_swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE26E66F19F9B417745E8E1E3D754D /* WRNavigationBar_swift-dummy.m */; }; + 88CE4EE02A104D4BD65DE024ACF209F7 /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3367197DD21505F8F11DA056A8A614AE /* KingfisherOptionsInfo.swift */; }; + 90523ACEFEF8D56C35F5CF41CB70EE58 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E27473AC5DB3A6F2A8885B50BFACA8AC /* ImageCache.swift */; }; + 949842FC32F868A147E6EE82ED5B817F /* WRCycleScrollView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 448686418F732BDCFE92016A655A2D8F /* WRCycleScrollView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 95AB33523EE2DA5C145714D7279E8D27 /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFCE336D6602A4EB1D01FFD29F5DBEAB /* CacheSerializer.swift */; }; + 97EB2E795C2BE40106D734B5C0AEBDB3 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEEEB6138DFC60E1CABB79D11FFA1CC2 /* ImageDownloader.swift */; }; + 9E62327A7F0838DE8B8CF9A440D6DF48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603384C09291849D9D2546407F00E2BC /* Foundation.framework */; }; + 9EDFA1C34D4853B76A78B8E40B89C775 /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C34FC4D1D9C5EBC262D33134DC4C4F /* RequestModifier.swift */; }; + A05902BC357346E6050E5FA02FD57867 /* WRCycleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6432A81970EA122347D0F3E404E7DAE8 /* WRCycleScrollView.swift */; }; + AE633B3532903E2EF04B5D7BA480C3C7 /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DF0D85B96582F8F37B60732B5ED3B4 /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1D0744B9405A528508A49B4DE06A8DB /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A1419F008FE1993459210F31E14AE /* Filter.swift */; }; + B239F6D91EC58C8046497C0909CB2E78 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C9895DD7089A8B51FB32B1BDA5027A /* Box.swift */; }; + BBE6B85E960BF7927A44E2329DE05A5F /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1307484AE84CF398FBDC2F06DF9DC2E /* Image.swift */; }; + C9538BAC268AB8AAB4336A4E62B2EA1F /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F7323988915788FFE8CB806B77FEAD2 /* Kingfisher-dummy.m */; }; + D20AB62016564A468C5EDCBD08ED4151 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603384C09291849D9D2546407F00E2BC /* Foundation.framework */; }; + D489CCB3A645B30695BD0C4EC0EA699E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603384C09291849D9D2546407F00E2BC /* Foundation.framework */; }; + DAC3F0C65BA82526594477C6DDF06745 /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F22DCA42E4CD741BBE42BC5DE3FCBD /* ImageProcessor.swift */; }; + E788EE847BA3A26A4C358663A9DA97BC /* Pods-WRCycleScrollView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BAD8B551B86EF819D7F92E0AF3007E4 /* Pods-WRCycleScrollView_Tests-dummy.m */; }; + E94B82EE482BE1817190DFBD1A5903D3 /* WRCustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */; }; + EA9BE16ECCC17CC9AD847C52D1B64671 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 071D2AD6D8AA2B74B542E02560E42A02 /* AnimatedImageView.swift */; }; + EDC660C271699583EB4864B76FAB53F3 /* Pods-WRCycleScrollView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D2E3006EB17CA7A52B13DCC065DB64B /* Pods-WRCycleScrollView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F667936752E8742E44668CC80FC31720 /* ThreadHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86EF3373E3F5B224BC8572BF248746 /* ThreadHelper.swift */; }; + FCEE2C104D538C59C040FC0BC60D812B /* WRNavigationBar_swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E459F1CB67716C41749244A3780615A6 /* WRNavigationBar_swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 0F7E5A7D64B91C2957EB33BEB6583A55 /* PBXContainerItemProxy */ = { + 18259ADE1280FCAD464FDCAEACA8FCDB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 4F87037150ABE2C9238B54E8F6E33F36; - remoteInfo = Kingfisher; + remoteGlobalIDString = B681BE5C1B5815A957786B6E51AE1324; + remoteInfo = WRNavigationBar_swift; }; - 19D87572A957D2D335A24824444781BC /* PBXContainerItemProxy */ = { + 1903A6A43760D6A4067F2328EABDE40D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 4F87037150ABE2C9238B54E8F6E33F36; + remoteGlobalIDString = A15CD3220CB655EF65975142EDBD8C6E; remoteInfo = Kingfisher; }; - 56C77437AD522C1EE5CF93F067D50C21 /* PBXContainerItemProxy */ = { + BCBDE6F1041A2CC7FBC9845B43F66345 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = B189FF35C8D98F9DBB8CFC28048E2AEF; + remoteGlobalIDString = A3D49E8985C562C6CC1D218D42336884; remoteInfo = WRCycleScrollView; }; - 90865381B8BDEC3877E98E5501230808 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 93E71B3067948118A4A87B5873652F63; - remoteInfo = WRNavigationBar_swift; - }; - B5385F630C8358BF924F857139DB29BD /* PBXContainerItemProxy */ = { + C220015C39EFBE9CFE484C5746F4CBB3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 08F04FABB0276A819ABC95C5DB2A90D8; + remoteGlobalIDString = DD1FD9BBDE44FA92C05B77E821A66F57; remoteInfo = "Pods-WRCycleScrollView_Example"; }; /* End PBXContainerItemProxy section */ @@ -103,6 +95,7 @@ 14228F8E5ECCD96DA755134DA775737F /* Pods-WRCycleScrollView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollView_Example-frameworks.sh"; sourceTree = ""; }; 17A985F98BE99DB80D63A7C9D10FC00F /* WRCustomNavigationBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRCustomNavigationBar.swift; path = WRNavigationBar_swift/Classes/WRCustomNavigationBar.swift; sourceTree = ""; }; 1909FE118F35F4F2E2FE18A0048940FA /* Pods-WRCycleScrollView_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WRCycleScrollView_Example-resources.sh"; sourceTree = ""; }; + 197533FE6D1EE58A9FBC68F6E56036E0 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; 20FC8E5B688DCF847AF9AA7C106DBE69 /* WRPageControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRPageControl.swift; path = WRCycleScrollView/Classes/WRPageControl.swift; sourceTree = ""; }; 235956EE57BE4C9341A3E5A913701B81 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2504D92B937C8312E816566BE54869C9 /* WRNavigationBar_swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = WRNavigationBar_swift.modulemap; sourceTree = ""; }; @@ -124,21 +117,19 @@ 448686418F732BDCFE92016A655A2D8F /* WRCycleScrollView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WRCycleScrollView-umbrella.h"; sourceTree = ""; }; 46A53CEA426EBA4F135E732CC4B8D0CA /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/ImageTransition.swift; sourceTree = ""; }; 4D49B480BA0807A7860CA159691994A6 /* Pods_WRCycleScrollView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollView_Example.framework; path = "Pods-WRCycleScrollView_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4F78CCC4E543AE1ACD02EA7C0B0927E5 /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50D0552895222F7AD044DAE933774EFB /* ImageModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageModifier.swift; path = Sources/ImageModifier.swift; sourceTree = ""; }; 51D67D51760EBEA761B4FFF92E258863 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 540A1419F008FE1993459210F31E14AE /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Filter.swift; sourceTree = ""; }; 592D0B3A69F8BE27020B8DB8D0A30EA3 /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/UIButton+Kingfisher.swift"; sourceTree = ""; }; 594E3CD62FDE16C0B3A3D947F1D6CB67 /* WRCycleScrollView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = WRCycleScrollView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 5A4034242F65E2AF830DF6D17E2034F6 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/ImageView+Kingfisher.swift"; sourceTree = ""; }; - 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 5BAD8B551B86EF819D7F92E0AF3007E4 /* Pods-WRCycleScrollView_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WRCycleScrollView_Tests-dummy.m"; sourceTree = ""; }; + 603384C09291849D9D2546407F00E2BC /* 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; }; 6432A81970EA122347D0F3E404E7DAE8 /* WRCycleScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WRCycleScrollView.swift; path = WRCycleScrollView/Classes/WRCycleScrollView.swift; sourceTree = ""; }; 684025C093AE05300D46ADE3C15F7BE8 /* Pods-WRCycleScrollView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WRCycleScrollView_Example.modulemap"; sourceTree = ""; }; 6EEB73D3A55D2B6F2912D12710C797CA /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher.framework; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7CDCFB0E924F78D6A07F629E95A2E286 /* WRCycleScrollView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = WRCycleScrollView.framework; path = WRCycleScrollView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 87299C1D200EC1FA18A031EDAADF143E /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; - 88C2DC201E57C6FC489FB78275D9E14D /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; 8A973796C1D7318DF2E90D83A3FD2B87 /* Pods_WRCycleScrollView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_WRCycleScrollView_Tests.framework; path = "Pods-WRCycleScrollView_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 8DF36E6EB7972B677B76E47AE8225C79 /* Pods-WRCycleScrollView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WRCycleScrollView_Example-acknowledgements.plist"; sourceTree = ""; }; 8F7AFB6AC9D230BDF6337D5F7B1A4D25 /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Indicator.swift; sourceTree = ""; }; @@ -178,51 +169,67 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2B044D8F048C27F0B01E7BFE5A7F1109 /* Frameworks */ = { + 00BAA5DDD93BBE820FCF1987939A89E7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 285FCDD948223F8C39746DBB34F5764E /* Foundation.framework in Frameworks */, + D20AB62016564A468C5EDCBD08ED4151 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6BFCDA00B46CAE6D68CE21CB96AC734B /* Frameworks */ = { + 55C36F7CC1AF497CD89C8420A717D06F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0A5C34E6A97D7B296F4BF125B02996FF /* Foundation.framework in Frameworks */, - 7D96A57FB85423E89BB7B969EC4889AC /* Kingfisher.framework in Frameworks */, + 80C433B4D3695F2D158DBCE57E434900 /* CFNetwork.framework in Frameworks */, + 56BEC83974E0E941F93C3CF834B78BBA /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A05AD251435FB24E096BBA193F9C99F0 /* Frameworks */ = { + 74B30CA748909DA33F8854A9FFDA3D47 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 84CF440A4E3CCDEE93FA2475748A9934 /* CFNetwork.framework in Frameworks */, - 403E3E170DCF269D5CBA1C530ECA901B /* Foundation.framework in Frameworks */, + D489CCB3A645B30695BD0C4EC0EA699E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B8EEECD45032662F11585EF1EF8041D7 /* Frameworks */ = { + 88C244E6ECF0CD99C4D349F0ADFADC2F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FE22325AE08EFC974DD3ABF725989726 /* Foundation.framework in Frameworks */, + 4ED321BECF421B0F1A5737A3272C5487 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CD29268F8E4F8E9E0BE795161144CC91 /* Frameworks */ = { + 8E2B4943B220DE800BB85F7768DD63F6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D9A5980C2815C9ECB07A92FA51AAD3B9 /* Foundation.framework in Frameworks */, + 9E62327A7F0838DE8B8CF9A440D6DF48 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 257ACB06A459526A926268F3092DCB70 /* iOS */ = { + isa = PBXGroup; + children = ( + 197533FE6D1EE58A9FBC68F6E56036E0 /* CFNetwork.framework */, + 603384C09291849D9D2546407F00E2BC /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 257ACB06A459526A926268F3092DCB70 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; 470E47414B1B460FD8E01FA77BCB40B4 /* Pod */ = { isa = PBXGroup; children = ( @@ -245,21 +252,12 @@ name = Products; sourceTree = ""; }; - 6BE6794BE1D0147A47641BFD88E0C9B1 /* iOS */ = { - isa = PBXGroup; - children = ( - 88C2DC201E57C6FC489FB78275D9E14D /* CFNetwork.framework */, - 5B21DB9C5671AF25D856F2FA4CD351AB /* Foundation.framework */, - ); - name = iOS; - sourceTree = ""; - }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, B7A942AFCF495689A99F86434BD53193 /* Development Pods */, - A34DC41A4AC9B0D17F82B623BF369E65 /* Frameworks */, + 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, C68A42DFF98C4F734F14D49FE295D994 /* Pods */, 4FE7EC8EF6DB460D28F43BE9283CAD80 /* Products */, A9DB1593C82EA7BF005E2627C3E14A15 /* Targets Support Files */, @@ -294,15 +292,6 @@ path = "../Target Support Files/Kingfisher"; sourceTree = ""; }; - A34DC41A4AC9B0D17F82B623BF369E65 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 4F78CCC4E543AE1ACD02EA7C0B0927E5 /* Kingfisher.framework */, - 6BE6794BE1D0147A47641BFD88E0C9B1 /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; A447970996494AB371A9C53C2C0ADF89 /* Pods-WRCycleScrollView_Example */ = { isa = PBXGroup; children = ( @@ -440,77 +429,77 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 73BE613FB93F2BBA0D1A190455A93DA0 /* Headers */ = { + 6588A76BB2AC218F6C4E96CF996FD4A8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 6A79B7FA2452A885E59C1E9C8D27B825 /* WRCycleScrollView-umbrella.h in Headers */, + FCEE2C104D538C59C040FC0BC60D812B /* WRNavigationBar_swift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 77343F6FE2F00590359315541EE3B36A /* Headers */ = { + 6A06610A6DCED9B85497A3B884B1F618 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D94080C4C5456708261D7145660A8624 /* Pods-WRCycleScrollView_Example-umbrella.h in Headers */, + 949842FC32F868A147E6EE82ED5B817F /* WRCycleScrollView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A1608BBC39798D740BF5C50FAAED1514 /* Headers */ = { + A4416D8D7BAB1B44603B29053B8C30A1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F707F9E4E353C42CAC689F78D7EFDC9C /* Pods-WRCycleScrollView_Tests-umbrella.h in Headers */, + AE633B3532903E2EF04B5D7BA480C3C7 /* Kingfisher-umbrella.h in Headers */, + 74991D9F2A55044D75545D00A70C8CA9 /* Kingfisher.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - B5048B82BF08CCEB5868392B2E08573A /* Headers */ = { + BF23A55E543CFE8F2AF3E8B8014E1231 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9B463CCE173412B9E88CDBC02B729249 /* WRNavigationBar_swift-umbrella.h in Headers */, + 252F76EE369738D9666F96D467804897 /* Pods-WRCycleScrollView_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - BADBBCEED9A9F8B15B7F98467EA6FB0E /* Headers */ = { + DB39B60A41178F15C4607CE48DB5CDC6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 509A5621DAB44B06929B30ACCA7CA598 /* Kingfisher-umbrella.h in Headers */, - BA4DF38E820FF6B40FFABF8B1BBCC615 /* Kingfisher.h in Headers */, + EDC660C271699583EB4864B76FAB53F3 /* Pods-WRCycleScrollView_Tests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 08F04FABB0276A819ABC95C5DB2A90D8 /* Pods-WRCycleScrollView_Example */ = { + 79D04E2BE30A82936AFD908F4F0E17CE /* Pods-WRCycleScrollView_Tests */ = { isa = PBXNativeTarget; - buildConfigurationList = 2E0B65340ED60C1BEFC818CD9FF81185 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Example" */; + buildConfigurationList = EBA946D171532BD2C6FE21CE28013ED3 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Tests" */; buildPhases = ( - 196B93854C88CBD596C97477663710A2 /* Sources */, - B8EEECD45032662F11585EF1EF8041D7 /* Frameworks */, - 77343F6FE2F00590359315541EE3B36A /* Headers */, + DB39B60A41178F15C4607CE48DB5CDC6 /* Headers */, + 79C413A4574801BA1164CCBAFF72F6BF /* Sources */, + 74B30CA748909DA33F8854A9FFDA3D47 /* Frameworks */, + 338EADFA8537D7582F7030BFBCFB6063 /* Resources */, ); buildRules = ( ); dependencies = ( - 92E34C524F4023C07C992A656FB18AAD /* PBXTargetDependency */, - 0C32876D6667CA0C17E03593A953CF65 /* PBXTargetDependency */, - B35B92EFC9CED5494F2F873380474A05 /* PBXTargetDependency */, + FBB8516EE9AB94FECEA1EE8B9F2C814C /* PBXTargetDependency */, ); - name = "Pods-WRCycleScrollView_Example"; - productName = "Pods-WRCycleScrollView_Example"; - productReference = 4D49B480BA0807A7860CA159691994A6 /* Pods_WRCycleScrollView_Example.framework */; + name = "Pods-WRCycleScrollView_Tests"; + productName = "Pods-WRCycleScrollView_Tests"; + productReference = 8A973796C1D7318DF2E90D83A3FD2B87 /* Pods_WRCycleScrollView_Tests.framework */; productType = "com.apple.product-type.framework"; }; - 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */ = { + A15CD3220CB655EF65975142EDBD8C6E /* Kingfisher */ = { isa = PBXNativeTarget; - buildConfigurationList = 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */; + buildConfigurationList = 055CB86039F87F17BFAACCE5B1899A4E /* Build configuration list for PBXNativeTarget "Kingfisher" */; buildPhases = ( - 154F6D32400678B08A7CB2E5FD292972 /* Sources */, - A05AD251435FB24E096BBA193F9C99F0 /* Frameworks */, - BADBBCEED9A9F8B15B7F98467EA6FB0E /* Headers */, + A4416D8D7BAB1B44603B29053B8C30A1 /* Headers */, + D9F6E34E36CF832E207A40E6DE2EBB3C /* Sources */, + 55C36F7CC1AF497CD89C8420A717D06F /* Frameworks */, + 907E8FAD109F4265A17FD9B5C5BCDD9D /* Resources */, ); buildRules = ( ); @@ -521,31 +510,32 @@ productReference = 6EEB73D3A55D2B6F2912D12710C797CA /* Kingfisher.framework */; productType = "com.apple.product-type.framework"; }; - 5E3FC57C82CFE4F2BD437F74D140C6B5 /* Pods-WRCycleScrollView_Tests */ = { + A3D49E8985C562C6CC1D218D42336884 /* WRCycleScrollView */ = { isa = PBXNativeTarget; - buildConfigurationList = F489F014DB4C214B0F040623742359DA /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Tests" */; + buildConfigurationList = 69436F226BFCF6611AB1C0A9E8B179FE /* Build configuration list for PBXNativeTarget "WRCycleScrollView" */; buildPhases = ( - 6ABFA486DC54461D4D910D6C2DEEA61A /* Sources */, - CD29268F8E4F8E9E0BE795161144CC91 /* Frameworks */, - A1608BBC39798D740BF5C50FAAED1514 /* Headers */, + 6A06610A6DCED9B85497A3B884B1F618 /* Headers */, + 9040F4EC58C5D2F79853DDA64FB2DFE4 /* Sources */, + 8E2B4943B220DE800BB85F7768DD63F6 /* Frameworks */, + 855FD1D27EB1DED8FC501B8BD5BABE25 /* Resources */, ); buildRules = ( ); dependencies = ( - CEFA7E77250E810792AAAC6585766341 /* PBXTargetDependency */, ); - name = "Pods-WRCycleScrollView_Tests"; - productName = "Pods-WRCycleScrollView_Tests"; - productReference = 8A973796C1D7318DF2E90D83A3FD2B87 /* Pods_WRCycleScrollView_Tests.framework */; + name = WRCycleScrollView; + productName = WRCycleScrollView; + productReference = 7CDCFB0E924F78D6A07F629E95A2E286 /* WRCycleScrollView.framework */; productType = "com.apple.product-type.framework"; }; - 93E71B3067948118A4A87B5873652F63 /* WRNavigationBar_swift */ = { + B681BE5C1B5815A957786B6E51AE1324 /* WRNavigationBar_swift */ = { isa = PBXNativeTarget; - buildConfigurationList = F495FFE5A6FA13AF007AF7EF43CF204B /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */; + buildConfigurationList = E30DD9F40B080CAEDC33C8AD11E7AED6 /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */; buildPhases = ( - 6A40AA8C651387CFA0E86ED925EC848A /* Sources */, - 2B044D8F048C27F0B01E7BFE5A7F1109 /* Frameworks */, - B5048B82BF08CCEB5868392B2E08573A /* Headers */, + 6588A76BB2AC218F6C4E96CF996FD4A8 /* Headers */, + 8641E798E98D65466BF1F2A4B0DF460F /* Sources */, + 88C244E6ECF0CD99C4D349F0ADFADC2F /* Frameworks */, + F637781AA05346B4F57DD711D88F25F9 /* Resources */, ); buildRules = ( ); @@ -556,22 +546,25 @@ productReference = 90544B685152BAA80C65C54B3B54B1DB /* WRNavigationBar_swift.framework */; productType = "com.apple.product-type.framework"; }; - B189FF35C8D98F9DBB8CFC28048E2AEF /* WRCycleScrollView */ = { + DD1FD9BBDE44FA92C05B77E821A66F57 /* Pods-WRCycleScrollView_Example */ = { isa = PBXNativeTarget; - buildConfigurationList = E5D55B6F3A9153750EC9D0157D146044 /* Build configuration list for PBXNativeTarget "WRCycleScrollView" */; + buildConfigurationList = 329F3FAEB4A995CE81517B2B076B40AE /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Example" */; buildPhases = ( - E69F93D207C180F93656163733D43B8A /* Sources */, - 6BFCDA00B46CAE6D68CE21CB96AC734B /* Frameworks */, - 73BE613FB93F2BBA0D1A190455A93DA0 /* Headers */, + BF23A55E543CFE8F2AF3E8B8014E1231 /* Headers */, + 2A312E661CC200243B1CD612732E35CB /* Sources */, + 00BAA5DDD93BBE820FCF1987939A89E7 /* Frameworks */, + 2A97BEE3686D6C14363B626510E1A230 /* Resources */, ); buildRules = ( ); dependencies = ( - 845D168BC1C1DC67D306FAF8EEA87A5B /* PBXTargetDependency */, + DF1A6120F2A5162289762F44E6B99508 /* PBXTargetDependency */, + C84F5987DCC3C10F0994B48F2084D9EC /* PBXTargetDependency */, + 825D66443683D39957CEE3AA0335C6E3 /* PBXTargetDependency */, ); - name = WRCycleScrollView; - productName = WRCycleScrollView; - productReference = 7CDCFB0E924F78D6A07F629E95A2E286 /* WRCycleScrollView.framework */; + name = "Pods-WRCycleScrollView_Example"; + productName = "Pods-WRCycleScrollView_Example"; + productReference = 4D49B480BA0807A7860CA159691994A6 /* Pods_WRCycleScrollView_Example.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -595,158 +588,156 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */, - 08F04FABB0276A819ABC95C5DB2A90D8 /* Pods-WRCycleScrollView_Example */, - 5E3FC57C82CFE4F2BD437F74D140C6B5 /* Pods-WRCycleScrollView_Tests */, - B189FF35C8D98F9DBB8CFC28048E2AEF /* WRCycleScrollView */, - 93E71B3067948118A4A87B5873652F63 /* WRNavigationBar_swift */, + A15CD3220CB655EF65975142EDBD8C6E /* Kingfisher */, + DD1FD9BBDE44FA92C05B77E821A66F57 /* Pods-WRCycleScrollView_Example */, + 79D04E2BE30A82936AFD908F4F0E17CE /* Pods-WRCycleScrollView_Tests */, + A3D49E8985C562C6CC1D218D42336884 /* WRCycleScrollView */, + B681BE5C1B5815A957786B6E51AE1324 /* WRNavigationBar_swift */, ); }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 2A97BEE3686D6C14363B626510E1A230 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 338EADFA8537D7582F7030BFBCFB6063 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 855FD1D27EB1DED8FC501B8BD5BABE25 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 907E8FAD109F4265A17FD9B5C5BCDD9D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F637781AA05346B4F57DD711D88F25F9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ - 154F6D32400678B08A7CB2E5FD292972 /* Sources */ = { + 2A312E661CC200243B1CD612732E35CB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4074AA6F2557EF7970DEDE67B04433B6 /* AnimatedImageView.swift in Sources */, - D1575AAADDCEA395E3828EBAC2A772FA /* Box.swift in Sources */, - A9D2A6547EE5F6532EF8D1F1870BF158 /* CacheSerializer.swift in Sources */, - 114397DE4A2DC0204868A79F4BE13769 /* Filter.swift in Sources */, - 03E0A134F1DDF33EA16F004F1A230CA1 /* FormatIndicatedCacheSerializer.swift in Sources */, - B924069CD75769E22765912C66A87BF3 /* Image.swift in Sources */, - 6486781D756A9D71FE5C6E56CC9A343F /* ImageCache.swift in Sources */, - DA7A5ECA4C0B39776007BE89B99227EF /* ImageDownloader.swift in Sources */, - B564B930C3B6CCFCC109ABF374B21CE6 /* ImageModifier.swift in Sources */, - BE9FB5E8188E0B68DB277B09A06E79BA /* ImagePrefetcher.swift in Sources */, - 2283375C0C99789CF47EEDA0CE9D3D80 /* ImageProcessor.swift in Sources */, - 7B2A61E55C43E9B12E5B7DD852456AEE /* ImageTransition.swift in Sources */, - 0096C6816AC3D92834AB65C49518C177 /* ImageView+Kingfisher.swift in Sources */, - 103228D906B112AA75562E8B17179127 /* Indicator.swift in Sources */, - 95156987028D309F91AC55FBDFE01643 /* Kingfisher-dummy.m in Sources */, - E9E5F082818BE1AA4722E77DD066450F /* Kingfisher.swift in Sources */, - A8A79840E81BFA3D8DCC29BE71F1AEC4 /* KingfisherManager.swift in Sources */, - 2ABE0F8940C00BD429E33ED7F7C9EA1D /* KingfisherOptionsInfo.swift in Sources */, - 498DC29155467AC093701C1AF5EE3807 /* Placeholder.swift in Sources */, - C32C7FE70764DE37935F6A5D80CB17C7 /* RequestModifier.swift in Sources */, - 3464228E4F1F63DBCA803CC848A6A8C0 /* Resource.swift in Sources */, - CEEB7C897409C08DF53289E307AB987C /* String+MD5.swift in Sources */, - CE38861F1268294930C074FC3F807E55 /* ThreadHelper.swift in Sources */, - FED97351EC4705507DAB175106B819C8 /* UIButton+Kingfisher.swift in Sources */, + 56069123D290CCC95B9CE84570775470 /* Pods-WRCycleScrollView_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 196B93854C88CBD596C97477663710A2 /* Sources */ = { + 79C413A4574801BA1164CCBAFF72F6BF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 919CAD03C2FDEB7779F87007326ED8FF /* Pods-WRCycleScrollView_Example-dummy.m in Sources */, + E788EE847BA3A26A4C358663A9DA97BC /* Pods-WRCycleScrollView_Tests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6A40AA8C651387CFA0E86ED925EC848A /* Sources */ = { + 8641E798E98D65466BF1F2A4B0DF460F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 339B55D5AAEF2FF1608FC5B9B527C652 /* WRCustomNavigationBar.swift in Sources */, - CFC56213EA9F1DB7FFB38F70E3F92295 /* WRNavigationBar.swift in Sources */, - A89C2257CE2D9A017AEC02999AF0F03C /* WRNavigationBar_swift-dummy.m in Sources */, + E94B82EE482BE1817190DFBD1A5903D3 /* WRCustomNavigationBar.swift in Sources */, + 2EDA6F44064253ACF1ADD5305BAE9C16 /* WRNavigationBar.swift in Sources */, + 84DC0F8D711C0F5FF2C72B5B6F3601C4 /* WRNavigationBar_swift-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6ABFA486DC54461D4D910D6C2DEEA61A /* Sources */ = { + 9040F4EC58C5D2F79853DDA64FB2DFE4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6C6EB20F66C724EECC0ADF8E44A5828F /* Pods-WRCycleScrollView_Tests-dummy.m in Sources */, + 4C418D0A7AAC3D859D700558DC43D9FF /* WRCycleCell.swift in Sources */, + 5B65093D744FF830E7053B796B8F719B /* WRCycleScrollView-dummy.m in Sources */, + A05902BC357346E6050E5FA02FD57867 /* WRCycleScrollView.swift in Sources */, + 2A497804E75D7D691D237F7ECCB60146 /* WRPageControl.swift in Sources */, + 086BAE73F01CE25AC66212719BC6318F /* WRProxy.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E69F93D207C180F93656163733D43B8A /* Sources */ = { + D9F6E34E36CF832E207A40E6DE2EBB3C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A7A38C64A15962136008EA7D6309D662 /* WRCycleCell.swift in Sources */, - CEC271DBFB3B025EB1AB19314BB205B9 /* WRCycleScrollView-dummy.m in Sources */, - AA0FBDB7F86E01D8193BC519D1E6D61A /* WRCycleScrollView.swift in Sources */, - EF10E20DF9B5910869358E3231C5D6D2 /* WRPageControl.swift in Sources */, - 55DB31F4733D4E7D77EDC907C671974A /* WRProxy.swift in Sources */, + EA9BE16ECCC17CC9AD847C52D1B64671 /* AnimatedImageView.swift in Sources */, + B239F6D91EC58C8046497C0909CB2E78 /* Box.swift in Sources */, + 95AB33523EE2DA5C145714D7279E8D27 /* CacheSerializer.swift in Sources */, + B1D0744B9405A528508A49B4DE06A8DB /* Filter.swift in Sources */, + 453378DA661AD7FCBA79D1BFA59302EB /* FormatIndicatedCacheSerializer.swift in Sources */, + BBE6B85E960BF7927A44E2329DE05A5F /* Image.swift in Sources */, + 90523ACEFEF8D56C35F5CF41CB70EE58 /* ImageCache.swift in Sources */, + 97EB2E795C2BE40106D734B5C0AEBDB3 /* ImageDownloader.swift in Sources */, + 07C0515BAB41A01EDFCB5164FB622170 /* ImageModifier.swift in Sources */, + 41D22E6F4C3E24D8FE690DE6D644AC3E /* ImagePrefetcher.swift in Sources */, + DAC3F0C65BA82526594477C6DDF06745 /* ImageProcessor.swift in Sources */, + 2F84C0A84F2B5A0E9E3073417CA651C3 /* ImageTransition.swift in Sources */, + 75A1E4900C0AA7CE6E2454C64AA169E2 /* ImageView+Kingfisher.swift in Sources */, + 3554E5702FFEA0C2FC74B19EEC7D6325 /* Indicator.swift in Sources */, + C9538BAC268AB8AAB4336A4E62B2EA1F /* Kingfisher-dummy.m in Sources */, + 20FEB969513418DFAC5090C858D10516 /* Kingfisher.swift in Sources */, + 66CCE448DAB752E36445FD69CD761C93 /* KingfisherManager.swift in Sources */, + 88CE4EE02A104D4BD65DE024ACF209F7 /* KingfisherOptionsInfo.swift in Sources */, + 008D5DDE0942B5C3EC51E6D4557DFD64 /* Placeholder.swift in Sources */, + 9EDFA1C34D4853B76A78B8E40B89C775 /* RequestModifier.swift in Sources */, + 179FCD8BC40E115DFA9C05F603A878A9 /* Resource.swift in Sources */, + 833B4550B26D2A945E08C978BB7BD505 /* String+MD5.swift in Sources */, + F667936752E8742E44668CC80FC31720 /* ThreadHelper.swift in Sources */, + 34AEF9EE16EAEAF7FA0E66A48982F0C8 /* UIButton+Kingfisher.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 0C32876D6667CA0C17E03593A953CF65 /* PBXTargetDependency */ = { + 825D66443683D39957CEE3AA0335C6E3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = WRCycleScrollView; - target = B189FF35C8D98F9DBB8CFC28048E2AEF /* WRCycleScrollView */; - targetProxy = 56C77437AD522C1EE5CF93F067D50C21 /* PBXContainerItemProxy */; + name = WRNavigationBar_swift; + target = B681BE5C1B5815A957786B6E51AE1324 /* WRNavigationBar_swift */; + targetProxy = 18259ADE1280FCAD464FDCAEACA8FCDB /* PBXContainerItemProxy */; }; - 845D168BC1C1DC67D306FAF8EEA87A5B /* PBXTargetDependency */ = { + C84F5987DCC3C10F0994B48F2084D9EC /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Kingfisher; - target = 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */; - targetProxy = 0F7E5A7D64B91C2957EB33BEB6583A55 /* PBXContainerItemProxy */; + name = WRCycleScrollView; + target = A3D49E8985C562C6CC1D218D42336884 /* WRCycleScrollView */; + targetProxy = BCBDE6F1041A2CC7FBC9845B43F66345 /* PBXContainerItemProxy */; }; - 92E34C524F4023C07C992A656FB18AAD /* PBXTargetDependency */ = { + DF1A6120F2A5162289762F44E6B99508 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Kingfisher; - target = 4F87037150ABE2C9238B54E8F6E33F36 /* Kingfisher */; - targetProxy = 19D87572A957D2D335A24824444781BC /* PBXContainerItemProxy */; - }; - B35B92EFC9CED5494F2F873380474A05 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = WRNavigationBar_swift; - target = 93E71B3067948118A4A87B5873652F63 /* WRNavigationBar_swift */; - targetProxy = 90865381B8BDEC3877E98E5501230808 /* PBXContainerItemProxy */; + target = A15CD3220CB655EF65975142EDBD8C6E /* Kingfisher */; + targetProxy = 1903A6A43760D6A4067F2328EABDE40D /* PBXContainerItemProxy */; }; - CEFA7E77250E810792AAAC6585766341 /* PBXTargetDependency */ = { + FBB8516EE9AB94FECEA1EE8B9F2C814C /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-WRCycleScrollView_Example"; - target = 08F04FABB0276A819ABC95C5DB2A90D8 /* Pods-WRCycleScrollView_Example */; - targetProxy = B5385F630C8358BF924F857139DB29BD /* PBXContainerItemProxy */; + target = DD1FD9BBDE44FA92C05B77E821A66F57 /* Pods-WRCycleScrollView_Example */; + targetProxy = C220015C39EFBE9CFE484C5746F4CBB3 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 12DF7DF7F7E2A771C22A0C508B55E5E8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C13F2E2738F492C083C96F09B5243EC0 /* Pods-WRCycleScrollView_Tests.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-WRCycleScrollView_Tests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.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; - }; - 15C362FAFBE5990A801BF59B93B55C0A /* Release */ = { + 066AB5C9276882B9583964FE0C37CC86 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.xcconfig */; + baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -757,18 +748,17 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/WRCycleScrollView/WRCycleScrollView-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/WRCycleScrollView/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Kingfisher/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/WRCycleScrollView/WRCycleScrollView.modulemap"; - PRODUCT_MODULE_NAME = WRCycleScrollView; - PRODUCT_NAME = WRCycleScrollView; + MODULEMAP_FILE = "Target Support Files/Kingfisher/Kingfisher.modulemap"; + PRODUCT_MODULE_NAME = Kingfisher; + PRODUCT_NAME = Kingfisher; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -777,10 +767,11 @@ }; name = Release; }; - 1F25A732760398E965091F0E6E9C39FB /* Release */ = { + 2B24A4F9ADFE30B7C2997E2C2CDE2B6B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.xcconfig */; + baseConfigurationReference = C13F2E2738F492C083C96F09B5243EC0 /* Pods-WRCycleScrollView_Tests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -790,19 +781,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Kingfisher/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-WRCycleScrollView_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Kingfisher/Kingfisher.modulemap"; - PRODUCT_MODULE_NAME = Kingfisher; - PRODUCT_NAME = Kingfisher; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Tests/Pods-WRCycleScrollView_Tests.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; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -810,7 +801,7 @@ }; name = Release; }; - 2B0F146D8205280409DC857C8CF0B27C /* Debug */ = { + 3AEEB6F14AAD0453346D2C575CA6EC9D /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.xcconfig */; buildSettings = { @@ -834,115 +825,14 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.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/Kingfisher/Kingfisher-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Kingfisher/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/Kingfisher/Kingfisher.modulemap"; - PRODUCT_MODULE_NAME = Kingfisher; - PRODUCT_NAME = Kingfisher; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 5551858CC0F5017E81F0D2D436EF9820 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.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/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/WRNavigationBar_swift/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/WRNavigationBar_swift/WRNavigationBar_swift.modulemap"; - PRODUCT_MODULE_NAME = WRNavigationBar_swift; - PRODUCT_NAME = WRNavigationBar_swift; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 802059283A3ED2AB173AF0F2A31902AD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B33572339F02D2B826F456519CDEA910 /* Pods-WRCycleScrollView_Example.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-WRCycleScrollView_Example/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.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; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 8B33C5230DE4A9DFA6D8F46505DD7AF7 /* Debug */ = { + 50646285DD9FD95AF390BDA3FB1948EA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -996,48 +886,19 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MTL_ENABLE_DEBUG_INFO = YES; + 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; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - 8D4971BA4E317AEED734296D352C6E98 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.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/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/WRNavigationBar_swift/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/WRNavigationBar_swift/WRNavigationBar_swift.modulemap"; - PRODUCT_MODULE_NAME = WRNavigationBar_swift; - PRODUCT_NAME = WRNavigationBar_swift; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + SYMROOT = "${SRCROOT}/../build"; }; name = Debug; }; - B42B54097A876E8A982CBF5DAA91B1AB /* Release */ = { + 58DCB2BA7C34E84C00C38CEF18A96D11 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1089,13 +950,17 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.3; 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; }; - D6B40A867C8136EA597197B5991DF20B /* Debug */ = { + 5A05AEED86CFC80539147973D642EB71 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 050D02F22CA70B01C84CCFE2223C7AB6 /* Pods-WRCycleScrollView_Tests.debug.xcconfig */; buildSettings = { @@ -1128,7 +993,40 @@ }; name = Debug; }; - E7AE764CD2BDDB9FED9F828BBD71C402 /* Release */ = { + 65EB105FCBDAFE2530F65E570F2DB967 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B33572339F02D2B826F456519CDEA910 /* Pods-WRCycleScrollView_Example.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-WRCycleScrollView_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WRCycleScrollView_Example/Pods-WRCycleScrollView_Example.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; + }; + 883660EF7C2C80A31B7C3EF3412B90FD /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 34C994C8ADF25DB7A99D5282B173DB52 /* Pods-WRCycleScrollView_Example.release.xcconfig */; buildSettings = { @@ -1155,7 +1053,132 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A54E1800647D456D492773169FAB7819 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.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/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRNavigationBar_swift/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/WRNavigationBar_swift/WRNavigationBar_swift.modulemap"; + PRODUCT_MODULE_NAME = WRNavigationBar_swift; + PRODUCT_NAME = WRNavigationBar_swift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CF74AA8576574BE1D7D47693FD3B2D38 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C9000363950211792C68B70D96FCB3C /* WRNavigationBar_swift.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/WRNavigationBar_swift/WRNavigationBar_swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRNavigationBar_swift/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/WRNavigationBar_swift/WRNavigationBar_swift.modulemap"; + PRODUCT_MODULE_NAME = WRNavigationBar_swift; + PRODUCT_NAME = WRNavigationBar_swift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + FA0228A14E62882FEE667F9BFA284561 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9EEB737183FA3143C1D0BD911F3C3945 /* Kingfisher.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/Kingfisher/Kingfisher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Kingfisher/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/Kingfisher/Kingfisher.modulemap"; + PRODUCT_MODULE_NAME = Kingfisher; + PRODUCT_NAME = Kingfisher; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FD082CAF53766BA1F0D2C1B58B0E0A59 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 41D3FF46E8CB20206C42B510DB5F71EC /* WRCycleScrollView.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/WRCycleScrollView/WRCycleScrollView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WRCycleScrollView/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/WRCycleScrollView/WRCycleScrollView.modulemap"; + PRODUCT_MODULE_NAME = WRCycleScrollView; + PRODUCT_NAME = WRCycleScrollView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1166,56 +1189,56 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 055CB86039F87F17BFAACCE5B1899A4E /* Build configuration list for PBXNativeTarget "Kingfisher" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8B33C5230DE4A9DFA6D8F46505DD7AF7 /* Debug */, - B42B54097A876E8A982CBF5DAA91B1AB /* Release */, + FA0228A14E62882FEE667F9BFA284561 /* Debug */, + 066AB5C9276882B9583964FE0C37CC86 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2E0B65340ED60C1BEFC818CD9FF81185 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Example" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 802059283A3ED2AB173AF0F2A31902AD /* Debug */, - E7AE764CD2BDDB9FED9F828BBD71C402 /* Release */, + 50646285DD9FD95AF390BDA3FB1948EA /* Debug */, + 58DCB2BA7C34E84C00C38CEF18A96D11 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6E151CD202797E4A2B6521EE8BECB6DE /* Build configuration list for PBXNativeTarget "Kingfisher" */ = { + 329F3FAEB4A995CE81517B2B076B40AE /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - 30216BD4D1DE041A7A6F57D1D62B9314 /* Debug */, - 1F25A732760398E965091F0E6E9C39FB /* Release */, + 65EB105FCBDAFE2530F65E570F2DB967 /* Debug */, + 883660EF7C2C80A31B7C3EF3412B90FD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E5D55B6F3A9153750EC9D0157D146044 /* Build configuration list for PBXNativeTarget "WRCycleScrollView" */ = { + 69436F226BFCF6611AB1C0A9E8B179FE /* Build configuration list for PBXNativeTarget "WRCycleScrollView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2B0F146D8205280409DC857C8CF0B27C /* Debug */, - 15C362FAFBE5990A801BF59B93B55C0A /* Release */, + 3AEEB6F14AAD0453346D2C575CA6EC9D /* Debug */, + FD082CAF53766BA1F0D2C1B58B0E0A59 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F489F014DB4C214B0F040623742359DA /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Tests" */ = { + E30DD9F40B080CAEDC33C8AD11E7AED6 /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */ = { isa = XCConfigurationList; buildConfigurations = ( - D6B40A867C8136EA597197B5991DF20B /* Debug */, - 12DF7DF7F7E2A771C22A0C508B55E5E8 /* Release */, + A54E1800647D456D492773169FAB7819 /* Debug */, + CF74AA8576574BE1D7D47693FD3B2D38 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F495FFE5A6FA13AF007AF7EF43CF204B /* Build configuration list for PBXNativeTarget "WRNavigationBar_swift" */ = { + EBA946D171532BD2C6FE21CE28013ED3 /* Build configuration list for PBXNativeTarget "Pods-WRCycleScrollView_Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8D4971BA4E317AEED734296D352C6E98 /* Debug */, - 5551858CC0F5017E81F0D2D436EF9820 /* Release */, + 5A05AEED86CFC80539147973D642EB71 /* Debug */, + 2B24A4F9ADFE30B7C2997E2C2CDE2B6B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig index f965c01..9e127bc 100644 --- a/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig +++ b/Example/Pods/Target Support Files/WRCycleScrollView/WRCycleScrollView.xcconfig @@ -1,5 +1,4 @@ CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WRCycleScrollView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/Example/WRCycleScrollView/AppDelegate.swift b/Example/WRCycleScrollView/AppDelegate.swift index a8cd60b..7c92a9a 100644 --- a/Example/WRCycleScrollView/AppDelegate.swift +++ b/Example/WRCycleScrollView/AppDelegate.swift @@ -9,6 +9,8 @@ import UIKit import WRNavigationBar_swift +import Kingfisher +import WRCycleScrollView let MainNavBarColor = UIColor.init(red: 0/255.0, green: 175/255.0, blue: 240/255.0, alpha: 1) let kScreenWidth = UIScreen.main.bounds.width @@ -34,6 +36,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate setNavBarAppearence() + // 缓存器初始化 + WRCycleScrollView.imageViewCacher = { [weak self] (imageView, url) in + guard let _ = self else { return } + imageView.kf.setImage(with: url) + } + return true } diff --git a/WRCycleScrollView/Classes/WRCycleCell.swift b/WRCycleScrollView/Classes/WRCycleCell.swift index a0354d9..fb183cf 100644 --- a/WRCycleScrollView/Classes/WRCycleCell.swift +++ b/WRCycleScrollView/Classes/WRCycleCell.swift @@ -8,7 +8,6 @@ // Github地址:https://github.com/wangrui460/WRCycleScrollView import UIKit -import Kingfisher public class WRCycleCell: UICollectionViewCell { @@ -19,7 +18,7 @@ public class WRCycleCell: UICollectionViewCell didSet { switch imgSource { case let .SERVER(url): - imgView.kf.setImage(with: url) + WRCycleScrollView.imageViewCacher(imgView, url) case let .LOCAL(name): imgView.image = UIImage(named: name) } diff --git a/WRCycleScrollView/Classes/WRCycleScrollView.swift b/WRCycleScrollView/Classes/WRCycleScrollView.swift index 0f6e3ff..c16a699 100644 --- a/WRCycleScrollView/Classes/WRCycleScrollView.swift +++ b/WRCycleScrollView/Classes/WRCycleScrollView.swift @@ -9,6 +9,13 @@ import UIKit +public extension WRCycleScrollView { + + /// 缓存器 + public static var imageViewCacher: (UIImageView, URL) -> Void = { (imageView, url) in + fatalError("WRCycleScrollView.imageViewCacher must custom!") + } +} @objc public protocol WRCycleScrollViewDelegate { @@ -20,7 +27,6 @@ import UIKit public class WRCycleScrollView: UIView, PageControlAlimentProtocol, EndlessScrollProtocol { - //======================================================= // MARK: 对外提供的属性 //=======================================================