diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a9bcd0..66c53fda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ----- +## [2.6.0 - Indicator Customization](https://github.com/onevcat/Kingfisher/releases/tag/2.6.0) (2016-09-12) + +#### Add +* Support for different types of indicators, including gif images. [#425](https://github.com/onevcat/Kingfisher/pull/425) + +--- + ## [2.5.1 - Prefetcher Trap](https://github.com/onevcat/Kingfisher/releases/tag/2.5.1) (2016-09-06) #### Fix diff --git a/Demo/Kingfisher-Demo/Info.plist b/Demo/Kingfisher-Demo/Info.plist index 2b4e6c40..facec464 100644 --- a/Demo/Kingfisher-Demo/Info.plist +++ b/Demo/Kingfisher-Demo/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/Demo/Kingfisher-macOS-Demo/Info.plist b/Demo/Kingfisher-macOS-Demo/Info.plist index db5cbf54..778e9b69 100644 --- a/Demo/Kingfisher-macOS-Demo/Info.plist +++ b/Demo/Kingfisher-macOS-Demo/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright diff --git a/Demo/Kingfisher-tvOS-Demo/Info.plist b/Demo/Kingfisher-tvOS-Demo/Info.plist index 858f8e72..43386835 100644 --- a/Demo/Kingfisher-tvOS-Demo/Info.plist +++ b/Demo/Kingfisher-tvOS-Demo/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/Demo/Kingfisher-watchOS-Demo Extension/Info.plist b/Demo/Kingfisher-watchOS-Demo Extension/Info.plist index c280bf90..d8c6a923 100644 --- a/Demo/Kingfisher-watchOS-Demo Extension/Info.plist +++ b/Demo/Kingfisher-watchOS-Demo Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 NSExtension NSExtensionAttributes diff --git a/Demo/Kingfisher-watchOS-Demo/Info.plist b/Demo/Kingfisher-watchOS-Demo/Info.plist index 12d9b954..e819bf2d 100644 --- a/Demo/Kingfisher-watchOS-Demo/Info.plist +++ b/Demo/Kingfisher-watchOS-Demo/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Kingfisher.podspec b/Kingfisher.podspec index e7e76347..21d8ce8f 100644 --- a/Kingfisher.podspec +++ b/Kingfisher.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "Kingfisher" - s.version = "2.5.1" + s.version = "2.6.0" s.summary = "A lightweight and pure Swift implemented library for downloading and cacheing image from the web." s.description = <<-DESC @@ -36,11 +36,12 @@ Pod::Spec.new do |s| s.public_header_files = ["Sources/Kingfisher.h"] s.osx.exclude_files = ["Sources/AnimatedImageView.swift", "Sources/UIButton+Kingfisher.swift"] - s.watchos.exclude_files = ["Sources/AnimatedImageView.swift", "Sources/UIButton+Kingfisher.swift", "Sources/ImageView+Kingfisher.swift", "Sources/NSButton+Kingfisher.swift"] + s.watchos.exclude_files = ["Sources/AnimatedImageView.swift", "Sources/UIButton+Kingfisher.swift", "Sources/ImageView+Kingfisher.swift", "Sources/NSButton+Kingfisher.swift", "Sources/Indicator.swift"] s.ios.exclude_files = "Sources/NSButton+Kingfisher.swift" s.tvos.exclude_files = "Sources/NSButton+Kingfisher.swift" s.requires_arc = true s.framework = "CFNetwork" + s.pod_target_xcconfig = { 'SWIFT_VERSION' => '2.3' } end diff --git a/Sources/Box.swift b/Sources/Box.swift new file mode 100644 index 00000000..7076add8 --- /dev/null +++ b/Sources/Box.swift @@ -0,0 +1,16 @@ +// +// Box.swift +// Kingfisher +// +// Created by WANG WEI on 2016/09/12. +// Copyright © 2016年 Wei Wang. All rights reserved. +// + +import Foundation + +class Box { + let value: T + init(value: T) { + self.value = value + } +} diff --git a/Sources/Indicator.swift b/Sources/Indicator.swift new file mode 100644 index 00000000..2d05e965 --- /dev/null +++ b/Sources/Indicator.swift @@ -0,0 +1,176 @@ +// +// Indicator.swift +// Kingfisher +// +// Created by João D. Moreira on 30/08/16. +// +// Copyright (c) 2016 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(OSX) + import AppKit +#else + import UIKit +#endif + +#if os(OSX) + public typealias IndicatorView = NSView +#else + public typealias IndicatorView = UIView +#endif + +// MARK: - Indicator Protocol +public protocol Indicator { + func startAnimatingView() + func stopAnimatingView() + + var viewCenter: CGPoint { get set } + var view: IndicatorView { get } +} + +extension Indicator { + #if os(OSX) + var viewCenter: CGPoint { + get { + let frame = view.frame + return CGPoint(x: frame.origin.x + frame.size.width / 2.0, y: frame.origin.y + frame.size.height / 2.0 ) + } + set { + let frame = view.frame + let newFrame = CGRect(x: newValue.x - frame.size.width / 2.0, + y: newValue.y - frame.size.height / 2.0, + width: frame.size.width, + height: frame.size.height) + view.frame = newFrame + } + } + #else + var viewCenter: CGPoint { + get { + return view.center + } + set { + view.center = newValue + } + } + #endif +} + +// MARK: - ActivityIndicator +// Displays a NSProgressIndicator / UIActivityIndicatorView +struct ActivityIndicator: Indicator { + + #if os(OSX) + private let activityIndicatorView: NSProgressIndicator + #else + private let activityIndicatorView: UIActivityIndicatorView + #endif + + var view: IndicatorView { + return activityIndicatorView + } + + func startAnimatingView() { + #if os(OSX) + activityIndicatorView.startAnimation(nil) + #else + activityIndicatorView.startAnimating() + #endif + activityIndicatorView.hidden = false + } + + func stopAnimatingView() { + #if os(OSX) + activityIndicatorView.stopAnimation(nil) + #else + activityIndicatorView.stopAnimating() + #endif + activityIndicatorView.hidden = true + } + + init() { + #if os(OSX) + activityIndicatorView = NSProgressIndicator(frame: CGRect(x: 0, y: 0, width: 16, height: 16)) + + #if swift(>=2.3) + activityIndicatorView.controlSize = .Small + #else + activityIndicatorView.controlSize = .SmallControlSize + #endif + activityIndicatorView.style = .SpinningStyle + #else + #if os(tvOS) + let indicatorStyle = UIActivityIndicatorViewStyle.White + #else + let indicatorStyle = UIActivityIndicatorViewStyle.Gray + #endif + activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle:indicatorStyle) + activityIndicatorView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleBottomMargin, .FlexibleTopMargin] + #endif + } +} + +// MARK: - ImageIndicator +// Displays an ImageView. Supports gif +struct ImageIndicator: Indicator { + private let animatedImageIndicatorView: ImageView + + var view: IndicatorView { + return animatedImageIndicatorView + } + + init(imageData data: NSData) { + + let image = Image.kf_imageWithData(data, scale: 1.0, preloadAllGIFData: true) + animatedImageIndicatorView = ImageView() + animatedImageIndicatorView.image = image + + #if os(OSX) + // Need for gif to animate on OSX + self.animatedImageIndicatorView.imageScaling = .ScaleNone + self.animatedImageIndicatorView.canDrawSubviewsIntoLayer = true + #else + animatedImageIndicatorView.contentMode = .Center + + animatedImageIndicatorView.autoresizingMask = [.FlexibleLeftMargin, + .FlexibleRightMargin, + .FlexibleBottomMargin, + .FlexibleTopMargin] + #endif + } + + func startAnimatingView() { + #if os(OSX) + animatedImageIndicatorView.animates = true + #else + animatedImageIndicatorView.startAnimating() + #endif + animatedImageIndicatorView.hidden = false + } + + func stopAnimatingView() { + #if os(OSX) + animatedImageIndicatorView.animates = false + #else + animatedImageIndicatorView.stopAnimating() + #endif + animatedImageIndicatorView.hidden = true + } +} diff --git a/Sources/Info.plist b/Sources/Info.plist index f4b283eb..804187c0 100644 --- a/Sources/Info.plist +++ b/Sources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 NSPrincipalClass diff --git a/Tests/KingfisherTests-macOS/Info.plist b/Tests/KingfisherTests-macOS/Info.plist index ae9cbc29..2b7c43f9 100644 --- a/Tests/KingfisherTests-macOS/Info.plist +++ b/Tests/KingfisherTests-macOS/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 diff --git a/Tests/KingfisherTests-tvOS/Info.plist b/Tests/KingfisherTests-tvOS/Info.plist index ae9cbc29..2b7c43f9 100644 --- a/Tests/KingfisherTests-tvOS/Info.plist +++ b/Tests/KingfisherTests-tvOS/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 diff --git a/Tests/KingfisherTests/Info.plist b/Tests/KingfisherTests/Info.plist index ae9cbc29..2b7c43f9 100644 --- a/Tests/KingfisherTests/Info.plist +++ b/Tests/KingfisherTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.5.1 + 2.6.0 CFBundleSignature ???? CFBundleVersion - 707 + 718 diff --git a/images/loader.gif b/images/loader.gif new file mode 100644 index 00000000..ed2c01b5 Binary files /dev/null and b/images/loader.gif differ