Compare commits
76 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d5e5c3e1d | |||
| 7e33f7121a | |||
| 09fefa292a | |||
| 47c6d744ba | |||
| fc32f8282e | |||
| 7ee84c24f0 | |||
| 12a15f1051 | |||
| 6a8f927510 | |||
| 3bf16ecae9 | |||
| 5a7b211f16 | |||
| 189c907bb9 | |||
| 6f16ae64ab | |||
| b911dfa9e2 | |||
| 2335a371b6 | |||
| b41d7ad944 | |||
| 4ffb2e1e0c | |||
| 9ae2adb81c | |||
| 185782daab | |||
| 51acae13a1 | |||
| 03217243d9 | |||
| 072e45902d | |||
| 326037ce93 | |||
| f447549666 | |||
| eba1d39ba3 | |||
| 8d28b65add | |||
| e72a54356e | |||
| 86440913ba | |||
| c1ac9e4a2f | |||
| 6f185f9e53 | |||
| d142629dd3 | |||
| 84d9c0f5da | |||
| 5f400d3c91 | |||
| 409b58c53c | |||
| 0b6108dea8 | |||
| c7fe1c4114 | |||
| 318d59dadd | |||
| ffd12921a4 | |||
| ef2f02743f | |||
| 74d63d31e3 | |||
| 49c7bdee0c | |||
| 851e78c668 | |||
| 03c2a3bcc3 | |||
| 21bb7ba160 | |||
| 7fdd5d3fd4 | |||
| 61785ce2ae | |||
| 37c0af3b9f | |||
| b9f05fc663 | |||
| 5694e92c8e | |||
| 9b45ea0a3e | |||
| fff3c5e604 | |||
| c411f6def5 | |||
| 0143a80159 | |||
| 11582c5264 | |||
| 6c5ea8541b | |||
| 8b523246b1 | |||
| ac6d2b9795 | |||
| a28f8001e6 | |||
| 424796abe7 | |||
| 1ca8816ed2 | |||
| 523cc43cfd | |||
| 61622a7a2c | |||
| a9b1164887 | |||
| dadbb15a42 | |||
| 3013f009f4 | |||
| f938ab839c | |||
| 1c1dd00cd2 | |||
| efd23addd4 | |||
| 57ee6e4c0a | |||
| 2fae7ae37e | |||
| b52f77d97e | |||
| 5fde466dec | |||
| a557e4b84e | |||
| 03ba74ee6b | |||
| 9908faf9b9 | |||
| 068d86d109 | |||
| 4bf53d2d39 |
+22
-3
@@ -1,4 +1,23 @@
|
||||
.*.sw?
|
||||
# OS X
|
||||
.DS_Store
|
||||
.rbenv-version
|
||||
Gemfile.lock
|
||||
|
||||
# Xcode
|
||||
build/
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
*.xccheckout
|
||||
profile
|
||||
*.moved-aside
|
||||
DerivedData
|
||||
*.hmap
|
||||
*.xccheckout
|
||||
|
||||
# CocoaPods
|
||||
Pods
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
language: ruby
|
||||
rvm:
|
||||
- 1.8.7
|
||||
- 1.9.3
|
||||
install: rake travis:setup
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.1'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.1' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.2'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.2' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.3'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.3' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.4'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.4' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.5'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.5' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.6'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.6' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0.7'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0.7' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2DynamicDelegate'
|
||||
s.version = '1.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Blocks are to functions as A2DynamicDelegate is to delegates.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2DynamicDelegate'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us',
|
||||
'Zachary Waldowski' => 'zwaldowski@gmail.com' }
|
||||
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2DynamicDelegate.git', :tag => 'v1.0' }
|
||||
s.source_files = 'A2DynamicDelegate.{h,m}', 'A2BlockDelegate.{h,m}'
|
||||
end
|
||||
@@ -1,11 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2StoryboardSegueContext'
|
||||
s.version = '1.0.1'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Supplement your segues\' identifier strings with context objects.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2StoryboardSegueContext/'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2StoryboardSegueContext.git', :tag => 'v1.0.1' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'A2StoryboardSegueContext.{h,m}'
|
||||
end
|
||||
@@ -1,11 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'A2StoryboardSegueContext'
|
||||
s.version = '1.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Supplement your segues\' identifier strings with context objects.'
|
||||
s.homepage = 'https://github.com/pandamonia/A2StoryboardSegueContext/'
|
||||
s.author = { 'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/pandamonia/A2StoryboardSegueContext.git', :tag => 'v1.0' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'A2StoryboardSegueContext.{h,m}'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ABContactHelper'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Objective-C Address Book wrapper.'
|
||||
s.homepage = 'https://github.com/erica/ABContactHelper'
|
||||
s.author = { 'Erica Sadun' => '' }
|
||||
s.source = { :git => 'https://github.com/erica/ABContactHelper.git', :commit => 'de4bc411fd45db5e7b5b13f38704764bc1e1bcd1' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'ABContact.{h,m}', 'ABGroup.{h,m}', 'ABContactsHelper.{h,m}'
|
||||
s.frameworks = 'AddressBook', 'AddressBookUI'
|
||||
end
|
||||
@@ -1,15 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ADVProgressBar'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Progress Bar Design with Percentage values'
|
||||
s.homepage = 'https://github.com/appdesignvault'
|
||||
s.author = { 'appdesignvault' => 'appdesignvault' }
|
||||
s.source = { :git => 'https://github.com/appdesignvault/ADVProgressBar.git', :commit => 'ff88e5ce20fed36b1e0e2da167f0b7f51e62ce8c' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'ADVProgressBar/Classes/*.{h,m}'
|
||||
s.resources = "ADVProgressBar/Resources/*.png"
|
||||
s.framework = 'UIKit'
|
||||
s.clean_paths = "ADVProgressBar.xcodeproj" , 'ADVProgressBar/en.lproj' , 'ADVProgressBar/ADVAppDelegate.{h,m}' , 'ADVProgressBar/ADVViewController.{h,m}' , 'ADVProgressBar/ADVProgressBar-Info.plist' , 'ADVProgressBar/ADVProgressBar-Prefix.pch'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -1,11 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AFHTTPRequestOperationLogger'
|
||||
s.version = '0.9.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'AFNetworking Extension for HTTP Request Logging'
|
||||
s.homepage = 'https://github.com/AFNetworking/AFHTTPRequestOperationLogger'
|
||||
s.authors = { 'Mattt Thompson' => 'm@mattt.me' }
|
||||
s.source = { :git => 'https://github.com/AFNetworking/AFHTTPRequestOperationLogger.git', :tag => '0.9.0' }
|
||||
s.source_files = 'AFHTTPRequestOperationLogger.{h,m}'
|
||||
s.dependency 'AFNetworking', '0.9.0'
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AFNetworking'
|
||||
s.version = '0.5.1'
|
||||
s.summary = 'A delightful iOS networking library with NSOperations and block-based callbacks'
|
||||
s.homepage = 'https://github.com/gowalla/AFNetworking'
|
||||
s.author = { 'Gowalla' => 'live@gowalla.com' }
|
||||
s.source = { :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.5.1' }
|
||||
|
||||
if config.ios?
|
||||
s.source_files = 'AFNetworking' # everything
|
||||
else
|
||||
s.source_files = %w{
|
||||
AFNetworking/AFHTTPRequestOperation.h
|
||||
AFNetworking/AFJSONRequestOperation.h
|
||||
AFNetworking/NSData+AFNetworking.h
|
||||
AFNetworking/NSMutableURLRequest+AFNetworking.h
|
||||
AFNetworking/NSString+AFNetworking.h
|
||||
}
|
||||
end
|
||||
|
||||
s.library = 'z'
|
||||
s.dependency 'JSONKit'
|
||||
end
|
||||
@@ -1,15 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AFNetworking'
|
||||
s.version = '0.7.0'
|
||||
s.summary = 'A delightful iOS networking library with NSOperations and block-based callbacks'
|
||||
s.homepage = 'https://github.com/AFNetworking/AFNetworking'
|
||||
s.author = {'Mattt Thompson' => 'm@mattt.me', 'Scott Raymond' => 'sco@gowalla.com'}
|
||||
s.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '0.7.0' }
|
||||
|
||||
s.source_files = 'AFNetworking'
|
||||
|
||||
s.clean_paths = ['iOS Example', 'Mac Example', 'AFNetworking.xcworkspace']
|
||||
|
||||
s.library = 'z'
|
||||
s.dependency 'JSONKit'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AFNetworking'
|
||||
s.version = '0.9.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A delightful iOS and OS X networking framework'
|
||||
s.homepage = 'https://github.com/AFNetworking/AFNetworking'
|
||||
s.authors = {'Mattt Thompson' => 'm@mattt.me', 'Scott Raymond' => 'sco@gowalla.com'}
|
||||
s.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '0.9.0' }
|
||||
s.source_files = 'AFNetworking'
|
||||
s.clean_paths = ['iOS Example', 'Mac Example', 'AFNetworking.xcworkspace']
|
||||
s.framework = 'SystemConfiguration'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AFNetworking'
|
||||
s.version = '0.9.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A delightful iOS and OS X networking framework'
|
||||
s.homepage = 'https://github.com/AFNetworking/AFNetworking'
|
||||
s.authors = {'Mattt Thompson' => 'm@mattt.me', 'Scott Raymond' => 'sco@gowalla.com'}
|
||||
s.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '0.9.1' }
|
||||
s.source_files = 'AFNetworking'
|
||||
s.clean_paths = ['iOS Example', 'Mac Example', 'AFNetworking.xcworkspace']
|
||||
s.framework = 'SystemConfiguration'
|
||||
end
|
||||
@@ -1,10 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AFOAuth2Client'
|
||||
s.version = '0.0.1'
|
||||
s.summary = 'AFNetworking Extension for OAuth 2 Authentication'
|
||||
s.homepage = 'https://github.com/AFNetworking/AFOAuth2Client'
|
||||
s.author = { 'Mattt Thompson' => 'm@mattt.me' }
|
||||
s.source = { :git => 'https://github.com/AFNetworking/AFOAuth2Client.git',
|
||||
:commit => '068c25f83b800451cf0b5ba0da7a6a018252c0a9' }
|
||||
s.source_files = '*.{h,m}'
|
||||
end
|
||||
@@ -1,33 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ASIHTTPRequest'
|
||||
s.version = '1.8.1'
|
||||
s.summary = 'Easy to use CFNetwork wrapper for HTTP requests, Objective-C, Mac OS X and iPhone.'
|
||||
s.homepage = 'http://allseeing-i.com/ASIHTTPRequest'
|
||||
s.author = { 'Ben Copsey' => 'ben@allseeing-i.com' }
|
||||
s.source = { :git => 'https://github.com/pokeb/asi-http-request.git', :tag => 'v1.8.1' }
|
||||
|
||||
s.description = %{
|
||||
ASIHTTPRequest is an easy to use wrapper around the CFNetwork API that
|
||||
makes some of the more tedious aspects of communicating with web servers
|
||||
easier. It is written in Objective-C and works in both Mac OS X and iPhone
|
||||
applications.
|
||||
|
||||
It is suitable performing basic HTTP requests and interacting with
|
||||
REST-based services (GET / POST / PUT / DELETE). The included
|
||||
ASIFormDataRequest subclass makes it easy to submit POST data and files
|
||||
using multipart/form-data.
|
||||
}
|
||||
|
||||
s.clean_paths = '*Sample', 'External', '*.xcodeproj', 'Build Scripts'
|
||||
|
||||
if config.ios?
|
||||
s.dependency 'Reachability' #, '~> 2.0', '>= 2.0.4'
|
||||
s.source_files = 'Classes'
|
||||
s.frameworks = 'MobileCoreServices', 'CFNetwork', 'CoreGraphics'
|
||||
else
|
||||
s.source_files = FileList['Classes/*.*'].exclude(/ASIAuthenticationDialog\.\w$/)
|
||||
s.frameworks = 'SystemConfiguration', 'CoreServices'
|
||||
end
|
||||
|
||||
s.library = 'z.1'
|
||||
end
|
||||
@@ -1,17 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ASIWebPageRequest'
|
||||
s.version = '1.8.1'
|
||||
s.homepage = 'http://allseeing-i.com/ASIHTTPRequest/ASIWebPageRequest'
|
||||
s.author = { 'Ben Copsey' => 'ben@allseeing-i.com' }
|
||||
|
||||
s.summary = 'The ASIWebPageRequest class included with ASIHTTPRequest lets you ' \
|
||||
'download complete webpages, including external resources like ' \
|
||||
'images and stylesheets.'
|
||||
|
||||
s.part_of_dependency = 'ASIHTTPRequest', '1.8.1'
|
||||
s.source_files = 'Classes/ASIWebPageRequest/*.m', 'Classes/ASIWebPageRequest/*.h'
|
||||
|
||||
s.library = 'xml2.2.7.3'
|
||||
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
|
||||
end
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ASStarRatingView'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = "ASStarRatingView is a control to rating with stars, it is simple to use and configurable"
|
||||
s.homepage = 'https://github.com/bl0ckme/ASStarRatingView'
|
||||
s.author = { 'Sam Yang' => 'yanguango@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/bl0ckme/ASStarRatingView.git', :tag => 'v0.1.0' }
|
||||
s.description = "ASStarRatingView is a control to rating with stars, it is simple to use and configurable"
|
||||
s.platform = :ios
|
||||
s.source_files = 'ASStarRatingView/**/*.{h,m}'
|
||||
s.resources = "ASStarRatingView/stars/*.png"
|
||||
s.clean_path = "ASStarRatingViewDemo"
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ATMHud'
|
||||
s.version = '0.0.1'
|
||||
s.platform = :ios
|
||||
s.summary = 'Library for the creation of HUDs in iPhone applications.'
|
||||
s.homepage = 'https://github.com/atomton/ATMHud'
|
||||
s.author = { 'Marcel Müller' => 'pool@atomton.net' }
|
||||
s.source = { :git => 'git://github.com/atomton/ATMHud.git', :commit => 'fc79fed7268362c744de5470169db0a381866ad7' }
|
||||
s.source_files = 'ATM*.{h,m}'
|
||||
s.resources = '11-x.png', '19-check.png', 'pop.wav'
|
||||
s.frameworks = 'QuartzCore', 'AudioToolbox'
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'AUIAnimatedText'
|
||||
s.version = '0.0.1'
|
||||
s.summary = 'A drop-in UILabel replacement that makes almost all properties animatable by using a CATextLayer instead of CALayer.'
|
||||
s.homepage = 'https://github.com/adam-siton/AUIAnimatedText'
|
||||
s.author = { 'Adam Siton'=> 'adamsiton@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/adam-siton/AUIAnimatedText.git' }
|
||||
s.description = 'Properties animatable in AUIAnimatableText and not in UILabel: textColor, text, font, fontSize.'
|
||||
s.platform = :ios
|
||||
s.source_files = 'AUIAnimatedText/AUIAnimatedText/AUIAnimatableLabel.{h,m}', 'AUIAnimatedText/AUIAnimatedText/UIFont+CoreTextExtensions.{h,m}'
|
||||
s.clean_paths =
|
||||
'AUIAnimatedText/AUIAnimatedTextTests',
|
||||
'AUIAnimatedText/AUIAnimatedText.xcodeproj',
|
||||
'AUIAnimatedText/AUIAnimatedText/en.lproj',
|
||||
'AUIAnimatedText/AUIAnimatedText/iPhone',
|
||||
'AUIAnimatedText/AUIAnimatedText/AUIAnimatedText-Info.plist',
|
||||
'AUIAnimatedText/AUIAnimatedText/AUIAnimatedText-Prefix.pch',
|
||||
'AUIAnimatedText/AUIAnimatedText/AUIAnimatedTextAppDelegate.{h,m}',
|
||||
'AUIAnimatedText/AUIAnimatedText/RootViewController.{h,m,xib}',
|
||||
'AUIAnimatedText/AUIAnimatedText/main.m'
|
||||
s.framework = 'CoreText', 'QuartzCore', 'CoreGraphics', 'UIKit'
|
||||
end
|
||||
@@ -1,11 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Appirater'
|
||||
s.version = '0.0.1'
|
||||
s.platform = :ios
|
||||
s.summary = "A utility that reminds your iPhone app's users to review the app."
|
||||
s.homepage = 'http://arashpayan.com/blog/2009/09/07/presenting-appirater/'
|
||||
s.author = { 'Arash Payan' => 'arash.payan@gmail.com' }
|
||||
s.source = { :git => 'git://github.com/arashpayan/appirater.git', :commit => '0f3776a47b17bd4f6cbee0ad02c9450869d26c42' }
|
||||
s.source_files = '*.{h,m}'
|
||||
s.frameworks = 'CFNetwork', 'SystemConfiguration'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Appirater'
|
||||
s.version = '0.0.2'
|
||||
s.platform = :ios
|
||||
s.summary = "A utility that reminds your iPhone app's users to review the app."
|
||||
s.homepage = 'http://arashpayan.com/blog/2009/09/07/presenting-appirater/'
|
||||
s.author = { 'Arash Payan' => 'arash.payan@gmail.com' }
|
||||
s.source = { :git => 'git://github.com/mk/appirater.git', :tag => '0.0.2' }
|
||||
s.source_files = '*.{h,m}'
|
||||
s.frameworks = 'CFNetwork', 'SystemConfiguration'
|
||||
s.resource = 'Appirater.bundle'
|
||||
end
|
||||
@@ -1,28 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BaseKit'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'Apache 2'
|
||||
s.summary = 'BaseKit is a set of IOS class to make your life easier.'
|
||||
s.homepage = 'https://github.com/brunow/BaseKit'
|
||||
s.author = { 'Bruno Wernimont' => 'bruno.wernimont+github@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/brunow/BaseKit.git', :tag => '0.1' }
|
||||
|
||||
s.description = 'BaseKit is a set of IOS class to make your life easier.'
|
||||
s.platform = :ios
|
||||
s.clean_paths = 'Examples', 'GHUnitIOS.framework', 'Test', 'Vendor', 'README.md', '.gitignore', 'BaseKit.xcodeproj'
|
||||
|
||||
s.subspec 'Core' do |core|
|
||||
core.source_files = 'Code/Core/*.{h,m}'
|
||||
end
|
||||
|
||||
s.subspec 'View' do |view|
|
||||
view.source_files = 'Code/View/*.{h,m}'
|
||||
view.dependency 'BaseKit/Core'
|
||||
end
|
||||
|
||||
s.subspec 'CellMapping' do |cell_mapping|
|
||||
cell_mapping.source_files = 'Code/CellMapping/*.{h,m}'
|
||||
cell_mapping.dependency 'BaseKit/Core'
|
||||
cell_mapping.dependency 'BaseKit/View'
|
||||
end
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '0.5.0' # picked some version number as the project doesn't have one yet
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com'}
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :commit => '84b12bd081c71b17e56c133002eee8f8577e9a24' }
|
||||
|
||||
s.source_files = 'BlocksKit'
|
||||
|
||||
s.frameworks = 'MessageUI'
|
||||
|
||||
s.requires_arc = true
|
||||
|
||||
s.clean_paths = 'BlocksKit.xcodeproj/', 'GHUnitIOS.framework/', 'Tests/', '.gitignore'
|
||||
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import <dispatch/dispatch.h>\n#import "BKGlobals.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '0.9.0'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com'}
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v0.9' }
|
||||
|
||||
s.source_files = 'BlocksKit'
|
||||
|
||||
s.frameworks = 'MessageUI'
|
||||
|
||||
s.requires_arc = true
|
||||
|
||||
s.clean_paths = 'BlocksKit.xcodeproj/', 'GHUnitIOS.framework/', 'Tests/', '.gitignore'
|
||||
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import <dispatch/dispatch.h>\n#import "BKGlobals.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '0.9.5'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com'}
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v0.9.5' }
|
||||
|
||||
s.source_files = 'BlocksKit'
|
||||
|
||||
s.frameworks = 'MessageUI'
|
||||
|
||||
s.requires_arc = true
|
||||
|
||||
s.clean_paths = 'BlocksKit.xcodeproj/', 'GHUnitIOS.framework/', 'Tests/', '.gitignore'
|
||||
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import <dispatch/dispatch.h>\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.0' }
|
||||
s.source_files = 'BlocksKit'
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.1' }
|
||||
s.source_files = 'BlocksKit'
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.2'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.2' }
|
||||
s.source_files = 'BlocksKit'
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.3'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.3' }
|
||||
s.source_files = 'BlocksKit'
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.4'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.4' }
|
||||
s.source_files = 'BlocksKit'
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,22 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.5'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.5' }
|
||||
s.source_files = 'BlocksKit'
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,24 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'BlocksKit'
|
||||
s.version = '1.0.6'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'The Objective-C block utilities you always wish you had.'
|
||||
s.homepage = 'https://github.com/zwaldowski/BlocksKit'
|
||||
s.author = { 'Zachary Waldowski' => 'zwaldowski@gmail.com',
|
||||
'Alexsander Akers' => 'a2@pandamonia.us' }
|
||||
s.source = { :git => 'https://github.com/zwaldowski/BlocksKit.git', :tag => 'v1.0.6' }
|
||||
s.dependency 'A2DynamicDelegate'
|
||||
s.clean_paths = 'GHUnitIOS.framework/', 'Tests/', 'BlocksKit.xcodeproj/', '.gitignore'
|
||||
if config.ios?
|
||||
s.frameworks = 'MessageUI'
|
||||
s.source_files = 'BlocksKit/*.{h,m}', 'BlocksKit/UIKit/*.{h,m}', 'BlocksKit/MessageUI/*.{h,m}'
|
||||
else
|
||||
s.source_files = 'BlocksKit/*.{h,m}'
|
||||
end
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import "BlocksKit.h"\n#endif})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,20 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CEPopupPickerView'
|
||||
s.version = '0.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A UIPickerView that pops up, just like the Facebook app.'
|
||||
s.homepage = 'https://github.com/chriseidhof/CEPopupPickerView'
|
||||
s.author = { 'Chris Eidhof' => 'chris@eidhof.nl' }
|
||||
|
||||
s.source = { :git => 'https://github.com/chriseidhof/CEPopupPickerView.git', :tag => 'v0.1' }
|
||||
|
||||
s.platform = :ios
|
||||
s.requires_arc = true
|
||||
|
||||
s.source_files = 'CEPopupPickerView/CEPopupPickerView.{h,m}'
|
||||
s.clean_paths = '*.xcodeproj', '**/*.lproj', '**/*.plist', '*.xcworkspace',
|
||||
'*Tests', 'Podfile', '**/*.pch',
|
||||
"**/CEAppDelegate.*",
|
||||
"**/CEViewController.{h,m}",
|
||||
"**/main.m"
|
||||
end
|
||||
@@ -1,13 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CMPopTipView'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Custom UIView for iOS that pops up an animated "bubble" pointing at a button or other view. Useful for popup tips.'
|
||||
s.homepage = 'https://github.com/chrismiles/CMPopTipView'
|
||||
s.author = { 'Chris Miles' => 'http://chrismiles.info/' }
|
||||
s.source = { :git => 'https://github.com/chrismiles/CMPopTipView.git', :commit => '92e85f47c565e25063d95959edcf1fd4db700a34' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'CMPopTipView/*.{h,m}'
|
||||
s.framework = 'UIKit'
|
||||
s.clean_path = "Demo"
|
||||
end
|
||||
@@ -0,0 +1,116 @@
|
||||
//
|
||||
// JBBarChartView.h
|
||||
// JBChartView
|
||||
//
|
||||
// Created by Terry Worona on 9/3/13.
|
||||
// Copyright (c) 2013 Jawbone. All rights reserved.
|
||||
//
|
||||
|
||||
// Views
|
||||
#import "JBChartView.h"
|
||||
|
||||
@protocol JBBarChartViewDelegate;
|
||||
@protocol JBBarChartViewDataSource;
|
||||
|
||||
@interface JBBarChartView : JBChartView
|
||||
|
||||
@property (nonatomic, weak) id<JBBarChartViewDelegate> delegate;
|
||||
@property (nonatomic, weak) id<JBBarChartViewDataSource> dataSource;
|
||||
|
||||
/**
|
||||
* If showsSelection is YES, a vertical highlight will overlayed on a bar during touch events.
|
||||
*
|
||||
* Default: YES.
|
||||
*/
|
||||
@property (nonatomic, assign) BOOL showsSelection;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JBBarChartViewDelegate <NSObject>
|
||||
|
||||
@required
|
||||
|
||||
/**
|
||||
* Height for a bar at a given index (left to right). There is no ceiling on the the height;
|
||||
* the chart will automatically normalize all values between the overal min and max heights.
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
* @param index The 0-based index of a given bar (left to right, x-axis).
|
||||
*
|
||||
* @return The y-axis height of the supplied bar index (x-axis)
|
||||
*/
|
||||
- (CGFloat)barChartView:(JBBarChartView *)barChartView heightForBarViewAtAtIndex:(NSInteger)index;
|
||||
|
||||
@optional
|
||||
|
||||
/**
|
||||
* Occurs when a touch gesture event occurs on a given bar. The chart must be expanded, showsSelection must be YES,
|
||||
* and the selection must occur within the bounds of the chart.
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
* @param index The 0-based index of a given bar (left to right, x-axis).
|
||||
*/
|
||||
- (void)barChartView:(JBBarChartView *)barChartView didSelectBarAtIndex:(NSInteger)index;
|
||||
|
||||
/**
|
||||
* Occurs when selection ends by either ending a touch event or selecting an area that is outside the view's bounds.
|
||||
* For selection start events, see: didSelectBarAtIndex...
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
* @param index The 0-based index of a given bar. Index will be -1 if the touch ends outside of the view's bounds.
|
||||
*/
|
||||
- (void)barChartView:(JBBarChartView *)barChartView didUnselectBarAtIndex:(NSInteger)index;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JBBarChartViewDataSource <NSObject>
|
||||
|
||||
@required
|
||||
|
||||
/**
|
||||
* The number of bars in a given bar chart is the number of vertical views shown along the x-axis.
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
*
|
||||
* @return Number of bars in the given chart, displayed horizontally along the chart's x-axis.
|
||||
*/
|
||||
- (NSInteger)numberOfBarsInBarChartView:(JBBarChartView *)barChartView;
|
||||
|
||||
@optional
|
||||
|
||||
/**
|
||||
* Horizontal padding between bars.
|
||||
*
|
||||
* Default: 'best-guess' algorithm based on the the total number of bars and width of the chart.
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
*
|
||||
* @return Horizontal width (in pixels) between each bar.
|
||||
*/
|
||||
- (NSInteger)barPaddingForBarChartView:(JBBarChartView *)barChartView;
|
||||
|
||||
/**
|
||||
* A UIView subclass representing the bar at a particular index.
|
||||
*
|
||||
* Default: solid black UIView.
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
* @param index The 0-based index of a given bar (left to right, x-axis).
|
||||
*
|
||||
* @return A UIView subclass. The view will automatically be resized by the chart during creation (ie. no need to set the frame).
|
||||
*/
|
||||
- (UIView *)barViewForBarChartView:(JBBarChartView *)barChartView atIndex:(NSInteger)index;
|
||||
|
||||
/**
|
||||
* The selection color to be overlayed on a bar during touch events.
|
||||
* The color is automically faded to transparent (vertically).
|
||||
*
|
||||
* Default: white color (faded to transparent).
|
||||
*
|
||||
* @param barChartView The origin chart.
|
||||
*
|
||||
* @return The color to be used on each bar selection.
|
||||
*/
|
||||
- (UIColor *)selectionBarColorForBarChartView:(JBBarChartView *)barChartView;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,469 @@
|
||||
//
|
||||
// JBBarChartView.m
|
||||
// Nudge
|
||||
//
|
||||
// Created by Terry Worona on 9/3/13.
|
||||
// Copyright (c) 2013 Jawbone. All rights reserved.
|
||||
//
|
||||
|
||||
#import "JBBarChartView.h"
|
||||
|
||||
// Numerics
|
||||
CGFloat static const kJBBarChartViewBarBasePaddingMutliplier = 50.0f;
|
||||
CGFloat static const kJBBarChartViewUndefinedMaxHeight = -1.0f;
|
||||
CGFloat static const kJBBarChartViewStateAnimationDuration = 0.05f;
|
||||
CGFloat static const kJBBarChartViewPopOffset = 10.0f; // used to offset bars for 'pop' animations
|
||||
NSInteger static const kJBBarChartViewUndefinedBarIndex = -1;
|
||||
|
||||
// Colors (JBChartView)
|
||||
static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
|
||||
@interface JBBarChartView ()
|
||||
|
||||
@property (nonatomic, strong) NSDictionary *chartDataDictionary; // key = column, value = height
|
||||
@property (nonatomic, strong) NSArray *barViews;
|
||||
@property (nonatomic, assign) CGFloat barPadding;
|
||||
@property (nonatomic, assign) CGFloat cachedMaxHeight;
|
||||
@property (nonatomic, strong) JBChartSelectionView *selectionView;
|
||||
@property (nonatomic, assign) BOOL selectionViewVisible;
|
||||
|
||||
// View quick accessors
|
||||
- (CGFloat)availableHeight;
|
||||
- (CGFloat)normalizedHeightForRawHeight:(NSNumber*)rawHeight;
|
||||
- (CGFloat)maxHeight;
|
||||
- (CGFloat)minHeight;
|
||||
- (CGFloat)barWidth;
|
||||
- (CGFloat)popOffset;
|
||||
|
||||
// Touch helpers
|
||||
- (NSInteger)barViewIndexForPoint:(CGPoint)point;
|
||||
- (UIView *)barViewForForPoint:(CGPoint)point;
|
||||
- (void)touchesEndedOrCancelledWithTouches:(NSSet *)touches;
|
||||
|
||||
// Setters
|
||||
- (void)setSelectionViewVisible:(BOOL)selectionViewVisible animated:(BOOL)animated;
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBBarChartView
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
if (self == [JBBarChartView class])
|
||||
{
|
||||
kJBBarChartViewDefaultBarColor = [UIColor blackColor];
|
||||
}
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self)
|
||||
{
|
||||
self.clipsToBounds = YES;
|
||||
_showsSelection = YES;
|
||||
_cachedMaxHeight = kJBBarChartViewUndefinedMaxHeight;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
return [self initWithFrame:CGRectZero];
|
||||
}
|
||||
|
||||
#pragma mark - Memory Management
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self];
|
||||
}
|
||||
|
||||
#pragma mark - Data
|
||||
|
||||
- (void)reloadData
|
||||
{
|
||||
// reset cached max height
|
||||
self.cachedMaxHeight = kJBBarChartViewUndefinedMaxHeight;
|
||||
|
||||
/*
|
||||
* The data collection holds all position information:
|
||||
* constructed via datasource and delegate functions
|
||||
*/
|
||||
dispatch_block_t createDataDictionaries = ^{
|
||||
|
||||
// Grab the count
|
||||
NSAssert([self.dataSource respondsToSelector:@selector(numberOfBarsInBarChartView:)], @"JBBarChartView // datasource must implement - (NSInteger)numberOfBarsInBarChartView:(JBBarChartView *)barChartView");
|
||||
NSInteger dataCount = [self.dataSource numberOfBarsInBarChartView:self];
|
||||
|
||||
// Build up the data collection
|
||||
NSAssert([self.delegate respondsToSelector:@selector(barChartView:heightForBarViewAtAtIndex:)], @"JBBarChartView // delegate must implement - (NSInteger)barChartView:(JBBarChartView *)barChartView heightForBarViewAtAtIndex:(NSInteger)index");
|
||||
NSMutableDictionary *dataDictionary = [NSMutableDictionary dictionary];
|
||||
for (NSInteger index=0; index<dataCount; index++)
|
||||
{
|
||||
[dataDictionary setObject:[NSNumber numberWithFloat:[self.delegate barChartView:self heightForBarViewAtAtIndex:index]] forKey:[NSNumber numberWithInt:(int)index]];
|
||||
}
|
||||
self.chartDataDictionary = [NSDictionary dictionaryWithDictionary:dataDictionary];
|
||||
};
|
||||
|
||||
/*
|
||||
* Determines the padding between bars as a function of # of bars
|
||||
*/
|
||||
dispatch_block_t createBarPadding = ^{
|
||||
if ([self.dataSource respondsToSelector:@selector(barPaddingForBarChartView:)])
|
||||
{
|
||||
self.barPadding = [self.dataSource barPaddingForBarChartView:self];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSInteger totalBars = [[self.chartDataDictionary allKeys] count];
|
||||
self.barPadding = (1/(float)totalBars) * kJBBarChartViewBarBasePaddingMutliplier;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* Creates a new bar graph view using the previously calculated data model
|
||||
*/
|
||||
dispatch_block_t createBars = ^{
|
||||
|
||||
// Remove old bars
|
||||
for (UIView *barView in self.barViews)
|
||||
{
|
||||
[barView removeFromSuperview];
|
||||
}
|
||||
|
||||
CGFloat xOffset = 0;
|
||||
NSInteger index = 0;
|
||||
NSMutableArray *mutableBarViews = [NSMutableArray array];
|
||||
for (NSNumber *key in [[self.chartDataDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)])
|
||||
{
|
||||
UIView *barView = nil; // since all bars are visible at once, no need to cache this view
|
||||
if ([self.dataSource respondsToSelector:@selector(barViewForBarChartView:atIndex:)])
|
||||
{
|
||||
barView = [self.dataSource barViewForBarChartView:self atIndex:index];
|
||||
}
|
||||
else
|
||||
{
|
||||
barView = [[UIView alloc] init];
|
||||
barView.backgroundColor = kJBBarChartViewDefaultBarColor;
|
||||
}
|
||||
CGFloat height = [self normalizedHeightForRawHeight:[self.chartDataDictionary objectForKey:key]];
|
||||
CGFloat extensionHeight = height > 0.0 ? kJBBarChartViewPopOffset : 0.0;
|
||||
barView.frame = CGRectMake(xOffset, self.bounds.size.height - height - self.footerView.frame.size.height + self.headerPadding, [self barWidth], height + extensionHeight - self.headerPadding);
|
||||
[mutableBarViews addObject:barView];
|
||||
|
||||
// Add new bar
|
||||
if (self.footerView)
|
||||
{
|
||||
[self insertSubview:barView belowSubview:self.footerView];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self addSubview:barView];
|
||||
}
|
||||
|
||||
xOffset += ([self barWidth] + self.barPadding);
|
||||
index++;
|
||||
}
|
||||
self.barViews = [NSArray arrayWithArray:mutableBarViews];
|
||||
};
|
||||
|
||||
/*
|
||||
* Creates a vertical selection view for touch events
|
||||
*/
|
||||
dispatch_block_t createSelectionView = ^{
|
||||
|
||||
// Remove old selection bar
|
||||
if (self.selectionView)
|
||||
{
|
||||
[self.selectionView removeFromSuperview];
|
||||
self.selectionView = nil;
|
||||
}
|
||||
|
||||
self.selectionView = [[JBChartSelectionView alloc] initWithFrame:CGRectMake(0, 0, [self barWidth], self.bounds.size.height - self.footerView.frame.size.height)];
|
||||
self.selectionView.alpha = 0.0;
|
||||
if ([self.dataSource respondsToSelector:@selector(selectionBarColorForBarChartView:)])
|
||||
{
|
||||
self.selectionView.bgColor = [self.dataSource selectionBarColorForBarChartView:self];
|
||||
}
|
||||
|
||||
// Add new selection bar
|
||||
if (self.footerView)
|
||||
{
|
||||
[self insertSubview:self.selectionView belowSubview:self.footerView];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self addSubview:self.selectionView];
|
||||
}
|
||||
};
|
||||
|
||||
createDataDictionaries();
|
||||
createBarPadding();
|
||||
createBars();
|
||||
createSelectionView();
|
||||
|
||||
// Position header and footer
|
||||
self.headerView.frame = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, self.headerView.frame.size.height);
|
||||
self.footerView.frame = CGRectMake(self.bounds.origin.x, self.bounds.size.height - self.footerView.frame.size.height, self.bounds.size.width, self.footerView.frame.size.height);
|
||||
}
|
||||
|
||||
#pragma mark - View Quick Accessors
|
||||
|
||||
- (CGFloat)availableHeight
|
||||
{
|
||||
return self.bounds.size.height - self.headerView.frame.size.height - self.footerView.frame.size.height - self.headerPadding;
|
||||
}
|
||||
|
||||
- (CGFloat)normalizedHeightForRawHeight:(NSNumber*)rawHeight
|
||||
{
|
||||
CGFloat minHeight = [self minHeight];
|
||||
CGFloat maxHeight = [self maxHeight];
|
||||
CGFloat value = [rawHeight floatValue];
|
||||
|
||||
if ((maxHeight - minHeight) <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ((value - minHeight) / (maxHeight - minHeight)) * [self availableHeight];
|
||||
}
|
||||
|
||||
- (CGFloat)maxHeight
|
||||
{
|
||||
if (self.cachedMaxHeight == kJBBarChartViewUndefinedMaxHeight)
|
||||
{
|
||||
// max height is max value across all goals and values
|
||||
NSArray *chartValues = [[[self.chartDataDictionary allValues] arrayByAddingObjectsFromArray:[self.chartDataDictionary allValues]] sortedArrayUsingSelector:@selector(compare:)];
|
||||
self.cachedMaxHeight = [[chartValues lastObject] floatValue];
|
||||
}
|
||||
return self.cachedMaxHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)minHeight
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (CGFloat)barWidth
|
||||
{
|
||||
NSInteger barCount = [[self.chartDataDictionary allKeys] count];
|
||||
if (barCount > 0)
|
||||
{
|
||||
CGFloat totalPadding = (barCount - 1) * self.barPadding;
|
||||
CGFloat availableWidth = self.bounds.size.width - totalPadding;
|
||||
return availableWidth / barCount;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (CGFloat)popOffset
|
||||
{
|
||||
return self.bounds.size.height - self.footerView.frame.size.height;
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setState:(JBChartViewState)state animated:(BOOL)animated callback:(void (^)())callback
|
||||
{
|
||||
[super setState:state animated:animated callback:callback];
|
||||
|
||||
dispatch_block_t callbackCopy = [callback copy];
|
||||
|
||||
if (animated)
|
||||
{
|
||||
CGFloat popOffset = [self popOffset];
|
||||
|
||||
NSUInteger index = 0;
|
||||
for (UIView *barView in self.barViews)
|
||||
{
|
||||
[UIView animateWithDuration:kJBBarChartViewStateAnimationDuration delay:(kJBBarChartViewStateAnimationDuration * 0.5) * index options:UIViewAnimationOptionBeginFromCurrentState animations:^{
|
||||
barView.frame = CGRectMake(barView.frame.origin.x, popOffset - barView.frame.size.height, barView.frame.size.width, barView.frame.size.height);
|
||||
} completion:^(BOOL finished) {
|
||||
[UIView animateWithDuration:kJBBarChartViewStateAnimationDuration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
|
||||
if (state == JBChartViewStateExpanded)
|
||||
{
|
||||
barView.frame = CGRectMake(barView.frame.origin.x, popOffset - barView.frame.size.height + kJBBarChartViewPopOffset, barView.frame.size.width, barView.frame.size.height);
|
||||
}
|
||||
else if (state == JBChartViewStateCollapsed)
|
||||
{
|
||||
barView.frame = CGRectMake(barView.frame.origin.x, self.bounds.size.height, barView.frame.size.width, barView.frame.size.height);
|
||||
}
|
||||
} completion:^(BOOL lastBarFinished) {
|
||||
if (index == [self.barViews count] - 1)
|
||||
{
|
||||
if (callbackCopy)
|
||||
{
|
||||
callbackCopy();
|
||||
}
|
||||
}
|
||||
}];
|
||||
}];
|
||||
index++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (UIView *barView in self.barViews)
|
||||
{
|
||||
if (state == JBChartViewStateExpanded)
|
||||
{
|
||||
barView.frame = CGRectMake(barView.frame.origin.x, (self.bounds.size.height + kJBBarChartViewPopOffset) - (barView.frame.size.height + self.footerView.frame.size.height), barView.frame.size.width, barView.frame.size.height);
|
||||
}
|
||||
else if (state == JBChartViewStateCollapsed)
|
||||
{
|
||||
barView.frame = CGRectMake(barView.frame.origin.x, self.bounds.size.height, barView.frame.size.width, barView.frame.size.height);
|
||||
}
|
||||
}
|
||||
if (callbackCopy)
|
||||
{
|
||||
callbackCopy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Touch Helpers
|
||||
|
||||
- (NSInteger)barViewIndexForPoint:(CGPoint)point
|
||||
{
|
||||
NSUInteger index = 0;
|
||||
NSUInteger selectedIndex = kJBBarChartViewUndefinedBarIndex;
|
||||
|
||||
if (point.x < 0 || point.x > self.bounds.size.width)
|
||||
{
|
||||
return selectedIndex;
|
||||
}
|
||||
|
||||
CGFloat padding = ceil(self.barPadding * 0.5);
|
||||
for (UIView *barView in self.barViews)
|
||||
{
|
||||
CGFloat minX = CGRectGetMinX(barView.frame) - padding;
|
||||
CGFloat maxX = CGRectGetMaxX(barView.frame) + padding;
|
||||
if ((point.x >= minX) && (point.x <= maxX))
|
||||
{
|
||||
selectedIndex = index;
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return selectedIndex;
|
||||
}
|
||||
|
||||
- (UIView *)barViewForForPoint:(CGPoint)point
|
||||
{
|
||||
UIView *barView = nil;
|
||||
NSInteger selectedIndex = [self barViewIndexForPoint:point];
|
||||
if (selectedIndex >= 0)
|
||||
{
|
||||
barView = [self.barViews objectAtIndex:[self barViewIndexForPoint:point]];
|
||||
}
|
||||
return barView;
|
||||
}
|
||||
|
||||
- (void)touchesEndedOrCancelledWithTouches:(NSSet *)touches
|
||||
{
|
||||
if (!self.showsSelection || self.state == JBChartViewStateCollapsed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
[self setSelectionViewVisible:NO animated:YES];
|
||||
|
||||
UITouch *touch = [touches anyObject];
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
NSInteger index = [self barViewIndexForPoint:touchPoint];
|
||||
if ([self.delegate respondsToSelector:@selector(barChartView:didUnselectBarAtIndex:)])
|
||||
{
|
||||
[self.delegate barChartView:self didUnselectBarAtIndex:index];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setSelectionViewVisible:(BOOL)selectionViewVisible animated:(BOOL)animated
|
||||
{
|
||||
_selectionViewVisible = selectionViewVisible;
|
||||
|
||||
if (animated)
|
||||
{
|
||||
[UIView animateWithDuration:kJBChartViewDefaultAnimationDuration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
|
||||
self.selectionView.alpha = self.selectionViewVisible ? 1.0 : 0.0;
|
||||
} completion:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
self.selectionView.alpha = _selectionViewVisible ? 1.0 : 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setSelectionViewVisible:(BOOL)selectionViewVisible
|
||||
{
|
||||
[self setSelectionViewVisible:selectionViewVisible animated:NO];
|
||||
}
|
||||
|
||||
#pragma mark - Touches
|
||||
|
||||
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
if (!self.showsSelection || self.state == JBChartViewStateCollapsed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
UITouch *touch = [touches anyObject];
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
UIView *barView = [self barViewForForPoint:touchPoint];
|
||||
if (barView == nil)
|
||||
{
|
||||
[self setSelectionViewVisible:NO animated:YES];
|
||||
return;
|
||||
}
|
||||
CGRect barViewFrame = barView.frame;
|
||||
CGRect selectionViewFrame = self.selectionView.frame;
|
||||
selectionViewFrame.origin.x = barViewFrame.origin.x;
|
||||
self.selectionView.frame = selectionViewFrame;
|
||||
[self setSelectionViewVisible:YES animated:YES];
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(barChartView:didSelectBarAtIndex:)])
|
||||
{
|
||||
[self.delegate barChartView:self didSelectBarAtIndex:[self barViewIndexForPoint:touchPoint]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
if (!self.showsSelection || self.state == JBChartViewStateCollapsed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
UITouch *touch = [touches anyObject];
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
UIView *barView = [self barViewForForPoint:touchPoint];
|
||||
if (barView == nil)
|
||||
{
|
||||
[self setSelectionViewVisible:NO animated:YES];
|
||||
return;
|
||||
}
|
||||
CGRect barViewFrame = barView.frame;
|
||||
CGRect selectionViewFrame = self.selectionView.frame;
|
||||
selectionViewFrame.origin.x = barViewFrame.origin.x;
|
||||
self.selectionView.frame = selectionViewFrame;
|
||||
[self setSelectionViewVisible:YES animated:YES];
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(barChartView:didSelectBarAtIndex:)])
|
||||
{
|
||||
[self.delegate barChartView:self didSelectBarAtIndex:[self barViewIndexForPoint:touchPoint]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
[self touchesEndedOrCancelledWithTouches:touches];
|
||||
}
|
||||
|
||||
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
[self touchesEndedOrCancelledWithTouches:touches];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,86 @@
|
||||
//
|
||||
// JBChartView.h
|
||||
// JBChartView
|
||||
//
|
||||
// Created by Terry Worona on 9/4/13.
|
||||
// Copyright (c) 2013 Jawbone. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
extern CGFloat const kJBChartViewDefaultAnimationDuration;
|
||||
|
||||
/**
|
||||
* At a minimum, a chart can support two states, along with animations to-and-from.
|
||||
*/
|
||||
typedef NS_ENUM(NSInteger, JBChartViewState){
|
||||
/**
|
||||
* Expanded state: chart supports touches, interaction, etc.
|
||||
*/
|
||||
JBChartViewStateExpanded,
|
||||
/**
|
||||
* Collapse state: chart is more-or-less disabled at this point.
|
||||
*/
|
||||
JBChartViewStateCollapsed
|
||||
};
|
||||
|
||||
@interface JBChartView : UIView
|
||||
|
||||
/**
|
||||
* Header and footer views are shown above and below the chart respectively.
|
||||
* Each view will be stretched horizontally to fill width of chart.
|
||||
*/
|
||||
@property (nonatomic, strong) UIView *footerView;
|
||||
@property (nonatomic, strong) UIView *headerView;
|
||||
|
||||
/**
|
||||
* The vertical padding between the header and highest chart point (bar, line, etc).
|
||||
*/
|
||||
@property (nonatomic, assign) CGFloat headerPadding;
|
||||
|
||||
/**
|
||||
* Charts can either be expanded or contracted.
|
||||
* By default, a chart should be expanded on initialization.
|
||||
*/
|
||||
@property (nonatomic, assign) JBChartViewState state;
|
||||
|
||||
/**
|
||||
* Acts similiar to a UITableView's reloadData function.
|
||||
* The entire chart will be torn down and re-constructed via datasource and delegate protocls.
|
||||
*/
|
||||
- (void)reloadData;
|
||||
|
||||
/**
|
||||
* State setter.
|
||||
*
|
||||
* @param state Either collapse or expanded.
|
||||
* @param animated Whether or not the state should be animated or not.
|
||||
* @param callback Called once the animation is completed. If animated == NO, then callback is immediate.
|
||||
*/
|
||||
- (void)setState:(JBChartViewState)state animated:(BOOL)animated callback:(void (^)())callback;
|
||||
|
||||
/**
|
||||
* State setter.
|
||||
*
|
||||
* @param state Either collapse or expanded.
|
||||
* @param animated Whether or not the state should be animated or not.
|
||||
*/
|
||||
- (void)setState:(JBChartViewState)state animated:(BOOL)animated;
|
||||
|
||||
@end
|
||||
|
||||
/**
|
||||
* A simple UIView subclass that fades a base color from current alpha to 0.0 (vertically).
|
||||
* Used as a selection ivew in JBChartView subclasses.
|
||||
*/
|
||||
@interface JBChartSelectionView : UIView
|
||||
|
||||
/**
|
||||
* Base selection view color. This color will be faded to transparent vertically.
|
||||
*
|
||||
* Default: white color.
|
||||
*
|
||||
*/
|
||||
@property (nonatomic, strong) UIColor *bgColor;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,179 @@
|
||||
//
|
||||
// JBChartView.m
|
||||
// Nudge
|
||||
//
|
||||
// Created by Terry Worona on 9/4/13.
|
||||
// Copyright (c) 2013 Jawbone. All rights reserved.
|
||||
//
|
||||
|
||||
#import "JBChartView.h"
|
||||
|
||||
CGFloat const kJBChartViewDefaultAnimationDuration = 0.25f;
|
||||
|
||||
// Color (JBChartSelectionView)
|
||||
static UIColor *kJBChartSelectionViewDefaultBgColor = nil;
|
||||
|
||||
@interface JBChartView ()
|
||||
|
||||
- (void)validateHeaderAndFooterHeights;
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBChartView
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self)
|
||||
{
|
||||
self.clipsToBounds = YES;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
return [self initWithFrame:CGRectZero];
|
||||
}
|
||||
|
||||
#pragma mark - Public
|
||||
|
||||
- (void)reloadData
|
||||
{
|
||||
// Override
|
||||
}
|
||||
|
||||
#pragma mark - Helpers
|
||||
|
||||
- (void)validateHeaderAndFooterHeights
|
||||
{
|
||||
NSAssert((self.headerView.bounds.size.height + self.footerView.bounds.size.height) <= self.bounds.size.height, @"JBChartView // the combined height of the footer and header can not be greater than the total height of the chart.");
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setHeaderView:(UIView *)headerView
|
||||
{
|
||||
if (_headerView)
|
||||
{
|
||||
[_headerView removeFromSuperview];
|
||||
_headerView = nil;
|
||||
}
|
||||
_headerView = headerView;
|
||||
|
||||
[self validateHeaderAndFooterHeights];
|
||||
|
||||
[self addSubview:_headerView];
|
||||
[self reloadData];
|
||||
}
|
||||
|
||||
- (void)setFooterView:(UIView *)footerView
|
||||
{
|
||||
if (_footerView)
|
||||
{
|
||||
[_footerView removeFromSuperview];
|
||||
_footerView = nil;
|
||||
}
|
||||
_footerView = footerView;
|
||||
|
||||
[self validateHeaderAndFooterHeights];
|
||||
|
||||
[self addSubview:_footerView];
|
||||
[self reloadData];
|
||||
}
|
||||
|
||||
- (void)setState:(JBChartViewState)state animated:(BOOL)animated callback:(void (^)())callback
|
||||
{
|
||||
if (_state == state)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_state = state;
|
||||
|
||||
// Override
|
||||
}
|
||||
|
||||
- (void)setState:(JBChartViewState)state animated:(BOOL)animated
|
||||
{
|
||||
[self setState:state animated:animated callback:nil];
|
||||
}
|
||||
|
||||
- (void)setState:(JBChartViewState)state
|
||||
{
|
||||
[self setState:state animated:NO];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBChartSelectionView
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
if (self == [JBChartSelectionView class])
|
||||
{
|
||||
kJBChartSelectionViewDefaultBgColor = [UIColor whiteColor];
|
||||
}
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self)
|
||||
{
|
||||
self.backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark - Drawing
|
||||
|
||||
- (void)drawRect:(CGRect)rect
|
||||
{
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
[[UIColor clearColor] set];
|
||||
CGContextFillRect(context, rect);
|
||||
|
||||
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
||||
CGFloat locations[] = { 0.0, 1.0 };
|
||||
|
||||
NSArray *colors = nil;
|
||||
if (self.bgColor != nil)
|
||||
{
|
||||
colors = @[(__bridge id)self.bgColor.CGColor, (__bridge id)[self.bgColor colorWithAlphaComponent:0.0].CGColor];
|
||||
}
|
||||
else
|
||||
{
|
||||
colors = @[(__bridge id)kJBChartSelectionViewDefaultBgColor.CGColor, (__bridge id)[kJBChartSelectionViewDefaultBgColor colorWithAlphaComponent:0.0].CGColor];
|
||||
}
|
||||
|
||||
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations);
|
||||
|
||||
CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
|
||||
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
|
||||
|
||||
CGContextSaveGState(context);
|
||||
{
|
||||
CGContextAddRect(context, rect);
|
||||
CGContextClip(context);
|
||||
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
|
||||
}
|
||||
CGContextRestoreGState(context);
|
||||
|
||||
CGGradientRelease(gradient);
|
||||
CGColorSpaceRelease(colorSpace);
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setBgColor:(UIColor *)bgColor
|
||||
{
|
||||
_bgColor = bgColor;
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,17 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "JBChartView"
|
||||
s.version = "1.1.6"
|
||||
s.summary = "Jawbone's iOS-based charting library for both line and bar graphs."
|
||||
s.homepage = "https://github.com/Jawbone/JBChartView"
|
||||
|
||||
s.license = { :type => 'Apache', :file => 'LICENSE' }
|
||||
s.author = { "Terry Worona" => "tworona@jawbone.com" }
|
||||
s.source = {
|
||||
:git => "https://github.com/Jawbone/JBChartView.git",
|
||||
:tag => "v1.1.6"
|
||||
}
|
||||
|
||||
s.platform = :ios, '7.0'
|
||||
s.source_files = 'Classes', 'Classes/**/*.{h,m}'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -0,0 +1,114 @@
|
||||
//
|
||||
// JBLineChartView.h
|
||||
// JBChartView
|
||||
//
|
||||
// Created by Terry Worona on 9/4/13.
|
||||
// Copyright (c) 2013 Jawbone. All rights reserved.
|
||||
//
|
||||
|
||||
#import "JBChartView.h"
|
||||
|
||||
@protocol JBLineChartViewDelegate;
|
||||
@protocol JBLineChartViewDataSource;
|
||||
|
||||
@interface JBLineChartView : JBChartView
|
||||
|
||||
@property (nonatomic, weak) id<JBLineChartViewDelegate> delegate;
|
||||
@property (nonatomic, weak) id<JBLineChartViewDataSource> dataSource;
|
||||
|
||||
/**
|
||||
* If showsSelection is YES, a vertical highlight will overlayed on a the line graph during touch events.
|
||||
*
|
||||
* Default: YES.
|
||||
*/
|
||||
@property (nonatomic, assign) BOOL showsSelection;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JBLineChartViewDelegate <NSObject>
|
||||
|
||||
@required
|
||||
|
||||
/**
|
||||
* Vertical position for line point at a given index (left to right). There is no ceiling on the the height;
|
||||
* the chart will automatically normalize all values between the overal min and max heights.
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
* @param index The 0-based index of a given line height (left to right, x-axis).
|
||||
*
|
||||
* @return The y-axis value of the supplied line index (x-axis).
|
||||
*/
|
||||
- (CGFloat)lineChartView:(JBLineChartView *)lineChartView heightForIndex:(NSInteger)index;
|
||||
|
||||
@optional
|
||||
|
||||
/**
|
||||
* Occurs when a touch gesture event occurs anywhere on the chart. The chart must be expanded, showsSelection must be YES,
|
||||
* and the selection must occur within the bounds of the chart.
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
* @param index The 0-based index of a selection point (left to right, x-axis).
|
||||
*/
|
||||
- (void)lineChartView:(JBLineChartView *)lineChartView didSelectChartAtIndex:(NSInteger)index;
|
||||
|
||||
/**
|
||||
* Occurs when selection ends by either ending a touch event or selecting an area that is outside the view's bounds.
|
||||
* For selection start events, see: didSelectChartAtIndex...
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
* @param index The 0-based index of a selection point. Index will be -1 if the touch ends outside of the view's bounds.
|
||||
*/
|
||||
- (void)lineChartView:(JBLineChartView *)lineChartView didUnselectChartAtIndex:(NSInteger)index;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JBLineChartViewDataSource <NSObject>
|
||||
|
||||
@required
|
||||
|
||||
/**
|
||||
* The number of points in a given line chart equates to the number of values along the x-axis.
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
*
|
||||
* @return Number of points in the given chart.
|
||||
*/
|
||||
- (NSInteger)numberOfPointsInLineChartView:(JBLineChartView *)lineChartView;
|
||||
|
||||
@optional
|
||||
|
||||
/**
|
||||
* The color of the line within the chart.
|
||||
*
|
||||
* Default: black color.
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
*
|
||||
* @return The color to be used to draw the line on the chart (alphas < 1 are supported).
|
||||
*/
|
||||
- (UIColor *)lineColorForLineChartView:(JBLineChartView *)lineChartView;
|
||||
|
||||
/**
|
||||
* The width of the line within the chart.
|
||||
*
|
||||
* Default: 5 points.
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
*
|
||||
* @return The width to be used to draw the line on the chart.
|
||||
*/
|
||||
- (CGFloat)lineWidthForLineChartView:(JBLineChartView *)lineChartView;
|
||||
|
||||
/**
|
||||
* The selection color to be overlayed on the chart during touch events.
|
||||
* The color is automically faded to transparent (vertically).
|
||||
*
|
||||
* Default: white color (faded to transparent).
|
||||
*
|
||||
* @param lineChartView The origin chart.
|
||||
*
|
||||
* @return The color to be used on chart selections.
|
||||
*/
|
||||
- (UIColor *)selectionColorForLineChartView:(JBLineChartView *)lineChartView;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,603 @@
|
||||
//
|
||||
// JBLineChartView.m
|
||||
// Nudge
|
||||
//
|
||||
// Created by Terry Worona on 9/4/13.
|
||||
// Copyright (c) 2013 Jawbone. All rights reserved.
|
||||
//
|
||||
|
||||
#import "JBLineChartView.h"
|
||||
|
||||
// Drawing
|
||||
#import <QuartzCore/QuartzCore.h>
|
||||
|
||||
// Enums
|
||||
typedef NS_ENUM(NSInteger, JBLineChartLineViewState){
|
||||
JBLineChartLineViewStateExpanded,
|
||||
JBLineChartLineViewStateCollapsed
|
||||
};
|
||||
|
||||
// Numerics (JBLineChartLineView)
|
||||
CGFloat static const kJBLineChartLineViewEdgePadding = 10.0;
|
||||
CGFloat static const kJBLineChartLineViewStrokeWidth = 5.0;
|
||||
CGFloat static const kJBLineChartLineViewMiterLimit = -5.0;
|
||||
CGFloat static const kJBLineChartLineViewStateAnimationDuration = 0.25f;
|
||||
|
||||
// Numerics (JBLineSelectionView)
|
||||
CGFloat static const kJBLineSelectionViewWidth = 20.0f;
|
||||
|
||||
// Numerics (JBLineChartView)
|
||||
CGFloat static const kJBLineChartViewUndefinedMaxHeight = -1.0f;
|
||||
|
||||
// Colors (JBLineChartView)
|
||||
static UIColor *kJBLineChartViewDefaultLineColor = nil;
|
||||
|
||||
@interface JBLineChartPoint : NSObject
|
||||
|
||||
@property (nonatomic, assign) CGPoint position;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JBLineChartLineViewDelegate;
|
||||
|
||||
@interface JBLineChartLineView : UIView
|
||||
|
||||
@property (nonatomic, assign) id<JBLineChartLineViewDelegate> delegate;
|
||||
@property (nonatomic, assign) JBLineChartLineViewState state;
|
||||
@property (nonatomic, strong) CAShapeLayer *shapeLayer;
|
||||
@property (nonatomic, assign) BOOL animated;
|
||||
|
||||
// Data
|
||||
- (void)reloadData;
|
||||
|
||||
// Setters
|
||||
- (void)setState:(JBLineChartLineViewState)state animated:(BOOL)animated callback:(void (^)())callback;
|
||||
- (void)setState:(JBLineChartLineViewState)state animated:(BOOL)animated;
|
||||
|
||||
// Callback helpers
|
||||
- (void)fireCallback:(void (^)())callback;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JBLineChartLineViewDelegate <NSObject>
|
||||
|
||||
- (NSArray *)chartDataForLineChartLineView:(JBLineChartLineView*)lineChartLineView;
|
||||
- (UIColor *)lineColorForLineChartLineView:(JBLineChartLineView*)lineChartLineView;
|
||||
- (CGFloat)lineWidthForLineChartLineView:(JBLineChartLineView*)lineChartLineView;
|
||||
|
||||
@end
|
||||
|
||||
@interface JBLineChartView () <JBLineChartLineViewDelegate>
|
||||
|
||||
@property (nonatomic, strong) NSArray *chartData;
|
||||
@property (nonatomic, strong) JBLineChartLineView *lineView;
|
||||
@property (nonatomic, strong) JBChartSelectionView *selectionView;
|
||||
@property (nonatomic, assign) CGFloat cachedMaxHeight;
|
||||
@property (nonatomic, assign) BOOL selectionViewVisible;
|
||||
|
||||
// View quick accessors
|
||||
- (CGFloat)normalizedHeightForRawHeight:(CGFloat)rawHeight;
|
||||
- (CGFloat)availableHeight;
|
||||
- (CGFloat)maxHeight;
|
||||
- (CGFloat)minHeight;
|
||||
- (NSInteger)dataCount;
|
||||
|
||||
// Touch helpers
|
||||
- (NSInteger)indexForPoint:(CGPoint)point;
|
||||
- (void)touchesEndedOrCancelledWithTouches:(NSSet *)touches;
|
||||
|
||||
// Setters
|
||||
- (void)setSelectionViewVisible:(BOOL)selectionViewVisible animated:(BOOL)animated;
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBLineChartView
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
if (self == [JBLineChartView class])
|
||||
{
|
||||
kJBLineChartViewDefaultLineColor = [UIColor blackColor];
|
||||
}
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self)
|
||||
{
|
||||
self.clipsToBounds = NO;
|
||||
_showsSelection = YES;
|
||||
_cachedMaxHeight = kJBLineChartViewUndefinedMaxHeight;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
return [self initWithFrame:CGRectZero];
|
||||
}
|
||||
|
||||
#pragma mark - Data
|
||||
|
||||
- (void)reloadData
|
||||
{
|
||||
// reset cached max height
|
||||
self.cachedMaxHeight = kJBLineChartViewUndefinedMaxHeight;
|
||||
|
||||
/*
|
||||
* Subview rectangle calculations
|
||||
*/
|
||||
CGRect mainViewRect = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, [self availableHeight]);
|
||||
|
||||
/*
|
||||
* The data collection holds all position and marker information:
|
||||
* constructed via datasource and delegate functions
|
||||
*/
|
||||
dispatch_block_t createChartData = ^{
|
||||
|
||||
CGFloat pointSpace = (self.bounds.size.width - (kJBLineChartLineViewEdgePadding * 2)) / ([self dataCount] - 1); // Space in between points
|
||||
CGFloat xOffset = kJBLineChartLineViewEdgePadding;
|
||||
CGFloat yOffset = 0;
|
||||
|
||||
// Build up the data collection
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartView:heightForIndex:)], @"JBLineChartView // delegate must implement - (NSInteger)lineChartView:(JBLineChartView *)lineChartView heightForIndex:(NSInteger)index");
|
||||
NSMutableArray *mutableChartData = [NSMutableArray array];
|
||||
for (NSInteger index=0; index<[self dataCount]; index++)
|
||||
{
|
||||
JBLineChartPoint *chartPoint = [[JBLineChartPoint alloc] init];
|
||||
CGFloat rawHeight = [self.delegate lineChartView:self heightForIndex:index];
|
||||
CGFloat normalizedHeight = [self normalizedHeightForRawHeight:rawHeight];
|
||||
yOffset = mainViewRect.size.height - normalizedHeight;
|
||||
|
||||
chartPoint.position = CGPointMake(xOffset, yOffset);
|
||||
|
||||
[mutableChartData addObject:chartPoint];
|
||||
xOffset += pointSpace;
|
||||
}
|
||||
|
||||
self.chartData = [NSArray arrayWithArray:mutableChartData];
|
||||
};
|
||||
|
||||
/*
|
||||
* Creates a new line graph view using the previously calculated data model
|
||||
*/
|
||||
dispatch_block_t createLineGraphView = ^{
|
||||
|
||||
// Remove old line and overlay views
|
||||
if (self.lineView)
|
||||
{
|
||||
[self.lineView removeFromSuperview];
|
||||
self.lineView = nil;
|
||||
}
|
||||
|
||||
// Create new line and overlay subviews
|
||||
self.lineView = [[JBLineChartLineView alloc] initWithFrame:CGRectOffset(mainViewRect, 0, self.headerView.frame.size.height + self.headerPadding)];
|
||||
self.lineView.delegate = self;
|
||||
[self addSubview:self.lineView];
|
||||
};
|
||||
|
||||
/*
|
||||
* Creates a vertical selection view for touch events
|
||||
*/
|
||||
dispatch_block_t createSelectionView = ^{
|
||||
if (self.selectionView)
|
||||
{
|
||||
[self.selectionView removeFromSuperview];
|
||||
self.selectionView = nil;
|
||||
}
|
||||
|
||||
self.selectionView = [[JBChartSelectionView alloc] initWithFrame:CGRectMake(0, 0, kJBLineSelectionViewWidth, self.bounds.size.height - self.footerView.frame.size.height)];
|
||||
self.selectionView.alpha = 0.0;
|
||||
if ([self.dataSource respondsToSelector:@selector(selectionColorForLineChartView:)])
|
||||
{
|
||||
self.selectionView.bgColor = [self.dataSource selectionColorForLineChartView:self];
|
||||
}
|
||||
[self insertSubview:self.selectionView belowSubview:self.footerView];
|
||||
};
|
||||
|
||||
createChartData();
|
||||
createLineGraphView();
|
||||
createSelectionView();
|
||||
|
||||
// Reload views
|
||||
[self.lineView reloadData];
|
||||
|
||||
// Position header and footer
|
||||
self.headerView.frame = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, self.headerView.frame.size.height);
|
||||
self.footerView.frame = CGRectMake(self.bounds.origin.x, self.bounds.size.height - self.footerView.frame.size.height, self.bounds.size.width, self.footerView.frame.size.height);
|
||||
}
|
||||
|
||||
#pragma mark - View Quick Accessors
|
||||
|
||||
- (CGFloat)normalizedHeightForRawHeight:(CGFloat)rawHeight
|
||||
{
|
||||
CGFloat minHeight = [self minHeight];
|
||||
CGFloat maxHeight = [self maxHeight];
|
||||
|
||||
if ((maxHeight - minHeight) <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ((rawHeight - minHeight) / (maxHeight - minHeight)) * [self availableHeight];
|
||||
}
|
||||
|
||||
- (CGFloat)availableHeight
|
||||
{
|
||||
return self.bounds.size.height - self.headerView.frame.size.height - self.footerView.frame.size.height - self.headerPadding;
|
||||
}
|
||||
|
||||
- (CGFloat)maxHeight
|
||||
{
|
||||
if (self.cachedMaxHeight == kJBLineChartViewUndefinedMaxHeight)
|
||||
{
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartView:heightForIndex:)], @"JBLineChartView // delegate must implement - (NSInteger)lineChartView:(JBLineChartView *)lineChartView heightForIndex:(NSInteger)index");
|
||||
CGFloat maxHeight = 0;
|
||||
for (NSInteger index=0; index<[self dataCount]; index++)
|
||||
{
|
||||
if (([self.delegate lineChartView:self heightForIndex:index]) > maxHeight)
|
||||
{
|
||||
maxHeight = [self.delegate lineChartView:self heightForIndex:index];
|
||||
}
|
||||
}
|
||||
self.cachedMaxHeight = maxHeight;
|
||||
}
|
||||
return self.cachedMaxHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)minHeight
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)dataCount
|
||||
{
|
||||
NSAssert([self.dataSource respondsToSelector:@selector(numberOfPointsInLineChartView:)], @"JBLineChartView // dataSource must implement - (NSInteger)numberOfPointsInLineChartView:(JBLineChartView *)lineChartView");
|
||||
return [self.dataSource numberOfPointsInLineChartView:self];
|
||||
}
|
||||
|
||||
#pragma mark - JBLineChartLineViewDelegate
|
||||
|
||||
- (NSArray *)chartDataForLineChartLineView:(JBLineChartLineView *)lineChartLineView
|
||||
{
|
||||
return self.chartData;
|
||||
}
|
||||
|
||||
- (UIColor *)lineColorForLineChartLineView:(JBLineChartLineView*)lineChartLineView
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineColorForLineChartView:)])
|
||||
{
|
||||
return [self.dataSource lineColorForLineChartView:self];
|
||||
}
|
||||
return kJBLineChartViewDefaultLineColor;
|
||||
}
|
||||
|
||||
- (CGFloat)lineWidthForLineChartLineView:(JBLineChartLineView*)lineChartLineView
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineWidthForLineChartView:)])
|
||||
{
|
||||
return [self.dataSource lineWidthForLineChartView:self];
|
||||
}
|
||||
return kJBLineChartLineViewStrokeWidth;
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setState:(JBChartViewState)state animated:(BOOL)animated callback:(void (^)())callback
|
||||
{
|
||||
[super setState:state animated:animated callback:callback];
|
||||
|
||||
if (state == JBChartViewStateCollapsed)
|
||||
{
|
||||
[self.lineView setState:JBLineChartLineViewStateCollapsed animated:animated callback:callback];
|
||||
}
|
||||
else if (state == JBChartViewStateExpanded)
|
||||
{
|
||||
[self.lineView setState:JBLineChartLineViewStateExpanded animated:animated callback:callback];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Touch Helpers
|
||||
|
||||
- (NSInteger)indexForPoint:(CGPoint)point
|
||||
{
|
||||
NSUInteger index = 0;
|
||||
CGFloat currentDistance = INT_MAX;
|
||||
NSUInteger selectedIndex = -1;
|
||||
for (JBLineChartPoint *lineChartPoint in self.chartData)
|
||||
{
|
||||
if ((abs(point.x - lineChartPoint.position.x)) < currentDistance)
|
||||
{
|
||||
currentDistance = (abs(point.x - lineChartPoint.position.x));
|
||||
selectedIndex = index;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return selectedIndex;
|
||||
}
|
||||
|
||||
- (void)touchesEndedOrCancelledWithTouches:(NSSet *)touches
|
||||
{
|
||||
if (!self.showsSelection || self.state == JBChartViewStateCollapsed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
[self setSelectionViewVisible:NO animated:YES];
|
||||
|
||||
UITouch *touch = [touches anyObject];
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
NSInteger index = [self indexForPoint:touchPoint];
|
||||
if ([self.delegate respondsToSelector:@selector(lineChartView:didUnselectChartAtIndex:)])
|
||||
{
|
||||
[self.delegate lineChartView:self didUnselectChartAtIndex:index];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setSelectionViewVisible:(BOOL)selectionViewVisible animated:(BOOL)animated
|
||||
{
|
||||
_selectionViewVisible = selectionViewVisible;
|
||||
|
||||
if (animated)
|
||||
{
|
||||
[UIView animateWithDuration:kJBChartViewDefaultAnimationDuration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
|
||||
self.selectionView.alpha = self.selectionViewVisible ? 1.0 : 0.0;
|
||||
} completion:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
self.selectionView.alpha = _selectionViewVisible ? 1.0 : 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setSelectionViewVisible:(BOOL)selectionViewVisible
|
||||
{
|
||||
[self setSelectionViewVisible:selectionViewVisible animated:NO];
|
||||
}
|
||||
|
||||
#pragma mark - Gestures
|
||||
|
||||
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
if (!self.showsSelection || self.state == JBChartViewStateCollapsed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
UITouch *touch = [touches anyObject];
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(lineChartView:didSelectChartAtIndex:)])
|
||||
{
|
||||
[self.delegate lineChartView:self didSelectChartAtIndex:[self indexForPoint:touchPoint]];
|
||||
}
|
||||
|
||||
CGFloat xOffset = fmin(self.bounds.size.width - self.selectionView.frame.size.width, fmax(0, touchPoint.x - (ceil(self.selectionView.frame.size.width * 0.5))));
|
||||
self.selectionView.frame = CGRectMake(xOffset, self.selectionView.frame.origin.y, self.selectionView.frame.size.width, self.selectionView.frame.size.height);
|
||||
[self setSelectionViewVisible:YES animated:YES];
|
||||
}
|
||||
|
||||
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
if (!self.showsSelection || self.state == JBChartViewStateCollapsed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
UITouch *touch = [touches anyObject];
|
||||
CGPoint touchPoint = [touch locationInView:self];
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(lineChartView:didSelectChartAtIndex:)])
|
||||
{
|
||||
[self.delegate lineChartView:self didSelectChartAtIndex:[self indexForPoint:touchPoint]];
|
||||
}
|
||||
|
||||
CGFloat xOffset = fmin(self.bounds.size.width - self.selectionView.frame.size.width, fmax(0, touchPoint.x - (ceil(self.selectionView.frame.size.width * 0.5))));
|
||||
self.selectionView.frame = CGRectMake(xOffset, self.selectionView.frame.origin.y, self.selectionView.frame.size.width, self.selectionView.frame.size.height);
|
||||
[self setSelectionViewVisible:YES animated:YES];
|
||||
}
|
||||
|
||||
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
[self touchesEndedOrCancelledWithTouches:touches];
|
||||
}
|
||||
|
||||
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
[self touchesEndedOrCancelledWithTouches:touches];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBLineChartLineView
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self)
|
||||
{
|
||||
self.clipsToBounds = NO;
|
||||
self.backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark - Memory Management
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self];
|
||||
}
|
||||
|
||||
#pragma mark - Drawing
|
||||
|
||||
- (void)drawRect:(CGRect)rect
|
||||
{
|
||||
[super drawRect:rect];
|
||||
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
|
||||
UIBezierPath *flatPath = [UIBezierPath bezierPath];
|
||||
flatPath.miterLimit = kJBLineChartLineViewMiterLimit;
|
||||
|
||||
UIBezierPath *dynamicPath = [UIBezierPath bezierPath];
|
||||
dynamicPath.miterLimit = kJBLineChartLineViewMiterLimit;
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(chartDataForLineChartLineView:)], @"JBLineChartLineView // delegate must implement - (NSArray *)chartDataForLineChartLineView:(JBLineChartLineView *)lineChartLineView");
|
||||
NSInteger index = 0;
|
||||
for (JBLineChartPoint *lineChartPoint in [[self.delegate chartDataForLineChartLineView:self] sortedArrayUsingSelector:@selector(compare:)])
|
||||
{
|
||||
if (index == 0)
|
||||
{
|
||||
[dynamicPath moveToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - kJBLineChartLineViewEdgePadding, fmax(kJBLineChartLineViewEdgePadding, lineChartPoint.position.y)))];
|
||||
[flatPath moveToPoint:CGPointMake(lineChartPoint.position.x, ceil(self.bounds.size.height * 0.5))];
|
||||
}
|
||||
else
|
||||
{
|
||||
[dynamicPath addLineToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - kJBLineChartLineViewEdgePadding, fmax(kJBLineChartLineViewEdgePadding, lineChartPoint.position.y)))];
|
||||
[flatPath addLineToPoint:CGPointMake(lineChartPoint.position.x, ceil(self.bounds.size.height * 0.5))];
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineColorForLineChartLineView:)], @"JBLineChartLineView // delegate must implement - (UIColor *)lineColorForLineChartLineView:(JBLineChartLineView*)lineChartLineView");
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineWidthForLineChartLineView:)], @"JBLineChartLineView // delegate must implement - (UIColor *)lineWidthForLineChartLineView:(JBLineChartLineView*)lineChartLineView");
|
||||
|
||||
if (self.shapeLayer == nil)
|
||||
{
|
||||
self.shapeLayer = [CAShapeLayer layer];
|
||||
}
|
||||
|
||||
if (self.animated)
|
||||
{
|
||||
self.shapeLayer.zPosition = 0.0f;
|
||||
self.shapeLayer.strokeColor = [self.delegate lineColorForLineChartLineView:self].CGColor;
|
||||
self.shapeLayer.lineWidth = [self.delegate lineWidthForLineChartLineView:self];
|
||||
self.shapeLayer.lineCap = kCALineCapRound;
|
||||
self.shapeLayer.lineJoin = kCALineJoinRound;
|
||||
self.shapeLayer.frame = self.bounds;
|
||||
self.shapeLayer.fillColor = [UIColor clearColor].CGColor;
|
||||
|
||||
if (self.state == JBLineChartLineViewStateCollapsed)
|
||||
{
|
||||
self.shapeLayer.path = dynamicPath.CGPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.shapeLayer.path = flatPath.CGPath;
|
||||
}
|
||||
|
||||
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"path"];
|
||||
[anim setRemovedOnCompletion:NO];
|
||||
anim.toValue = self.state == JBLineChartLineViewStateCollapsed ? (id)flatPath.CGPath : (id)dynamicPath.CGPath;
|
||||
anim.duration = kJBLineChartLineViewStateAnimationDuration;
|
||||
anim.removedOnCompletion = NO;
|
||||
anim.fillMode = kCAFillModeForwards;
|
||||
anim.autoreverses = NO;
|
||||
anim.repeatCount = 0;
|
||||
[self.shapeLayer addAnimation:anim forKey:@"path"];
|
||||
[self.layer addSublayer:self.shapeLayer];
|
||||
}
|
||||
else
|
||||
{
|
||||
CGContextSaveGState(context);
|
||||
{
|
||||
CGContextSetLineWidth(context, [self.delegate lineWidthForLineChartLineView:self]);
|
||||
CGContextSetStrokeColorWithColor(context, [self.delegate lineColorForLineChartLineView:self].CGColor);
|
||||
CGContextSetLineCap(context, kCGLineCapRound);
|
||||
CGContextSetLineJoin(context, kCGLineJoinRound);
|
||||
CGContextBeginPath(context);
|
||||
CGContextAddPath(context, self.state == JBLineChartLineViewStateCollapsed ? flatPath.CGPath : dynamicPath.CGPath);
|
||||
CGContextDrawPath(context, kCGPathStroke);
|
||||
}
|
||||
CGContextRestoreGState(context);
|
||||
}
|
||||
|
||||
self.animated = NO;
|
||||
}
|
||||
|
||||
#pragma mark - Data
|
||||
|
||||
- (void)reloadData
|
||||
{
|
||||
// Drawing is all done with CG (no subviews here)
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setState:(JBLineChartLineViewState)state animated:(BOOL)animated callback:(void (^)())callback
|
||||
{
|
||||
if (_state == state)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch_block_t callbackCopy = [callback copy];
|
||||
|
||||
_state = state;
|
||||
self.animated = animated;
|
||||
[self setNeedsDisplay];
|
||||
|
||||
if (animated)
|
||||
{
|
||||
[self performSelector:@selector(fireCallback:) withObject:callback afterDelay:kJBLineChartLineViewStateAnimationDuration];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (callbackCopy)
|
||||
{
|
||||
callbackCopy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setState:(JBLineChartLineViewState)state animated:(BOOL)animated
|
||||
{
|
||||
[self setState:state animated:animated callback:nil];
|
||||
}
|
||||
|
||||
#pragma mark - Callback Helpers
|
||||
|
||||
- (void)fireCallback:(void (^)())callback
|
||||
{
|
||||
dispatch_block_t callbackCopy = [callback copy];
|
||||
|
||||
if (callbackCopy != nil)
|
||||
{
|
||||
callbackCopy();
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBLineChartPoint
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
_position = CGPointZero;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark - Compare
|
||||
|
||||
- (NSComparisonResult)compare:(JBLineChartPoint *)otherObject
|
||||
{
|
||||
return self.position.x > otherObject.position.x;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaAsyncSocket'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'public domain'
|
||||
s.summary = 'An asynchronous socket networking library for Cocoa.'
|
||||
s.homepage = 'https://github.com/robbiehanson/CocoaAsyncSocket'
|
||||
s.authors = 'Dustin Voss', { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
|
||||
s.source = { :git => 'git://github.com/robbiehanson/CocoaAsyncSocket.git' }
|
||||
|
||||
s.description = 'CocoaAsyncSocket supports TCP and UDP. The AsyncSocket class is for TCP, and the AsyncUdpSocket class is for UDP. ' \
|
||||
'AsyncSocket is a TCP/IP socket networking library that wraps CFSocket and CFStream. It offers asynchronous ' \
|
||||
'operation, and a native Cocoa class complete with delegate support or use the GCD variant GCDAsyncSocket. ' \
|
||||
'AsyncUdpSocket is a UDP/IP socket networking library that wraps CFSocket. It works almost exactly like the TCP ' \
|
||||
'version, but is designed specifically for UDP. This includes queued non-blocking send/receive operations, full ' \
|
||||
'delegate support, run-loop based, self-contained class, and support for IPv4 and IPv6.'
|
||||
|
||||
s.source_files = '{GCD,RunLoop}/*.{h,m}'
|
||||
s.clean_paths = 'Vendor', 'GCD/Xcode', 'RunLoop/Xcode'
|
||||
s.requires_arc = true
|
||||
|
||||
if config.ios?
|
||||
s.frameworks = ['CFNetwork', 'Security']
|
||||
else
|
||||
s.frameworks = ['CoreServices', 'Security']
|
||||
end
|
||||
end
|
||||
@@ -1,20 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaHTTPServer'
|
||||
s.version = '2.2.1'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A small, lightweight, embeddable HTTP server for Mac OS X or iOS applications'
|
||||
s.homepage = 'https://github.com/robbiehanson/CocoaHTTPServer'
|
||||
s.authors = { 'Robbie Hanson' => 'cocoahttpserver@googlegroups.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaHTTPServer.git', :tag => '2.2.1' }
|
||||
s.source_files = '{Core,Extensions}/**/*.{h,m}'
|
||||
s.clean_paths = %w{Samples Vendor}
|
||||
if config.ios?
|
||||
s.frameworks = 'CFNetwork', 'Security'
|
||||
else
|
||||
s.frameworks = 'CoreServices', 'Security'
|
||||
end
|
||||
s.library = 'xml2'
|
||||
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
|
||||
s.dependency "CocoaAsyncSocket", "0.0.1"
|
||||
s.dependency "CocoaLumberjack", "1.3"
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.0.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/cocoalumberjack/'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.0' }
|
||||
|
||||
s.source_files = 'Lumberjack'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.1.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/cocoalumberjack/'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.1' }
|
||||
|
||||
s.source_files = 'Lumberjack'
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.2.1'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/cocoalumberjack/'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.2.1' }
|
||||
|
||||
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
|
||||
'yet is designed specifically for objective-c, and takes advantage of features ' \
|
||||
'such as multi-threading, grand central dispatch (if available), lockless ' \
|
||||
'atomic operations, and the dynamic nature of the objective-c runtime.'
|
||||
|
||||
s.source_files = 'Lumberjack'
|
||||
s.clean_paths = 'Benchmarking', 'Xcode'
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.2.2'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/cocoalumberjack/'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.2.2' }
|
||||
|
||||
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
|
||||
'yet is designed specifically for objective-c, and takes advantage of features ' \
|
||||
'such as multi-threading, grand central dispatch (if available), lockless ' \
|
||||
'atomic operations, and the dynamic nature of the objective-c runtime.'
|
||||
|
||||
s.source_files = 'Lumberjack'
|
||||
s.clean_paths = 'Benchmarking', 'Xcode'
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.2.3'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/cocoalumberjack/'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.2.3' }
|
||||
|
||||
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
|
||||
'yet is designed specifically for objective-c, and takes advantage of features ' \
|
||||
'such as multi-threading, grand central dispatch (if available), lockless ' \
|
||||
'atomic operations, and the dynamic nature of the objective-c runtime.'
|
||||
|
||||
s.source_files = 'Lumberjack'
|
||||
s.clean_paths = 'Benchmarking', 'Xcode', 'Lumberjack/Extensions'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.2.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/cocoalumberjack/'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.2' }
|
||||
|
||||
s.source_files = 'Lumberjack'
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.3.1'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'https://github.com/robbiehanson/CocoaLumberjack'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.3.1' }
|
||||
|
||||
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
|
||||
'yet is designed specifically for objective-c, and takes advantage of features ' \
|
||||
'such as multi-threading, grand central dispatch (if available), lockless ' \
|
||||
'atomic operations, and the dynamic nature of the objective-c runtime.'
|
||||
|
||||
s.requires_arc = true
|
||||
s.source_files = 'Lumberjack'
|
||||
s.clean_paths = 'Benchmarking', 'Xcode', 'Lumberjack/Extensions'
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.3.2'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'https://github.com/robbiehanson/CocoaLumberjack'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.3.2' }
|
||||
|
||||
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
|
||||
'yet is designed specifically for objective-c, and takes advantage of features ' \
|
||||
'such as multi-threading, grand central dispatch (if available), lockless ' \
|
||||
'atomic operations, and the dynamic nature of the objective-c runtime.'
|
||||
|
||||
s.requires_arc = true
|
||||
s.source_files = 'Lumberjack'
|
||||
s.clean_paths = 'Benchmarking', 'Xcode', 'Lumberjack/Extensions'
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CocoaLumberjack'
|
||||
s.version = '1.3'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
|
||||
s.homepage = 'https://github.com/robbiehanson/CocoaLumberjack'
|
||||
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
|
||||
s.source = { :git => 'https://github.com/robbiehanson/CocoaLumberjack.git',
|
||||
:tag => '1.3' }
|
||||
|
||||
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
|
||||
'yet is designed specifically for objective-c, and takes advantage of features ' \
|
||||
'such as multi-threading, grand central dispatch (if available), lockless ' \
|
||||
'atomic operations, and the dynamic nature of the objective-c runtime.'
|
||||
|
||||
s.requires_arc = true
|
||||
s.source_files = 'Lumberjack'
|
||||
s.clean_paths = 'Benchmarking', 'Xcode', 'Lumberjack/Extensions'
|
||||
end
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
:min: "0.6.0rc1"
|
||||
:last: "0.6.0rc1"
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Color-Picker-for-iOS'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'BSD'
|
||||
s.platform = :ios
|
||||
s.summary = 'ColorPicker for iPhone and iPod touch'
|
||||
s.homepage = 'https://github.com/hayashi311'
|
||||
s.author = { 'Ryota Hayashi' => 'hayashi311' }
|
||||
s.source = { :git => 'https://github.com/hayashi311/Color-Picker-for-iOS.git',
|
||||
:commit => '711b2981d29f0cfb7f7b258b79783bc650fa980e' }
|
||||
s.source_files = 'ColorPicker/*.{h,m}'
|
||||
s.frameworks = 'UIKit' , 'QuartzCore'
|
||||
s.clean_paths = "Sample", "CHANGE_ja.md" , 'TODO_ja.md'
|
||||
end
|
||||
@@ -1,17 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ConciseKit'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A set of Objective-C additions and macros that lets you write code more quickly.'
|
||||
s.homepage = 'http://github.com/petejkim/ConciseKit'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/ConciseKit.git', :tag => 'v0.1.0' }
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = 'ConciseKitSpecs'
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
end
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ConciseKit'
|
||||
s.version = '0.1.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A set of Objective-C additions and macros that lets you write code more quickly.'
|
||||
s.homepage = 'http://github.com/petejkim/ConciseKit'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/ConciseKit.git', :tag => 'v0.1.1' }
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = 'ConciseKitSpecs'
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
end
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ConciseKit'
|
||||
s.version = '0.1.2'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A set of Objective-C additions and macros that lets you write code more quickly.'
|
||||
s.homepage = 'http://github.com/petejkim/ConciseKit'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/ConciseKit.git', :tag => 'v0.1.2' }
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = 'ConciseKitSpecs'
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
end
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CorePlot'
|
||||
s.version = '1.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Cocoa plotting framework for Mac OS X and iOS.'
|
||||
s.homepage = 'http://code.google.com/p/core-plot/'
|
||||
s.authors = { 'Drew McCormack' => 'drewmccormack@mac.com',
|
||||
'Brad Larson' => 'larson@sunsetlakesoftware.com',
|
||||
'Eric Skroch' => 'eskroch@mac.com',
|
||||
'Barry Wark' => 'barrywark@gmail.com' }
|
||||
s.source = { :hg => 'https://code.google.com/p/core-plot', :revision => 'release_1.0' }
|
||||
|
||||
s.description = 'Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization ' \
|
||||
'of data, and is tightly integrated with Apple technologies like Core Animation, ' \
|
||||
'Core Data, and Cocoa Bindings.'
|
||||
|
||||
files = FileList['framework/TestResources/CorePlotProbes.d', 'framework/Source/*.{h,m}']
|
||||
files.exclude(/(TestCase|Tests)\.[hm]/)
|
||||
if config.ios?
|
||||
files.include('framework/CorePlot-CocoaTouch.h', 'framework/iPhoneOnly/*.{h,m}')
|
||||
else
|
||||
files.include('framework/CorePlot.h', 'framework/MacOnly/*.{h,m}')
|
||||
end
|
||||
s.source_files = files
|
||||
|
||||
s.clean_paths = 'documentation', 'examples', 'scripts', 'QCPlugin', 'framework/*.{xcodeproj,lproj}'
|
||||
s.framework = 'QuartzCore'
|
||||
end
|
||||
@@ -1,11 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'CupertinoYankee'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'An NSDate Category With Locale-Aware Calculations for Beginning & End of Day, Week, Month, and Year'
|
||||
s.homepage = 'https://github.com/mattt/CupertinoYankee'
|
||||
s.authors = {'Mattt Thompson' => 'm@mattt.me'}
|
||||
s.source = { :git => 'https://github.com/mattt/CupertinoYankee.git', :tag => '0.1.0' }
|
||||
s.source_files = 'NSDate+CupertinoYankee.{h,m}'
|
||||
s.clean_paths = ['Example']
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'DCIntrospect'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Introspect is small set of tools for iOS that aid in debugging user interfaces built with UIKit.'
|
||||
s.homepage = 'https://github.com/domesticcatsoftware/DCIntrospect'
|
||||
s.author = { 'Patrick Richards' => 'contact@domesticcat.com.au' }
|
||||
s.source = { :git => 'git://github.com/domesticcatsoftware/DCIntrospect.git', :commit => "3ef2c10710f007b6d699c2a0b996ce1e3a79bde0" }
|
||||
s.source_files = 'DCIntrospect'
|
||||
s.frameworks = 'QuartzCore'
|
||||
s.clean_paths = 'DCIntrospectDemo'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'DCTTextFieldValidator'
|
||||
s.version = '1.0'
|
||||
s.license = 'BSD'
|
||||
s.summary = 'Validates an array of UITextFields before allowing an action to take place.'
|
||||
s.homepage = 'https://github.com/danielctull/DCTTextFieldValidator'
|
||||
s.author = { 'Daniel Tull' => 'dt@danieltull.co.uk' }
|
||||
s.source = { :git => 'https://github.com/danielctull/DCTTextFieldValidator.git', :tag => '1.0' }
|
||||
s.description = 'DCTTextFieldValidator takes an array of UITextFields and switches the return key on the keyboard if the text fields are valid.'
|
||||
s.source_files = 'DCTTextFieldValidator.h', 'DCTTextFieldValidator.m'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'DDPageControl'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'An easily customizable alternative to UIKit\'s UIPageControl.'
|
||||
s.homepage = 'https://github.com/ddeville/DDPageControl'
|
||||
s.author = { 'Damien DeVille' => 'damien@realmacsoftware.com' }
|
||||
|
||||
s.source = { :git => 'git://github.com/ddeville/DDPageControl.git', :tag => '0.1' }
|
||||
s.description = 'DDPageControl redefines exactly every property and methods available in UIPageControl. Using DDPageControl without customization will actually lead exactly to a UIPageControl. However, the power of DDPageControl is that you can set some additional properties that will affect the way the look and feel of the page controls.'
|
||||
|
||||
s.platform = :ios
|
||||
|
||||
s.source_files = 'Classes/DDPageControl.{h,m}'
|
||||
|
||||
s.clean_path = "Classes/DDPageControlAppDelegate.*",
|
||||
"Classes/DDPageControlViewController.*",
|
||||
"*.xib",
|
||||
"*.pch",
|
||||
"*.plist",
|
||||
"*.xcodeproj",
|
||||
"*.m"
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'DMLocationManager'
|
||||
s.version = '1.0.0'
|
||||
s.license = 'Apache License, Version 2.0'
|
||||
s.summary = 'Convenient CLLocationManager wrapper. Control location caching, cache age and accuracy.'
|
||||
s.homepage = 'https://github.com/martinstolz/DMLocationManager'
|
||||
s.author = { 'Martin Stolz' => 'martin.stolz@devmob.de' }
|
||||
s.description = 'This CLLocationManager wrapper allows you to query for the devices location in a convenient way. Control the caching behaviour by disallowing cache or setting the maximum cache age. Loop the location determination for permanent location updates in a defined interval.'
|
||||
s.platform = :ios
|
||||
s.source = { :git => 'https://github.com/martinstolz/DMLocationManager.git', :tag => '1.0.0' }
|
||||
s.source_files = '*.{h,m}'
|
||||
end
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |spec|
|
||||
spec.name = 'DTCoreText'
|
||||
spec.version = '1.0.0'
|
||||
spec.platform = :ios
|
||||
spec.license = 'BSD'
|
||||
spec.source = { :git => 'https://github.com/Cocoanetics/DTCoreText.git', :tag => '1.0.0' }
|
||||
spec.source_files = 'Core/Source/*.{h,m,c}'
|
||||
spec.clean_paths = 'Core/Test/', 'Core/DTCoreText-Info.plist', 'Core/DTCoreText-Prefix.pch', 'DTCoreText.xcodeproj/', 'Demo/', '.gitignore'
|
||||
spec.frameworks = 'MediaPlayer', 'QuartzCore', 'CoreText', 'CoreGraphics', 'ImageIO'
|
||||
spec.requires_arc = true
|
||||
spec.homepage = 'https://github.com/Cocoanetics/DTCoreText'
|
||||
spec.summary = 'Methods to allow using HTML code with CoreText.'
|
||||
spec.author = { 'Oliver Drobnik' => 'oliver@drobnik.com' }
|
||||
spec.library = 'xml2'
|
||||
spec.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(SDKROOT)/usr/include/libxml2"' }
|
||||
def spec.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import <CoreText/CoreText.h>\n#endif\n#define ALLOW_IPHONE_SPECIAL_CASES 1})
|
||||
end
|
||||
Dir.chdir(config.project_pods_root + 'DTCoreText/Core/Source/') do
|
||||
Dir.glob('*.css') do |css_file|
|
||||
system '/usr/bin/xxd', '-i', css_file, css_file + '.c'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |spec|
|
||||
spec.name = 'DTCoreText'
|
||||
spec.version = '1.0.1'
|
||||
spec.platform = :ios
|
||||
spec.license = 'BSD'
|
||||
spec.source = { :git => 'https://github.com/Cocoanetics/DTCoreText.git', :tag => '1.0.1' }
|
||||
spec.source_files = 'Core/Source/*.{h,m,c}'
|
||||
spec.clean_paths = 'Core/Test/', 'Core/DTCoreText-Info.plist', 'Core/DTCoreText-Prefix.pch', 'DTCoreText.xcodeproj/', 'Demo/', '.gitignore'
|
||||
spec.frameworks = 'MediaPlayer', 'QuartzCore', 'CoreText', 'CoreGraphics', 'ImageIO'
|
||||
spec.requires_arc = true
|
||||
spec.homepage = 'https://github.com/Cocoanetics/DTCoreText'
|
||||
spec.summary = 'Methods to allow using HTML code with CoreText.'
|
||||
spec.author = { 'Oliver Drobnik' => 'oliver@drobnik.com' }
|
||||
spec.library = 'xml2'
|
||||
spec.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(SDKROOT)/usr/include/libxml2"' }
|
||||
def spec.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#ifdef __OBJC__\n#import <CoreText/CoreText.h>\n#endif\n#define ALLOW_IPHONE_SPECIAL_CASES 1})
|
||||
end
|
||||
Dir.chdir(config.project_pods_root + 'DTCoreText/Core/Source/') do
|
||||
Dir.glob('*.css') do |css_file|
|
||||
system '/usr/bin/xxd', '-i', css_file, css_file + '.c'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,16 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'DirectoryWatchdog'
|
||||
s.version = '1.0.0'
|
||||
s.license = 'Apache License 2.0'
|
||||
s.summary = 'A simpe utility class to monitor real time changes in a directory, such as the documents dir for an app with File Sharing enabled.'
|
||||
s.homepage = 'https://github.com/graetzer/DirectoryWatchdog'
|
||||
s.author = { 'Simon Grätzer' => 'simon@graetzer.org' }
|
||||
|
||||
|
||||
s.source = { :git => 'https://github.com/graetzer/DirectoryWatchdog.git', :tag => '1.0.0' }
|
||||
s.description = 'DirectoryWatchdog is a simple utility tool to monitor real time changes in local folders. '\
|
||||
'Most common use is the monitoring of an applications documents directory in combination'\
|
||||
' with iTunes file sharing support. This code uses the BSD kqueue API and should work on OSX as well as iOS.'
|
||||
|
||||
s.source_files = 'DirectoryWatchdog/lib/*.{h,m}'
|
||||
end
|
||||
@@ -1,13 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ECSlidingViewController'
|
||||
s.version = '0.9.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'ECSlidingViewController is a view controller container that presents its child view controllers in two layers. It provides functionality for sliding the top view to reveal the views underneath it. This functionality is inspired by the Path 2.0 and Facebook iPhone apps.'
|
||||
s.homepage = 'https://github.com/edgecase/ecslidingviewcontroller'
|
||||
s.author = { 'Mike Enriquez' => 'mike@edgecase.com' }
|
||||
s.source = { :git => 'git://github.com/edgecase/ECSlidingViewController.git', :tag => '0.9.0' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'ECSlidingViewController/Vendor/ECSlidingViewController/'
|
||||
s.clean_paths = 'ECSlidingViewController.xcodeproj'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'EGOCache'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Fast Caching for Objective-C (iPhone & Mac Compatible)'
|
||||
s.homepage = 'https://github.com/enormego/EGOCache'
|
||||
s.author = 'enormego'
|
||||
s.source = { :git => 'https://github.com/enormego/EGOCache.git',
|
||||
:commit => '8b7c7ecfc8fad396b6547ad3fef085713644f794' }
|
||||
|
||||
s.source_files = '*.{h,m}'
|
||||
end
|
||||
@@ -1,15 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'EGOImageLoading'
|
||||
s.version = '0.0.1'
|
||||
s.platform = :ios
|
||||
s.license = 'MIT'
|
||||
s.summary = 'What if images on the iPhone were as easy as HTML?'
|
||||
s.homepage = 'https://github.com/enormego/EGOImageLoading'
|
||||
s.author = 'Shaun Harrison'
|
||||
s.source = { :git => 'git://github.com/enormego/EGOImageLoading.git',
|
||||
:commit => '9a3fa6b657c6b8217a24ff87c1fe4f670401f3bd' }
|
||||
|
||||
s.source_files = 'EGO*/*.{h,m}'
|
||||
s.clean_paths = 'Demo'
|
||||
s.dependency 'EGOCache'
|
||||
end
|
||||
@@ -1,16 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'EGOTableViewPullRefresh'
|
||||
s.version = '0.1.0'
|
||||
s.platform = :ios
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A similar control to the pull down to refresh control created by atebits in Tweetie 2.'
|
||||
s.homepage = 'https://github.com/enormego/EGOTableViewPullRefresh'
|
||||
s.author = { 'Devin Doty' => 'devin.r.doty@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/enormego/EGOTableViewPullRefresh.git',
|
||||
:commit => '743679ffeb6ac02f0afffaac46f318dd2ce6122e' }
|
||||
|
||||
s.source_files = 'EGOTableViewPullRefresh/Classes/View/*.{h,m}'
|
||||
s.resources = 'EGOTableViewPullRefresh/Resources/*.png'
|
||||
s.clean_paths = 'Demo'
|
||||
s.framework = 'QuartzCore'
|
||||
end
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Expecta'
|
||||
s.version = '0.1.0'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A matcher framework for Objective-C & Cocoa'
|
||||
s.homepage = 'http://github.com/petejkim/expecta'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/expecta.git', :tag => 'v0.1.0' }
|
||||
|
||||
s.description = %{
|
||||
Expecta is a matcher framework for Objective-C and Cocoa. The main
|
||||
advantage of using Expecta over other matcher frameworks is that you do not
|
||||
have to specify the data types. Also, the syntax of Expecta matchers is
|
||||
much more readable and does not suffer from parenthesitis. If you have used
|
||||
Jasmine before, you will feel right at home!
|
||||
}
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = "Rakefile", "RDD.md", "products", "test", "*.xcodeproj"
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
|
||||
s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
|
||||
end
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Expecta'
|
||||
s.version = '0.1.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A matcher framework for Objective-C & Cocoa'
|
||||
s.homepage = 'http://github.com/petejkim/expecta'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/expecta.git', :tag => 'v0.1.1' }
|
||||
|
||||
s.description = %{
|
||||
Expecta is a matcher framework for Objective-C and Cocoa. The main
|
||||
advantage of using Expecta over other matcher frameworks is that you do not
|
||||
have to specify the data types. Also, the syntax of Expecta matchers is
|
||||
much more readable and does not suffer from parenthesitis. If you have used
|
||||
Jasmine before, you will feel right at home!
|
||||
}
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = "Rakefile", "RDD.md", "products", "test", "*.xcodeproj"
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
|
||||
s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
|
||||
end
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Expecta'
|
||||
s.version = '0.1.2'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A matcher framework for Objective-C & Cocoa'
|
||||
s.homepage = 'http://github.com/petejkim/expecta'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/expecta.git', :tag => 'v0.1.2' }
|
||||
|
||||
s.description = %{
|
||||
Expecta is a matcher framework for Objective-C and Cocoa. The main
|
||||
advantage of using Expecta over other matcher frameworks is that you do not
|
||||
have to specify the data types. Also, the syntax of Expecta matchers is
|
||||
much more readable and does not suffer from parenthesitis. If you have used
|
||||
Jasmine before, you will feel right at home!
|
||||
}
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = "Rakefile", "RDD.md", "products", "test", "*.xcodeproj"
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
|
||||
s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
|
||||
end
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Expecta'
|
||||
s.version = '0.1.3'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A matcher framework for Objective-C & Cocoa'
|
||||
s.homepage = 'http://github.com/petejkim/expecta'
|
||||
s.author = { 'Peter Jihoon Kim' => 'raingrove@gmail.com' }
|
||||
|
||||
s.source = { :git => 'http://github.com/petejkim/expecta.git', :tag => 'v0.1.3' }
|
||||
|
||||
s.description = %{
|
||||
Expecta is a matcher framework for Objective-C and Cocoa. The main
|
||||
advantage of using Expecta over other matcher frameworks is that you do not
|
||||
have to specify the data types. Also, the syntax of Expecta matchers is
|
||||
much more readable and does not suffer from parenthesitis. If you have used
|
||||
Jasmine before, you will feel right at home!
|
||||
}
|
||||
|
||||
s.source_files = 'src/**/*.{h,m}'
|
||||
|
||||
s.clean_paths = "Rakefile", "RDD.md", "products", "test", "*.xcodeproj"
|
||||
|
||||
s.frameworks = 'Foundation'
|
||||
|
||||
s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
|
||||
end
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FMDB'
|
||||
s.version = '1.5.1'
|
||||
s.summary = 'A Cocoa / Objective-C wrapper around SQLite.'
|
||||
s.homepage = 'https://github.com/ccgus/fmdb'
|
||||
s.author = 'August Mueller'
|
||||
s.source = { :git => 'https://github.com/ccgus/fmdb.git',
|
||||
:tag => 'v1.5.1' }
|
||||
|
||||
s.source_files = 'src/FM*.*'
|
||||
s.library = 'sqlite3'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FMDB'
|
||||
s.version = '1.5'
|
||||
s.summary = 'A Cocoa / Objective-C wrapper around SQLite.'
|
||||
s.homepage = 'https://github.com/ccgus/fmdb'
|
||||
s.author = 'August Mueller'
|
||||
s.source = { :git => 'https://github.com/ccgus/fmdb.git',
|
||||
:tag => 'v1.5' }
|
||||
|
||||
s.source_files = 'src/FM*.*'
|
||||
s.library = 'sqlite3'
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FMDB'
|
||||
s.version = '2.0'
|
||||
s.summary = 'A Cocoa / Objective-C wrapper around SQLite.'
|
||||
s.homepage = 'https://github.com/ccgus/fmdb'
|
||||
s.author = 'August Mueller'
|
||||
s.source = { :git => 'https://github.com/ccgus/fmdb.git',
|
||||
:tag => 'v2.0' }
|
||||
|
||||
s.source_files = 'src/FM*.*'
|
||||
s.library = 'sqlite3'
|
||||
end
|
||||
@@ -1,14 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FSArgumentParser'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'FDOSL'
|
||||
s.summary = 'Totally awesome tool for parsing command line arguments in a declarative way.'
|
||||
s.homepage = 'https://github.com/NSError/ArgumentParser'
|
||||
s.author = { 'Chris Miller' => 'nserror@me.com' }
|
||||
s.source = { :git => 'https://github.com/NSError/ArgumentParser.git', :tag => '0.0.1' }
|
||||
s.description = 'Parsing command-line arguments is hard, but it doesn\'t have to be! FSArgumentParser makes it much easier to parse command-line arguments by defining a declarative argument signature which some magic box code interprets. It handles the presence of missing arguments, detecting short and long names, and packaging it all up in a simple, easy to use object. So go write command-line tools like a boss, and keep being awesome!'
|
||||
s.source_files = 'ArgumentParser/*.{h,m}'
|
||||
s.clean_paths = 'bin/', 'example', 'example.xcodeproj'
|
||||
s.framework = 'Foundation'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -1,13 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FSURLOperation'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'FDOSL'
|
||||
s.summary = 'Simple NSOperation wrapper for NSURLRequest.'
|
||||
s.homepage = 'https://github.com/NSError/URLOperation'
|
||||
s.author = { 'Chris Miller' => 'nserror@me.com' }
|
||||
s.source = { :git => 'https://github.com/NSError/URLOperation.git', :tag => '0.0.1' }
|
||||
s.description = 'HTTP requests are hard, but scheduling them doesn\'t have to be! FSURLOperation makes it much easier to dispatch NSURLRequests. By leveraging the existing capabilities of NSOperation, you can set dependencies, block until an operation (or set of operations) completes, and also control which thread the request is performed on. So go make concurrent URL operations like a boss, and keep being awesome!'
|
||||
s.source_files = '*.{h,m}'
|
||||
s.framework = 'Foundation'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -1,14 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FTUtils'
|
||||
s.version = '1.1.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Phone utilities mostly for Core Animation.'
|
||||
s.homepage = 'http://ftutils.com/'
|
||||
s.authors = {'Nathan Eror' => 'contact@freetimestudios.com', 'Corey Floyd' => 'corey.floyd@flyingjalapenosoftware.com', 'Ben Lenarts' => 'ben@boonbits.com' }
|
||||
s.source = { :git => 'https://github.com/neror/ftutils.git', :tag => 'v1.1.1' }
|
||||
s.description = 'The code in FTUtils is common utility code extracted from Free Time Studios iPhone projects. Currently, there is only one primary utility (FTAnimation) and some simple preprocessor macros. Some unit tests exist for the code, but more are needed.'
|
||||
s.platform = :ios
|
||||
s.source_files = 'Classes', 'Headers/*/*.h'
|
||||
s.clean_paths = "Examples", "Support", "Tests", "UnitTests", "apidocs"
|
||||
s.framework = 'QuartzCore'
|
||||
end
|
||||
@@ -1,13 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FXLabel'
|
||||
s.version = '1.3.1'
|
||||
s.license = 'zlib'
|
||||
s.summary = 'FXLabel improves upon the standard UILabel by providing a subclass that supports soft shadows, inner shadow and gradient fill, and which can easily be used in place of any standard UILabel.'
|
||||
s.homepage = 'http://charcoaldesign.co.uk/source/cocoa#fxlabel'
|
||||
s.author = { 'Nick Lockwood' => 'http://charcoaldesign.co.uk/' }
|
||||
s.source = { :git => 'https://github.com/nicklockwood/FXLabel.git', :tag => '1.3.1' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'FXLabel'
|
||||
s.clean_paths = 'Examples', 'Tests'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Facebook-iOS-SDK'
|
||||
s.version = '0.0.1'
|
||||
s.platform = :ios
|
||||
s.license = 'Apache License, Version 2.0'
|
||||
s.summary = 'The iOS SDK provides Facebook Platform support for iOS apps. ' \
|
||||
'It enables you to access the Facebook Platform APIs including the Graph API, FQL, and Dialogs.'
|
||||
s.homepage = 'http://developers.facebook.com/docs/reference/iossdk'
|
||||
s.author = 'Facebook'
|
||||
|
||||
#s.source = { :git => 'https://github.com/facebook/facebook-ios-sdk.git', :tag => '0.0.1' }
|
||||
s.source = { :git => 'https://github.com/facebook/facebook-ios-sdk.git', :commit => 'e79d07272218d41bfd940fa5b4518d0f274a8085' }
|
||||
|
||||
s.source_files = 'src/*.{h,m}'
|
||||
s.resource = 'FBDialog.bundle'
|
||||
s.clean_paths = 'sample', 'test'
|
||||
|
||||
s.dependency 'SBJson', '2.2.3'
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Facebook-iOS-SDK'
|
||||
s.version = '1.2'
|
||||
s.platform = :ios
|
||||
s.license = 'Apache License, Version 2.0'
|
||||
s.summary = 'The iOS SDK provides Facebook Platform support for iOS apps. ' \
|
||||
'It enables you to access the Facebook Platform APIs including the Graph API, FQL, and Dialogs.'
|
||||
s.homepage = 'http://developers.facebook.com/docs/reference/iossdk'
|
||||
s.author = 'Facebook'
|
||||
|
||||
s.source = { :git => 'https://github.com/facebook/facebook-ios-sdk.git', :tag => 'v1.2' }
|
||||
|
||||
s.source_files = 'src/*.{h,m}'
|
||||
s.resource = 'src/FBDialog.bundle'
|
||||
s.clean_paths = 'sample', 'test'
|
||||
|
||||
s.dependency 'SBJson', '2.2.3'
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FileMD5Hash'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'Apache'
|
||||
s.summary = 'Library for computing MD5 hashes of files with small memory usage'
|
||||
s.homepage = 'http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac-os-x/'
|
||||
s.author = { 'Joel Lopes Da Silva' => 'joel@lopes-da-silva.com' }
|
||||
s.source = { :git => 'https://github.com/JoeKun/FileMD5Hash.git', :commit => 'd00c0c51c6d0955d9daf94c30cfd95a219d4914e' }
|
||||
|
||||
s.source_files = 'Common/*.{h,c}'
|
||||
s.clean_paths = "Mac", "iOS", 'FileMD5Hash.xcodeproj'
|
||||
|
||||
def s.post_install(target)
|
||||
prefix_header = config.project_pods_root + target.prefix_header_filename
|
||||
prefix_header.open('a') do |file|
|
||||
file.puts(%{#import "FileMD5Hash_Prefix.pch"})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,14 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FormatterKit'
|
||||
s.version = '0.6.0'
|
||||
s.summary = '`stringWithFormat:` for the sophisticated hacker set'
|
||||
s.homepage = 'https://github.com/mattt/FormatterKit'
|
||||
s.author = { 'Mattt Thompson' => 'm@mattt.me' }
|
||||
s.source = { :git => 'https://github.com/mattt/FormatterKit.git', :tag => '0.6.0' }
|
||||
|
||||
s.description = "FormatterKit is a collection of well-crafted NSFormatter subclasses for things like hours of operation, distance, and relative time intervals. Each formatter abstracts away the complex business logic of their respective domain, so that you can focus on the more important aspects of your application."
|
||||
|
||||
s.source_files = 'TTTArrayFormatter/*.{h,m}', 'TTTHoursOfOperation/*.{h,m}',
|
||||
'TTTLocationFormatter/*.{h,m}', 'TTTOrdinalNumberFormatter/*.{h,m}',
|
||||
'TTTTimeIntervalFormatter/*.{h,m}', 'TTTURLRequestFormatter/*.{h,m}'
|
||||
end
|
||||
@@ -1,15 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FormatterKit'
|
||||
s.version = '0.7.0'
|
||||
s.summary = '`stringWithFormat:` for the sophisticated hacker set'
|
||||
s.homepage = 'https://github.com/mattt/FormatterKit'
|
||||
s.author = { 'Mattt Thompson' => 'm@mattt.me' }
|
||||
s.source = { :git => 'https://github.com/mattt/FormatterKit.git', :tag => '0.7.0' }
|
||||
|
||||
s.description = "FormatterKit is a collection of well-crafted NSFormatter subclasses for things like hours of operation, distance, and relative time intervals. Each formatter abstracts away the complex business logic of their respective domain, so that you can focus on the more important aspects of your application."
|
||||
|
||||
s.source_files = 'TTTArrayFormatter/*.{h,m}', 'TTTHoursOfOperation/*.{h,m}',
|
||||
'TTTLocationFormatter/*.{h,m}', 'TTTOrdinalNumberFormatter/*.{h,m}',
|
||||
'TTTTimeIntervalFormatter/*.{h,m}', 'TTTUnitOfInformationFormatter/*.{h,m}',
|
||||
'TTTURLRequestFormatter/*.{h,m}'
|
||||
end
|
||||
@@ -1,11 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GCCommonCode-iOS'
|
||||
s.version = '0.0.1'
|
||||
s.platform = :ios
|
||||
s.summary = 'GUI Cocoa iOS Common Code Library'
|
||||
s.homepage = 'http://guicocoa.com'
|
||||
s.author = {'GUI Cocoa, LLC.' => 'caleb@guicocoa.com'}
|
||||
s.source = { :git => 'git://github.com/guicocoa/common-code-ios.git', :commit => '772798cf1f4353e0944005b98aef3508908035d5'}
|
||||
s.source_files = '*.{h,m}'
|
||||
s.framework = 'CoreData', 'CoreLocation'
|
||||
end
|
||||
@@ -1,13 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GCDiscreetNotificationView'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'A discreet, non-modal, notification view for iOS.'
|
||||
s.homepage = 'https://github.com/gcamp/GCDiscreetNotificationView'
|
||||
s.author = { 'Guillaume Campagna' => 'http://gcamp.ca' }
|
||||
s.source = { :git => 'https://github.com/gcamp/GCDiscreetNotificationView.git', :commit => '3075ef2d27eb471893db4eb235174b26eb67d950' }
|
||||
s.platform = :ios
|
||||
s.source_files = 'GCDiscreetNotificationView/GCDiscreetNotificationView.{h,m}'
|
||||
s.framework = 'UIKit'
|
||||
s.clean_paths = 'Demo'
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GDataXML-HTML'
|
||||
s.version = '0.0.1'
|
||||
s.license = 'Apache License 2.0'
|
||||
s.summary = 'HTML/XML parser for the iOS System, based on Google\'s ' \
|
||||
'GDataXML.'
|
||||
s.author = { 'Simon Grätzer' => 'http://graetzer.org/' }
|
||||
s.source = { :git => 'https://github.com/graetzer/GDataXML-HTML.git',
|
||||
:commit => '2eb63b5dae5174061f4458e0489357bd0752903f' }
|
||||
s.homepage = 'https://github.com/graetzer/GDataXML-HTML'
|
||||
s.description = 'It implements parts of NSXML so it\'s easy to parse XML ' \
|
||||
'Files with a DOM API or XPath. This fork of the original ' \
|
||||
'GDataXML adds support for the HTMLparser module of ' \
|
||||
'libxml2 and allows you to deal with non validating XML ' \
|
||||
'or HTML on iOS based devices (iPhone, iPad etc)'
|
||||
s.source_files = 'GDataXML-HTML/lib/*.{h,m}'
|
||||
s.libraries = 'xml2'
|
||||
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
|
||||
end
|
||||
@@ -1,20 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GDataXML-HTML'
|
||||
s.version = '1.0.0'
|
||||
s.license = 'Apache License 2.0'
|
||||
s.summary = 'An XML/HTML Parser for iOS and OSX, based on Google\'s GDataXML.'
|
||||
s.homepage = 'https://github.com/graetzer/GDataXML-HTML'
|
||||
s.author = { 'Simon Grätzer' => 'simon@graetzer.org' }
|
||||
|
||||
s.source = { :git => 'https://github.com/graetzer/GDataXML-HTML.git', :tag => '1.0.0' }
|
||||
|
||||
s.description = 'GDataXML implements parts of NSXML so it\'s easy to parse XML or HTML ' \
|
||||
'with a DOM style API including XPath support. This fork of the original ' \
|
||||
'GDataXML adds support for the HTMLparser module of ' \
|
||||
'libxml2 and allows you to deal with non validating XML ' \
|
||||
'in a simple way'
|
||||
s.source_files = 'GDataXML-HTML/lib/*.{h,m}'
|
||||
s.libraries = 'xml2'
|
||||
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
|
||||
|
||||
end
|
||||
@@ -1,15 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GHUnitIOS'
|
||||
s.version = '0.4.33'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Test Framework for Objective-C'
|
||||
s.homepage = 'https://github.com/gabriel/gh-unit'
|
||||
s.author = { 'Gabriel Handford' => 'gabrielh@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/gabriel/gh-unit.git', :commit => 'fea526dee3e6e00548f280b56d4afab049733ef8'}
|
||||
s.description = 'GHUnit is a test framework for Objective-C, Mac OS X 10.5 and above and iPhone 3.x and above. It can be used standalone or with other testing frameworks like SenTestingKit or GTM.'
|
||||
s.source_files = 'Classes/**/*.{h,m}', 'Classes-iOS/**/*.{h,m}', 'Libraries/YelpKit/*.{h,m}', 'Libraries/GTM/**/*.{h,m}', 'Libraries/GHKit/**/*.{h,m}'
|
||||
s.platform = :ios
|
||||
s.framework = 'CoreLocation'
|
||||
s.clean_paths = 'Examples', 'Documentation', 'Project-MacOSX', 'Project-iOS', 'Classes-MacOSX', 'Tests'
|
||||
end
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GHUnitOSX'
|
||||
s.version = '0.4.33'
|
||||
s.license = 'MIT'
|
||||
s.summary = 'Test Framework for Objective-C'
|
||||
s.homepage = 'https://github.com/gabriel/gh-unit'
|
||||
s.author = { 'Gabriel Handford' => 'gabrielh@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/gabriel/gh-unit.git', :commit => '565564e3ab3b78d0b9cf9c90dd4ad66982f07ef4'}
|
||||
s.description = 'GHUnit is a test framework for Objective-C, Mac OS X 10.5 and above and iPhone 3.x and above. It can be used standalone or with other testing frameworks like SenTestingKit or GTM.'
|
||||
s.source_files = 'Classes/**/*.{h,m}', 'Classes-MacOSX/**/*.{h,m}', 'Libraries/YelpKit/*.{h,m}', 'Libraries/GTM/**/*.{h,m}', 'Libraries/GHKit/**/*.{h,m}'
|
||||
s.platform = :osx
|
||||
s.framework = 'CoreLocation'
|
||||
s.clean_paths = 'Examples', 'Documentation', 'Project-MacOSX', 'Project-iOS', 'Classes-iOS', 'Tests', 'Classes/GHViewTestCase.{h,m}', 'Libraries/YelpKit'
|
||||
end
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GMGridView'
|
||||
s.version = '0.0.1'
|
||||
s.platform = :ios
|
||||
s.summary = 'A performant Grid-View for iOS (iPhone/iPad) that allows ' \
|
||||
'sorting of views with gestures (the user can move the items ' \
|
||||
'with his finger to sort them) and pinching/rotating/panning ' \
|
||||
'gestures allow the user to play with the view and toggle from ' \
|
||||
'the cellview to a fullsize display.'
|
||||
s.homepage = 'https://github.com/gmoledina/GMGridView'
|
||||
s.author = { 'Gulam Moledina' => 'http://www.gmoledina.ca/' }
|
||||
s.source = { :git => 'https://github.com/gmoledina/GMGridView.git',
|
||||
:commit => '215900fa5468992e0a2e86054f0fa53235dff726' }
|
||||
s.source_files = 'GMGridView/*.{h,m}'
|
||||
s.requires_arc = true
|
||||
s.frameworks = 'QuartzCore'
|
||||
s.clean_paths = 'Example', 'GMGridView/GMGridView.xcodeproj'
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'GMGridView'
|
||||
s.version = '0.0.2'
|
||||
s.platform = :ios
|
||||
s.summary = 'A performant Grid-View for iOS (iPhone/iPad) that allows ' \
|
||||
'sorting of views with gestures (the user can move the items ' \
|
||||
'with his finger to sort them) and pinching/rotating/panning ' \
|
||||
'gestures allow the user to play with the view and toggle from ' \
|
||||
'the cellview to a fullsize display.'
|
||||
s.homepage = 'https://github.com/gmoledina/GMGridView'
|
||||
s.author = { 'Gulam Moledina' => 'http://www.gmoledina.ca/' }
|
||||
s.source = { :git => 'https://github.com/gmoledina/GMGridView.git',
|
||||
:commit => '9ae7d4d25c84d388b08fff38c53a53940991b975' }
|
||||
s.source_files = 'GMGridView/*.{h,m}'
|
||||
s.requires_arc = true
|
||||
s.frameworks = 'QuartzCore'
|
||||
s.clean_paths = 'Example', 'GMGridView/GMGridView.xcodeproj'
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user