diff --git a/Demo/KoaPullToRefresh.xcodeproj/project.pbxproj b/Demo/KoaPullToRefresh.xcodeproj/project.pbxproj index 3b7504b..f39c29a 100644 --- a/Demo/KoaPullToRefresh.xcodeproj/project.pbxproj +++ b/Demo/KoaPullToRefresh.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 2D53FBCF197915F600BB8A19 /* KoaPullToRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D53FBCE197915F600BB8A19 /* KoaPullToRefresh.m */; }; 555AC06B173B93B0001EAC94 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 555AC06A173B93B0001EAC94 /* UIKit.framework */; }; 555AC06D173B93B0001EAC94 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 555AC06C173B93B0001EAC94 /* Foundation.framework */; }; 555AC06F173B93B0001EAC94 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 555AC06E173B93B0001EAC94 /* CoreGraphics.framework */; }; @@ -18,7 +19,6 @@ 555AC081173B93B0001EAC94 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 555AC080173B93B0001EAC94 /* Default-568h@2x.png */; }; 555AC084173B93B0001EAC94 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 555AC083173B93B0001EAC94 /* ViewController.m */; }; 555AC087173B93B0001EAC94 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 555AC085173B93B0001EAC94 /* ViewController.xib */; }; - 555AC08F173B9DFE001EAC94 /* KoaPullToRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 555AC08E173B9DFE001EAC94 /* KoaPullToRefresh.m */; }; 555AC091173BABE7001EAC94 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 555AC090173BABE7001EAC94 /* QuartzCore.framework */; }; 555AC095173BB30D001EAC94 /* OpenSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 555AC092173BB30D001EAC94 /* OpenSans-Bold.ttf */; }; 555AC096173BB30D001EAC94 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 555AC093173BB30D001EAC94 /* OpenSans-Regular.ttf */; }; @@ -29,6 +29,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 2D53FBCD197915F600BB8A19 /* KoaPullToRefresh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KoaPullToRefresh.h; path = ../../KoaPullToRefresh/KoaPullToRefresh.h; sourceTree = ""; }; + 2D53FBCE197915F600BB8A19 /* KoaPullToRefresh.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = KoaPullToRefresh.m; path = ../../KoaPullToRefresh/KoaPullToRefresh.m; sourceTree = ""; }; 555AC067173B93B0001EAC94 /* KoaPullToRefresh.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KoaPullToRefresh.app; sourceTree = BUILT_PRODUCTS_DIR; }; 555AC06A173B93B0001EAC94 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 555AC06C173B93B0001EAC94 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -45,8 +47,6 @@ 555AC082173B93B0001EAC94 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 555AC083173B93B0001EAC94 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 555AC086173B93B0001EAC94 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController.xib; sourceTree = ""; }; - 555AC08D173B9DFE001EAC94 /* KoaPullToRefresh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KoaPullToRefresh.h; sourceTree = ""; }; - 555AC08E173B9DFE001EAC94 /* KoaPullToRefresh.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KoaPullToRefresh.m; sourceTree = ""; }; 555AC090173BABE7001EAC94 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 555AC092173BB30D001EAC94 /* OpenSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Bold.ttf"; sourceTree = ""; }; 555AC093173BB30D001EAC94 /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Regular.ttf"; sourceTree = ""; }; @@ -109,8 +109,8 @@ 555AC082173B93B0001EAC94 /* ViewController.h */, 555AC083173B93B0001EAC94 /* ViewController.m */, 555AC085173B93B0001EAC94 /* ViewController.xib */, - 555AC08D173B9DFE001EAC94 /* KoaPullToRefresh.h */, - 555AC08E173B9DFE001EAC94 /* KoaPullToRefresh.m */, + 2D53FBCD197915F600BB8A19 /* KoaPullToRefresh.h */, + 2D53FBCE197915F600BB8A19 /* KoaPullToRefresh.m */, 55D8EC76173D053300006E3F /* Resources */, 555AC071173B93B0001EAC94 /* Supporting Files */, ); @@ -172,7 +172,7 @@ 555AC05F173B93B0001EAC94 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Sergi Gracia"; }; buildConfigurationList = 555AC062173B93B0001EAC94 /* Build configuration list for PBXProject "KoaPullToRefresh" */; @@ -219,7 +219,7 @@ 555AC077173B93B0001EAC94 /* main.m in Sources */, 555AC07B173B93B0001EAC94 /* AppDelegate.m in Sources */, 555AC084173B93B0001EAC94 /* ViewController.m in Sources */, - 555AC08F173B9DFE001EAC94 /* KoaPullToRefresh.m in Sources */, + 2D53FBCF197915F600BB8A19 /* KoaPullToRefresh.m in Sources */, 55D8EC7B173D053300006E3F /* UIFont+FontAwesome.m in Sources */, 55D8EC7E173D05E400006E3F /* NSString+FontAwesome.m in Sources */, ); @@ -261,6 +261,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -272,7 +273,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -296,7 +297,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -309,7 +310,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "KoaPullToRefresh/KoaPullToRefresh-Prefix.pch"; INFOPLIST_FILE = "KoaPullToRefresh/KoaPullToRefresh-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.sergigracia.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -321,7 +322,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "KoaPullToRefresh/KoaPullToRefresh-Prefix.pch"; INFOPLIST_FILE = "KoaPullToRefresh/KoaPullToRefresh-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.sergigracia.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Demo/KoaPullToRefresh.xcodeproj/xcshareddata/xcschemes/KoaPullToRefresh.xcscheme b/Demo/KoaPullToRefresh.xcodeproj/xcshareddata/xcschemes/KoaPullToRefresh.xcscheme index 7ea9c82..b22fbfc 100644 --- a/Demo/KoaPullToRefresh.xcodeproj/xcshareddata/xcschemes/KoaPullToRefresh.xcscheme +++ b/Demo/KoaPullToRefresh.xcodeproj/xcshareddata/xcschemes/KoaPullToRefresh.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -38,17 +38,21 @@ ReferencedContainer = "container:KoaPullToRefresh.xcodeproj"> + + - + - + CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.sergigracia.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Demo/KoaPullToRefresh/KoaPullToRefresh.h b/Demo/KoaPullToRefresh/KoaPullToRefresh.h deleted file mode 100644 index dd1dae8..0000000 --- a/Demo/KoaPullToRefresh/KoaPullToRefresh.h +++ /dev/null @@ -1,52 +0,0 @@ -// -// KoaPullToRefresh.h -// KoaPullToRefresh -// -// Created by Sergi Gracia on 09/05/13. -// Copyright (c) 2013 Sergi Gracia. All rights reserved. -// - -#import -#import -#import "NSString+FontAwesome.h" -#import "UIFont+FontAwesome.h" - -@class KoaPullToRefreshView; - -@interface UIScrollView (KoaPullToRefresh) - -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler; -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler withBackgroundColor:(UIColor *)customBackgroundColor; -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler withBackgroundColor:(UIColor *)customBackgroundColor withPullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed; - -@property (nonatomic, strong) KoaPullToRefreshView *pullToRefreshView; -@property (nonatomic, assign) BOOL showsPullToRefresh; - -@end - -enum { - KoaPullToRefreshStateStopped = 0, - KoaPullToRefreshStateTriggered, - KoaPullToRefreshStateLoading, - KoaPullToRefreshStateAll = 10 -}; - -typedef NSUInteger KoaPullToRefreshState; - - -@interface KoaPullToRefreshView : UIView - -@property (nonatomic, strong) UIColor *arrowColor; -@property (nonatomic, strong) UIColor *textColor; -@property (nonatomic, strong) UIFont *textFont; -@property (nonatomic, strong, readonly) UILabel *titleLabel; -@property (nonatomic, strong, readonly) UILabel *loaderLabel; -@property (nonatomic, strong, readonly) NSString *fontAwesomeIcon; -@property (nonatomic, readonly) KoaPullToRefreshState state; - -- (void)setTitle:(NSString *)title forState:(KoaPullToRefreshState)state; -- (void)setFontAwesomeIcon:(NSString *)fontAwesomeIcon; -- (void)startAnimating; -- (void)stopAnimating; - -@end diff --git a/Demo/KoaPullToRefresh/KoaPullToRefresh.m b/Demo/KoaPullToRefresh/KoaPullToRefresh.m deleted file mode 100644 index 2bfbbc8..0000000 --- a/Demo/KoaPullToRefresh/KoaPullToRefresh.m +++ /dev/null @@ -1,439 +0,0 @@ -// -// KoaPullToRefresh.m -// KoaPullToRefresh -// -// Created by Sergi Gracia on 09/05/13. -// Copyright (c) 2013 Sergi Gracia. All rights reserved. -// - -#import "KoaPullToRefresh.h" -#import - -#define fequal(a,b) (fabs((a) - (b)) < FLT_EPSILON) -#define fequalzero(a) (fabs(a) < FLT_EPSILON) - -static CGFloat KoaPullToRefreshViewHeight = 82; -static CGFloat KoaPullToRefreshViewHeightShowed = 0; -static CGFloat KoaPullToRefreshViewTitleBottomMargin = 12; - -@interface KoaPullToRefreshView () - -@property (nonatomic, copy) void (^pullToRefreshActionHandler)(void); -@property (nonatomic, strong, readwrite) UILabel *titleLabel; -@property (nonatomic, strong, readwrite) UILabel *loaderLabel; -@property (nonatomic, readwrite) KoaPullToRefreshState state; -@property (nonatomic, strong) NSMutableArray *titles; -@property (nonatomic, weak) UIScrollView *scrollView; -@property (nonatomic, readwrite) CGFloat originalTopInset; -@property (nonatomic, readwrite) CGFloat originalBottomInset; -@property (nonatomic, assign) BOOL wasTriggeredByUser; -@property (nonatomic, assign) BOOL showsPullToRefresh; -@property(nonatomic, assign) BOOL isObserving; - -- (void)resetScrollViewContentInset; -- (void)setScrollViewContentInsetForLoading; -- (void)setScrollViewContentInset:(UIEdgeInsets)insets; - -@end - -#pragma mark - UIScrollView (KoaPullToRefresh) -#import - -static char UIScrollViewPullToRefreshView; - -@implementation UIScrollView (KoaPullToRefresh) -@dynamic pullToRefreshView, showsPullToRefresh; - -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler { - [self addPullToRefreshWithActionHandler:actionHandler withBackgroundColor:[UIColor grayColor]]; -} - -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler - withBackgroundColor:(UIColor *)customBackgroundColor { - [self addPullToRefreshWithActionHandler:actionHandler withBackgroundColor:customBackgroundColor withPullToRefreshHeightShowed:KoaPullToRefreshViewHeightShowed]; -} - -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler - withBackgroundColor:(UIColor *)customBackgroundColor - withPullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed { - - //KoaPullToRefreshViewHeight = pullToRefreshHeight; - KoaPullToRefreshViewHeightShowed = pullToRefreshHeightShowed; - KoaPullToRefreshViewTitleBottomMargin += pullToRefreshHeightShowed; - - [self setContentInset:UIEdgeInsetsMake(KoaPullToRefreshViewHeightShowed, self.contentInset.left, self.contentInset.bottom, self.contentInset.right)]; - - if (!self.pullToRefreshView) { - - //Initial y position - CGFloat yOrigin = -KoaPullToRefreshViewHeight; - - //Put background extra to fill top white space - UIView *backgroundExtra = [[UIView alloc] initWithFrame:CGRectMake(0, -KoaPullToRefreshViewHeight*8, self.bounds.size.width, KoaPullToRefreshViewHeight*8)]; - [backgroundExtra setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; - [backgroundExtra setBackgroundColor:customBackgroundColor]; - [self addSubview:backgroundExtra]; - - //Init pull to refresh view - KoaPullToRefreshView *view = [[KoaPullToRefreshView alloc] initWithFrame:CGRectMake(0, yOrigin, self.bounds.size.width, KoaPullToRefreshViewHeight + KoaPullToRefreshViewHeightShowed)]; - view.pullToRefreshActionHandler = actionHandler; - view.scrollView = self; - view.backgroundColor = customBackgroundColor; - [self addSubview:view]; - - view.originalTopInset = self.contentInset.top; - view.originalBottomInset = self.contentInset.bottom; - - self.pullToRefreshView = view; - self.showsPullToRefresh = YES; - } -} - -- (void)setPullToRefreshView:(KoaPullToRefreshView *)pullToRefreshView { - [self willChangeValueForKey:@"KoaPullToRefreshView"]; - objc_setAssociatedObject(self, &UIScrollViewPullToRefreshView, - pullToRefreshView, - OBJC_ASSOCIATION_ASSIGN); - [self didChangeValueForKey:@"KoaPullToRefreshView"]; -} - -- (KoaPullToRefreshView *)pullToRefreshView { - return objc_getAssociatedObject(self, &UIScrollViewPullToRefreshView); -} - -- (void)setShowsPullToRefresh:(BOOL)showsPullToRefresh { - self.pullToRefreshView.hidden = !showsPullToRefresh; - - if(!showsPullToRefresh) { - if (self.pullToRefreshView.isObserving) { - [self removeObserver:self.pullToRefreshView forKeyPath:@"contentOffset"]; - [self removeObserver:self.pullToRefreshView forKeyPath:@"frame"]; - [self.pullToRefreshView resetScrollViewContentInset]; - self.pullToRefreshView.isObserving = NO; - } - }else { - if (!self.pullToRefreshView.isObserving) { - [self addObserver:self.pullToRefreshView forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil]; - [self addObserver:self.pullToRefreshView forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; - [self addObserver:self.pullToRefreshView forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; - self.pullToRefreshView.isObserving = YES; - - CGFloat yOrigin = -KoaPullToRefreshViewHeight; - self.pullToRefreshView.frame = CGRectMake(0, yOrigin, self.bounds.size.width, KoaPullToRefreshViewHeight + KoaPullToRefreshViewHeightShowed); - } - } -} - -- (BOOL)showsPullToRefresh { - return !self.pullToRefreshView.hidden; -} - -@end - - -#pragma mark - KoaPullToRefresh -@implementation KoaPullToRefreshView - -@synthesize pullToRefreshActionHandler, arrowColor, textColor, textFont; -@synthesize state = _state; -@synthesize scrollView = _scrollView; -@synthesize showsPullToRefresh = _showsPullToRefresh; -@synthesize titleLabel = _titleLabel; -@synthesize loaderLabel = _loaderLabel; -@synthesize fontAwesomeIcon = _fontAwesomeIcon; - -- (id)initWithFrame:(CGRect)frame { - if(self = [super initWithFrame:frame]) { - - // default styling values - self.textColor = [UIColor darkGrayColor]; - self.backgroundColor = [UIColor whiteColor]; - self.autoresizingMask = UIViewAutoresizingFlexibleWidth; - self.state = KoaPullToRefreshStateStopped; - [self.titleLabel setTextAlignment:NSTextAlignmentCenter]; - [self.loaderLabel setTextAlignment:NSTextAlignmentLeft]; - - self.titles = [NSMutableArray arrayWithObjects: NSLocalizedString(@"Pull",), - NSLocalizedString(@"Release",), - NSLocalizedString(@"Loading",), - nil]; - - self.wasTriggeredByUser = YES; - } - return self; -} - -- (void)willMoveToSuperview:(UIView *)newSuperview { - if (self.superview && newSuperview == nil) { - UIScrollView *scrollView = (UIScrollView *)self.superview; - if (scrollView.showsPullToRefresh) { - if (self.isObserving) { - //If enter this branch, it is the moment just before "KoaPullToRefreshView's dealloc", so remove observer here - [scrollView removeObserver:self forKeyPath:@"contentOffset"]; - [scrollView removeObserver:self forKeyPath:@"contentSize"]; - [scrollView removeObserver:self forKeyPath:@"frame"]; - self.isObserving = NO; - } - } - } -} - -- (void)layoutSubviews -{ - CGFloat leftViewWidth = 60; - CGFloat margin = 10; - CGFloat labelMaxWidth = self.bounds.size.width - margin - leftViewWidth; - - //Set title text - self.titleLabel.text = [self.titles objectAtIndex:self.state]; - - //Set title frame - CGSize titleSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font constrainedToSize:CGSizeMake(labelMaxWidth,self.titleLabel.font.lineHeight) lineBreakMode:self.titleLabel.lineBreakMode]; - CGFloat titleY = KoaPullToRefreshViewHeight - KoaPullToRefreshViewHeightShowed - titleSize.height - KoaPullToRefreshViewTitleBottomMargin; - - [self.titleLabel setFrame:CGRectIntegral(CGRectMake(0, titleY, self.frame.size.width, titleSize.height))]; - - //Set state of loader label - switch (self.state) { - case KoaPullToRefreshStateStopped: - [self.loaderLabel setAlpha:0]; - [self.loaderLabel setFrame:CGRectMake(self.frame.size.width/2 - self.loaderLabel.frame.size.width/2, - titleY - 100, - self.loaderLabel.frame.size.width, - self.loaderLabel.frame.size.height)]; - break; - case KoaPullToRefreshStateTriggered: - [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseInOut animations:^{ - [self.loaderLabel setAlpha:1]; - [self.loaderLabel setFrame:CGRectMake(self.frame.size.width/2 - self.loaderLabel.frame.size.width/2, - titleY - 24, - self.loaderLabel.frame.size.width, - self.loaderLabel.frame.size.height)]; - } completion:NULL]; - break; - } -} - -#pragma mark - Scroll View - -- (void)resetScrollViewContentInset { - UIEdgeInsets currentInsets = self.scrollView.contentInset; - currentInsets.top = self.originalTopInset; - [self setScrollViewContentInset:currentInsets]; -} - -- (void)setScrollViewContentInsetForLoading { - UIEdgeInsets currentInsets = self.scrollView.contentInset; - //CGFloat offset = MAX(self.scrollView.contentOffset.y * -1, 0); - //currentInsets.top = MIN(offset, self.originalTopInset + self.bounds.size.height); - currentInsets.top = self.originalTopInset + self.bounds.size.height; - [self setScrollViewContentInset:currentInsets]; -} - -- (void)setScrollViewContentInset:(UIEdgeInsets)contentInset { - [UIView animateWithDuration:0.3 - delay:0 - options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState - animations:^{ - self.scrollView.contentInset = contentInset; - } - completion:NULL]; -} - -#pragma mark - Observing - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if([keyPath isEqualToString:@"contentOffset"]) - [self scrollViewDidScroll:[[change valueForKey:NSKeyValueChangeNewKey] CGPointValue]]; - else if([keyPath isEqualToString:@"contentSize"]) { - [self layoutSubviews]; - - CGFloat yOrigin; - yOrigin = -KoaPullToRefreshViewHeight; - self.frame = CGRectMake(0, yOrigin, self.bounds.size.width, KoaPullToRefreshViewHeight); - } - else if([keyPath isEqualToString:@"frame"]) - [self layoutSubviews]; -} - -- (void)scrollViewDidScroll:(CGPoint)contentOffset { - - //Change title label alpha - [self.titleLabel setAlpha: ((contentOffset.y * -1) / KoaPullToRefreshViewHeight) - 0.1]; - - if(self.state != KoaPullToRefreshStateLoading) { - CGFloat scrollOffsetThreshold; - scrollOffsetThreshold = self.frame.origin.y-self.originalTopInset; - - if(!self.scrollView.isDragging && self.state == KoaPullToRefreshStateTriggered) - self.state = KoaPullToRefreshStateLoading; - else if(contentOffset.y < scrollOffsetThreshold && self.scrollView.isDragging && self.state == KoaPullToRefreshStateStopped) - self.state = KoaPullToRefreshStateTriggered; - else if(contentOffset.y >= scrollOffsetThreshold && self.state != KoaPullToRefreshStateStopped) - self.state = KoaPullToRefreshStateStopped; - } else { - CGFloat offset; - UIEdgeInsets contentInset; - offset = MAX(self.scrollView.contentOffset.y * -1, 0.0f); - offset = MIN(offset, self.originalTopInset + self.bounds.size.height); - contentInset = self.scrollView.contentInset; - self.scrollView.contentInset = UIEdgeInsetsMake(offset, contentInset.left, contentInset.bottom, contentInset.right); - } - - //Set content offset for special cases - if(self.state != KoaPullToRefreshStateLoading) { - if (self.scrollView.contentOffset.y > -KoaPullToRefreshViewHeightShowed && self.scrollView.contentOffset.y < 0) { - [self.scrollView setContentInset:UIEdgeInsetsMake(abs(self.scrollView.contentOffset.y), self.scrollView.contentInset.left, self.scrollView.contentInset.bottom, self.scrollView.contentInset.right)]; - }else if(self.scrollView.contentOffset.y > -KoaPullToRefreshViewHeightShowed) { - [self.scrollView setContentInset:UIEdgeInsetsZero]; - }else{ - [self.scrollView setContentInset:UIEdgeInsetsMake(KoaPullToRefreshViewHeightShowed, self.scrollView.contentInset.left, self.scrollView.contentInset.bottom, self.scrollView.contentInset.right)]; - } - } -} - - -#pragma mark - Getters - -- (UILabel *)titleLabel { - if(!_titleLabel) { - _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 210, 20)]; - _titleLabel.text = NSLocalizedString(@"Pull",); - _titleLabel.font = [UIFont boldSystemFontOfSize:14]; - _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.textColor = textColor; - [self addSubview:_titleLabel]; - } - return _titleLabel; -} - -- (UILabel *)loaderLabel { - if(!_loaderLabel) { - _loaderLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.frame.size.width/2 - 17/2, 0, 17, 17)]; - _loaderLabel.text = [NSString fontAwesomeIconStringForIconIdentifier:self.fontAwesomeIcon]; - _loaderLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:20]; - _loaderLabel.backgroundColor = [UIColor clearColor]; - _loaderLabel.textColor = textColor; - [_loaderLabel sizeToFit]; - [self addSubview:_loaderLabel]; - } - return _loaderLabel; -} - -- (NSString *)fontAwesomeIcon { - if (!_fontAwesomeIcon) { - _fontAwesomeIcon = @"icon-refresh"; - } - return _fontAwesomeIcon; -} - -- (UIColor *)textColor { - return self.titleLabel.textColor; -} - -- (UIFont *)textFont { - return self.titleLabel.font; -} - -#pragma mark - Setters - -- (void)setTitle:(NSString *)title forState:(KoaPullToRefreshState)state { - if(!title) - title = @""; - - if(state == KoaPullToRefreshStateAll) - [self.titles replaceObjectsInRange:NSMakeRange(0, 3) withObjectsFromArray:@[title, title, title]]; - else - [self.titles replaceObjectAtIndex:state withObject:title]; - - [self setNeedsLayout]; -} - -- (void)setTextColor:(UIColor *)newTextColor { - textColor = newTextColor; - self.titleLabel.textColor = newTextColor; - self.loaderLabel.textColor = newTextColor; -} - -- (void)setTextFont:(UIFont *)font -{ - [self.titleLabel setFont:font]; -} - -- (void)setFontAwesomeIcon:(NSString *)fontAwesomeIcon -{ - _fontAwesomeIcon = fontAwesomeIcon; - _loaderLabel.text = [NSString fontAwesomeIconStringForIconIdentifier:self.fontAwesomeIcon]; -} - -#pragma mark - - -- (void)startAnimating{ - - //Show loader - self.state = KoaPullToRefreshStateTriggered; - [self layoutSubviews]; - - if(fequalzero(self.scrollView.contentOffset.y)) { - [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.frame.size.height) animated:YES]; - self.wasTriggeredByUser = NO; - } - else - self.wasTriggeredByUser = YES; - - self.state = KoaPullToRefreshStateLoading; -} - -- (void)stopAnimating { - self.state = KoaPullToRefreshStateStopped; - - if(!self.wasTriggeredByUser && self.scrollView.contentOffset.y < -self.originalTopInset) - [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.originalTopInset) animated:YES]; -} - -- (void)setState:(KoaPullToRefreshState)newState { - - if(_state == newState) - return; - - KoaPullToRefreshState previousState = _state; - _state = newState; - - [self setNeedsLayout]; - - switch (newState) { - case KoaPullToRefreshStateStopped: - [self stopRotatingIcon]; - [self resetScrollViewContentInset]; - self.wasTriggeredByUser = YES; - break; - - case KoaPullToRefreshStateTriggered: - break; - - case KoaPullToRefreshStateLoading: - [self startRotatingIcon]; - [self setScrollViewContentInsetForLoading]; - - if(previousState == KoaPullToRefreshStateTriggered && pullToRefreshActionHandler) - pullToRefreshActionHandler(); - - break; - } -} - -- (void)startRotatingIcon { - CABasicAnimation *rotation; - rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; - rotation.fromValue = [NSNumber numberWithFloat:0]; - rotation.toValue = [NSNumber numberWithFloat:(2*M_PI)]; - rotation.duration = 1.2; - rotation.repeatCount = HUGE_VALF; - [self.loaderLabel.layer addAnimation:rotation forKey:@"Spin"]; -} - -- (void)stopRotatingIcon { - [self.loaderLabel.layer removeAnimationForKey:@"Spin"]; -} - -@end diff --git a/Demo/KoaPullToRefresh/Resources/FontAwesome.ttf b/Demo/KoaPullToRefresh/Resources/FontAwesome.ttf index 908f69e..d7994e1 100755 Binary files a/Demo/KoaPullToRefresh/Resources/FontAwesome.ttf and b/Demo/KoaPullToRefresh/Resources/FontAwesome.ttf differ diff --git a/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.h b/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.h index 2f1c618..cf52d15 100755 --- a/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.h +++ b/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.h @@ -26,272 +26,647 @@ static NSString *const kFontAwesomeFamilyName = @"FontAwesome"; +/** + @abstract FontAwesome Icons. + */ typedef NS_ENUM(NSInteger, FAIcon) { - FAIconGlass = 0, - FAIconMusic, - FAIconSearch, - FAIconEnvelope, - FAIconHeart, - FAIconStar, - FAIconStarEmpty, - FAIconUser, - FAIconFilm, - FAIconThLarge, - FAIconTh, - FAIconThList, - FAIconOk, - FAIconRemove, - FAIconZoomIn, - FAIconZoomOut, - FAIconOff, - FAIconSignal, - FAIconCog, - FAIconTrash, - FAIconHome, - FAIconFile, - FAIconTime, - FAIconRoad, - FAIconDownloadAlt, - FAIconDownload, - FAIconUpload, - FAIconInbox, - FAIconPlayCircle, - FAIconRepeat, - FAIconRefresh, - FAIconListAlt, - FAIconLock, - FAIconFlag, - FAIconHeadphones, - FAIconVolumeOff, - FAIconVolumeDown, - FAIconVolumeUp, - FAIconQrcode, - FAIconBarcode, - FAIconTag, - FAIconTags, - FAIconBook, - FAIconBookmark, - FAIconPrint, - FAIconCamera, - FAIconFont, - FAIconBold, - FAIconItalic, - FAIconTextHeight, - FAIconTextWidth, - FAIconAlignLeft, - FAIconAlignCenter, - FAIconAlignRight, - FAIconAlignJustify, - FAIconList, - FAIconIndentLeft, - FAIconIndentRight, - FAIconFacetimeVideo, - FAIconPicture, - FAIconPencil, - FAIconMapMarker, - FAIconAdjust, - FAIconTint, - FAIconEdit, - FAIconShare, - FAIconCheck, - FAIconMove, - FAIconStepBackward, - FAIconFastBackward, - FAIconBackward, - FAIconPlay, - FAIconPause, - FAIconStop, - FAIconForward, - FAIconFastForward, - FAIconStepForward, - FAIconEject, - FAIconChevronLeft, - FAIconChevronRight, - FAIconPlusSign, - FAIconMinusSign, - FAIconRemoveSign, - FAIconOkSign, - FAIconQuestionSign, - FAIconInfoSign, - FAIconScreenshot, - FAIconRemoveCircle, - FAIconOkCircle, - FAIconBanCircle, - FAIconArrowLeft, - FAIconArrowRight, - FAIconArrowUp, - FAIconArrowDown, - FAIconShareAlt, - FAIconResizeFull, - FAIconResizeSmall, - FAIconPlus, - FAIconMinus, - FAIconAsterisk, - FAIconExclamationSign, - FAIconGift, - FAIconLeaf, - FAIconFire, - FAIconEyeOpen, - FAIconEyeClose, - FAIconWarningSign, - FAIconPlane, - FAIconCalendar, - FAIconRandom, - FAIconComment, - FAIconMagnet, - FAIconChevronUp, - FAIconChevronDown, - FAIconRetweet, - FAIconShoppingCart, - FAIconFolderClose, - FAIconFolderOpen, - FAIconResizeVertical, - FAIconResizeHorizontal, - FAIconBarChart, - FAIconTwitterSign, - FAIconFacebookSign, - FAIconCameraRetro, - FAIconKey, - FAIconCogs, - FAIconComments, - FAIconThumbsUp, - FAIconThumbsDown, - FAIconStarHalf, - FAIconHeartEmpty, - FAIconSignout, - FAIconLinkedinSign, - FAIconPushpin, - FAIconExternalLink, - FAIconSignin, - FAIconTrophy, - FAIconGithubSign, - FAIconUploadAlt, - FAIconLemon, - FAIconPhone, - FAIconCheckEmpty, - FAIconBookmarkEmpty, - FAIconPhoneSign, - FAIconTwitter, - FAIconFacebook, - FAIconGithub, - FAIconUnlock, - FAIconCreditCard, - FAIconRss, - FAIconHdd, - FAIconBullhorn, - FAIconBell, - FAIconCertificate, - FAIconHandRight, - FAIconHandLeft, - FAIconHandUp, - FAIconHandDown, - FAIconCircleArrowLeft, - FAIconCircleArrowRight, - FAIconCircleArrowUp, - FAIconCircleArrowDown, - FAIconGlobe, - FAIconWrench, - FAIconTasks, - FAIconFilter, - FAIconBriefcase, - FAIconFullscreen, - FAIconGroup, - FAIconLink, - FAIconCloud, - FAIconBeaker, - FAIconCut, - FAIconCopy, - FAIconPaperClip, - FAIconSave, - FAIconSignBlank, - FAIconReorder, - FAIconListUl, - FAIconListOl, - FAIconStrikethrough, - FAIconUnderline, - FAIconTable, - FAIconMagic, - FAIconTruck, - FAIconPinterest, - FAIconPinterestSign, - FAIconGooglePlusSign, - FAIconGooglePlus, - FAIconMoney, - FAIconCaretDown, - FAIconCaretUp, - FAIconCaretLeft, - FAIconCaretRight, - FAIconColumns, - FAIconSort, - FAIconSortDown, - FAIconSortUp, - FAIconEnvelopeAlt, - FAIconLinkedin, - FAIconUndo, - FAIconLegal, - FAIconDashboard, - FAIconCommentAlt, - FAIconCommentsAlt, - FAIconBolt, - FAIconSitemap, - FAIconUmbrella, - FAIconPaste, - FAIconUserMd, - FAIconStethoscope, - FAIconBuilding, - FAIconHospital, - FAIconAmbulance, - FAIconMedkit, - FAIconHSign, - FAIconPlusSignAlt, - FAIconSpinner, - FAIconCloudDownload, - FAIconCloudUpload, - FAIconLightbulb, - FAIconExchange, - FAIconBellAlt, - FAIconFileAlt, - FAIconBeer, - FAIconCoffee, - FAIconFood, - FAIconFighterJet, - FAIconAngleLeft, - FAIconAngleRight, - FAIconAngleUp, - FAIconAngleDown, - FAIconDoubleAngleLeft, - FAIconDoubleAngleRight, - FAIconDoubleAngleUp, - FAIconDoubleAngleDown, - FAIconCircleBlank, - FAIconCircle, - FAIconDesktop, - FAIconLaptop, - FAIconTablet, - FAIconMobilePhone, - FAIconQuoteLeft, - FAIconQuoteRight, - FAIconReply, - FAIconGithubAlt, - FAIconFolderCloseAlt, - FAIconFolderOpenAlt, - FAIconSuitcase, + FAGlass, + FAMusic, + FASearch, + FAEnvelopeO, + FAHeart, + FAStar, + FAStarO, + FAUser, + FAFilm, + FAThLarge, + FATh, + FAThList, + FACheck, + FATimes, + FASearchPlus, + FASearchMinus, + FAPowerOff, + FASignal, + FACog, + FATrashO, + FAHome, + FAFileO, + FAClockO, + FARoad, + FADownload, + FAArrowCircleODown, + FAArrowCircleOUp, + FAInbox, + FAPlayCircleO, + FARepeat, + FARefresh, + FAListAlt, + FALock, + FAFlag, + FAHeadphones, + FAVolumeOff, + FAVolumeDown, + FAVolumeUp, + FAQrcode, + FABarcode, + FATag, + FATags, + FABook, + FABookmark, + FAPrint, + FACamera, + FAFont, + FABold, + FAItalic, + FATextHeight, + FATextWidth, + FAAlignLeft, + FAAlignCenter, + FAAlignRight, + FAAlignJustify, + FAList, + FAOutdent, + FAIndent, + FAVideoCamera, + FAPictureO, + FAPencil, + FAMapMarker, + FAAdjust, + FATint, + FAPencilSquareO, + FAShareSquareO, + FACheckSquareO, + FAArrows, + FAStepBackward, + FAFastBackward, + FABackward, + FAPlay, + FAPause, + FAStop, + FAForward, + FAFastForward, + FAStepForward, + FAEject, + FAChevronLeft, + FAChevronRight, + FAPlusCircle, + FAMinusCircle, + FATimesCircle, + FACheckCircle, + FAQuestionCircle, + FAInfoCircle, + FACrosshairs, + FATimesCircleO, + FACheckCircleO, + FABan, + FAArrowLeft, + FAArrowRight, + FAArrowUp, + FAArrowDown, + FAShare, + FAExpand, + FACompress, + FAPlus, + FAMinus, + FAAsterisk, + FAExclamationCircle, + FAGift, + FALeaf, + FAFire, + FAEye, + FAEyeSlash, + FAExclamationTriangle, + FAPlane, + FACalendar, + FARandom, + FAComment, + FAMagnet, + FAChevronUp, + FAChevronDown, + FARetweet, + FAShoppingCart, + FAFolder, + FAFolderOpen, + FAArrowsV, + FAArrowsH, + FABarChartO, + FATwitterSquare, + FAFacebookSquare, + FACameraRetro, + FAKey, + FACogs, + FAComments, + FAThumbsOUp, + FAThumbsODown, + FAStarHalf, + FAHeartO, + FASignOut, + FALinkedinSquare, + FAThumbTack, + FAExternalLink, + FASignIn, + FATrophy, + FAGithubSquare, + FAUpload, + FALemonO, + FAPhone, + FASquareO, + FABookmarkO, + FAPhoneSquare, + FATwitter, + FAFacebook, + FAGithub, + FAUnlock, + FACreditCard, + FARss, + FAHddO, + FABullhorn, + FABell, + FACertificate, + FAHandORight, + FAHandOLeft, + FAHandOUp, + FAHandODown, + FAArrowCircleLeft, + FAArrowCircleRight, + FAArrowCircleUp, + FAArrowCircleDown, + FAGlobe, + FAWrench, + FATasks, + FAFilter, + FABriefcase, + FAArrowsAlt, + FAUsers, + FALink, + FACloud, + FAFlask, + FAScissors, + FAFilesO, + FAPaperclip, + FAFloppyO, + FASquare, + FABars, + FAListUl, + FAListOl, + FAStrikethrough, + FAUnderline, + FATable, + FAMagic, + FATruck, + FAPinterest, + FAPinterestSquare, + FAGooglePlusSquare, + FAGooglePlus, + FAMoney, + FACaretDown, + FACaretUp, + FACaretLeft, + FACaretRight, + FAColumns, + FASort, + FASortAsc, + FASortDesc, + FAEnvelope, + FALinkedin, + FAUndo, + FAGavel, + FATachometer, + FACommentO, + FACommentsO, + FABolt, + FASitemap, + FAUmbrella, + FAClipboard, + FALightbulbO, + FAExchange, + FACloudDownload, + FACloudUpload, + FAUserMd, + FAStethoscope, + FASuitcase, + FABellO, + FACoffee, + FACutlery, + FAFileTextO, + FABuildingO, + FAHospitalO, + FAAmbulance, + FAMedkit, + FAFighterJet, + FABeer, + FAHSquare, + FAPlusSquare, + FAAngleDoubleLeft, + FAAngleDoubleRight, + FAAngleDoubleUp, + FAAngleDoubleDown, + FAAngleLeft, + FAAngleRight, + FAAngleUp, + FAAngleDown, + FADesktop, + FALaptop, + FATablet, + FAMobile, + FACircleO, + FAQuoteLeft, + FAQuoteRight, + FASpinner, + FACircle, + FAReply, + FAGithubAlt, + FAFolderO, + FAFolderOpenO, + FASmileO, + FAFrownO, + FAMehO, + FAGamepad, + FAKeyboardO, + FAFlagO, + FAFlagCheckered, + FATerminal, + FACode, + FAReplyAll, + FAMailReplyAll, + FAStarHalfO, + FALocationArrow, + FACrop, + FACodeFork, + FAChainBroken, + FAQuestion, + FAInfo, + FAExclamation, + FASuperscript, + FASubscript, + FAEraser, + FAPuzzlePiece, + FAMicrophone, + FAMicrophoneSlash, + FAShield, + FACalendarO, + FAFireExtinguisher, + FARocket, + FAMaxcdn, + FAChevronCircleLeft, + FAChevronCircleRight, + FAChevronCircleUp, + FAChevronCircleDown, + FAHtml5, + FACss3, + FAAnchor, + FAUnlockAlt, + FABullseye, + FAEllipsisH, + FAEllipsisV, + FARssSquare, + FAPlayCircle, + FATicket, + FAMinusSquare, + FAMinusSquareO, + FALevelUp, + FALevelDown, + FACheckSquare, + FAPencilSquare, + FAExternalLinkSquare, + FAShareSquare, + FACompass, + FACaretSquareODown, + FACaretSquareOUp, + FACaretSquareORight, + FAEur, + FAGbp, + FAUsd, + FAInr, + FAJpy, + FARub, + FAKrw, + FABtc, + FAFile, + FAFileText, + FASortAlphaAsc, + FASortAlphaDesc, + FASortAmountAsc, + FASortAmountDesc, + FASortNumericAsc, + FASortNumericDesc, + FAThumbsUp, + FAThumbsDown, + FAYoutubeSquare, + FAYoutube, + FAXing, + FAXingSquare, + FAYoutubePlay, + FADropbox, + FAStackOverflow, + FAInstagram, + FAFlickr, + FAAdn, + FABitbucket, + FABitbucketSquare, + FATumblr, + FATumblrSquare, + FALongArrowDown, + FALongArrowUp, + FALongArrowLeft, + FALongArrowRight, + FAApple, + FAWindows, + FAAndroid, + FALinux, + FADribbble, + FASkype, + FAFoursquare, + FATrello, + FAFemale, + FAMale, + FAGittip, + FASunO, + FAMoonO, + FAArchive, + FABug, + FAVk, + FAWeibo, + FARenren, + FAPagelines, + FAStackExchange, + FAArrowCircleORight, + FAArrowCircleOLeft, + FACaretSquareOLeft, + FADotCircleO, + FAWheelchair, + FAVimeoSquare, + FATry, + FAPlusSquareO, + + /* FontAwesome ver 4.1.0 */ + FAautomobile, + FAbank, + FAbehance, + FAbehanceSquare, + FAbomb, + FAbuilding, + FAcab, + FAcar, + FAchild, + FAcircleONotch, + FAcircleThin, + FAcodepen, + FAcube, + FAcubes, + FAdatabase, + FAdelicious, + FAdeviantart, + FAdigg, + FAdrupal, + FAempire, + FAenvelopeSquare, + FAfax, + FAfileArchiveO, + FAfileAudioO, + FAfileCodeO, + FAfileExcelO, + FAfileImageO, + FAfileMovieO, + FAfilePdfO, + FAfilePhotoO, + FAfilePictureO, + FAfilePowerpointO, + FAfileSoundO, + FAfileVideoO, + FAfileWordO, + FAfileZipO, + FAge, + FAgit, + FAgitSquare, + FAgoogle, + FAgraduationCap, + FAhackerNews, + FAheader, + FAhistory, + FAinstitution, + FAjoomla, + FAjsfiddle, + FAlanguage, + FAlifeBouy, + FAlifeRing, + FAlifeSaver, + FAmortarBoard, + FAopenid, + FApaperPlane, + FApaperPlaneO, + FAparagraph, + FApaw, + FApiedPiper, + FApiedPiperalt, + FApiedPipersquare, + FAqq, + FAra, + FArebel, + FArecycle, + FAreddit, + FAredditSquare, + FAsend, + FAsendO, + FAshareAlt, + FAshareAltSquare, + FAslack, + FAsliders, + FAsoundcloud, + FAspaceShuttle, + FAspoon, + FAspotify, + FAsteam, + FAsteamSquare, + FAstumbleupon, + FAstumbleuponCircle, + FAsupport, + FAtaxi, + FAtencentWeibo, + FAtree, + FAuniversity, + FAvine, + FAwechat, + FAweixin, + FAwordpress, + FAyahoo, + + /* FontAwesome ver 4.2.0 */ + FAangellist, + FAareaChart, + FAat, + FAbellSlash, + FAbellSlashO, + FAbicycle, + FAbinoculars, + FAbirthdayCake, + FAbus, + FAcalculator, + FAcc, + FAccAmex, + FAccDiscover, + FAccMastercard, + FAccPaypal, + FAccStripe, + FAccVisa, + FAcopyright, + FAeyedropper, + FAfutbolO, + FAgoogleWallet, + FAils, + FAioxhost, + FAlastfm, + FAlastfmSquare, + FAlineChart, + FAmeanpath, + FAnewspaperO, + FApaintBrush, + FApaypal, + FApieChart, + FAplug, + FAshekel, + FAsheqel, + FAslideshare, + FAsoccerBallO, + FAtoggleOff, + FAtoggleOn, + FAtrash, + FAtty, + FAtwitch, + FAwifi, + FAyelp, + + /* FontAwesome ver 4.3.0 */ + FAbed, + FAbuysellads, + FAcartArrowDown, + FAcartPlus, + FAconnectdevelop, + FAdashcube, + FAdiamond, + FAfacebookOfficial, + FAforumbee, + FAheartbeat, + FAhotel, + FAleanpub, + FAmars, + FAmarsDouble, + FAmarsStroke, + FAmarsStrokeH, + FAmarsStrokeV, + FAmedium, + FAmercury, + FAmotorcycle, + FAneuter, + FApinterestP, + FAsellsy, + FAserver, + FAship, + FAshirtsinbulk, + FAsimplybuilt, + FAskyatlas, + FAstreetView, + FAsubway, + FAtrain, + FAtransgender, + FAtransgenderAlt, + FAuserPlus, + FAuserSecret, + FAuserTimes, + FAvenus, + FAvenusDouble, + FAvenusMars, + FAviacoin, + + /* FontAwesome ver 4.4.0 */ + FA500px, + FAamazon, + FAbalanceScale, + FAbatteryEmpty, + FAbatteryFull, + FAbatteryHalf, + FAbatteryQuarter, + FAbatteryThreeQuarters, + FAblackTie, + FAcalendarCheckO, + FAcalendarMinusO, + FAcalendarPlusO, + FAcalendarTimesO, + FAccDinersClub, + FAccJcb, + FAchrome, + FAclone, + FAcommenting, + FAcommentingO, + FAcontao, + FAcreativeCommons, + FAexpeditedssl, + FAfirefox, + FAfonticons, + FAgenderless, + FAgetPocket, + FAgg, + FAggCircle, + FAhandLizardO, + FAhandPaperO, + FAhandPeaceO, + FAhandPointerO, + FAhandRockO, + FAhandScissorsO, + FAhandSpockO, + FAhourglass, + FAhourglassEnd, + FAhourglassHalf, + FAhourglassO, + FAhourglassStart, + FAhouzz, + FAiCursor, + FAindustry, + FAinternetExplorer, + FAmap, + FAmapO, + FAmapPin, + FAmapSigns, + FAmousePointer, + FAobjectGroup, + FAobjectUngroup, + FAodnoklassniki, + FAodnoklassnikiSquare, + FAopencart, + FAopera, + FAoptinMonster, + FAregistered, + FAsafari, + FAstickyNote, + FAstickyNoteO, + FAtelevision, + FAtrademark, + FAtripadvisor, + FAvimeo, + FAwikipediaW, + FAyCombinator }; + + @interface NSString (FontAwesome) -/* Returns the correct enum for a font-awesome icon. - * The list of identifiers can be found here: - * http://fortawesome.github.com/Font-Awesome/#all-icons */ +/** + @abstract Returns the correct enum for a font-awesome icon. + @discussion The list of identifiers can be found here: http://fortawesome.github.io/Font-Awesome/icons + */ + (FAIcon)fontAwesomeEnumForIconIdentifier:(NSString*)string; -/* Returns the font-awesome character associated to the - * icon enum passed as argument */ +/** + @abstract Returns the font-awesome character associated to the icon enum passed as argument + */ + (NSString*)fontAwesomeIconStringForEnum:(FAIcon)value; -/* Returns the font-awesome character associated to the font-awesome - * identifier. - * http://fortawesome.github.com/Font-Awesome/#all-icons */ +/* + @abstract Returns the font-awesome character associated to the font-awesome identifier. + @discussion The list of identifiers can be found here: http://fortawesome.github.io/Font-Awesome/icons + */ + (NSString*)fontAwesomeIconStringForIconIdentifier:(NSString*)identifier; @end diff --git a/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.m b/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.m index f500386..950d7e1 100755 --- a/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.m +++ b/Demo/KoaPullToRefresh/Resources/NSString+FontAwesome.m @@ -26,299 +26,672 @@ @implementation NSString (FontAwesome) -#pragma mark - public - -/* Returns the correct enum for a font-awesome icon. - * The list of identifiers can be found here: - * http://fortawesome.github.com/Font-awesome/#all-icons */ -+ (FAIcon)fontAwesomeEnumForIconIdentifier:(NSString*)string -{ +#pragma mark - Public API ++ (FAIcon)fontAwesomeEnumForIconIdentifier:(NSString*)string { NSDictionary *enums = [self enumDictionary]; return [enums[string] integerValue]; } -/* Returns the font-awesome character associated to the - * icon enum passed as argument */ -+ (NSString*)fontAwesomeIconStringForEnum:(FAIcon)value -{ - return [self fontAwesomeIcons][value]; ++ (NSString*)fontAwesomeIconStringForEnum:(FAIcon)value { + return [NSString fontAwesomeUnicodeStrings][value]; } -/* Returns the font-awesome character associated to the font-awesome - * identifier. - * http://fortawesome.github.com/Font-awesome/#all-icons */ -+ (NSString*)fontAwesomeIconStringForIconIdentifier:(NSString*)identifier -{ ++ (NSString*)fontAwesomeIconStringForIconIdentifier:(NSString*)identifier { return [self fontAwesomeIconStringForEnum:[self fontAwesomeEnumForIconIdentifier:identifier]]; } -#pragma mark - data initialization -+ (NSArray*)fontAwesomeIcons -{ - static NSArray *fontAwesomeIcons; - if (nil == fontAwesomeIcons) { - fontAwesomeIcons = @[@"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"", @""]; - } - return fontAwesomeIcons; +#pragma mark - Data Initialization ++ (NSArray *)fontAwesomeUnicodeStrings { + + static NSArray *fontAwesomeUnicodeStrings; + + static dispatch_once_t unicodeStringsOnceToken; + dispatch_once(&unicodeStringsOnceToken, ^{ + + fontAwesomeUnicodeStrings = @[@"\uf000", @"\uf001", @"\uf002", @"\uf003", @"\uf004", @"\uf005", @"\uf006", @"\uf007", @"\uf008", @"\uf009", @"\uf00a", @"\uf00b", @"\uf00c", @"\uf00d", @"\uf00e", @"\uf010", @"\uf011", @"\uf012", @"\uf013", @"\uf014", @"\uf015", @"\uf016", @"\uf017", @"\uf018", @"\uf019", @"\uf01a", @"\uf01b", @"\uf01c", @"\uf01d", @"\uf01e", @"\uf021", @"\uf022", @"\uf023", @"\uf024", @"\uf025", @"\uf026", @"\uf027", @"\uf028", @"\uf029", @"\uf02a", @"\uf02b", @"\uf02c", @"\uf02d", @"\uf02e", @"\uf02f", @"\uf030", @"\uf031", @"\uf032", @"\uf033", @"\uf034", @"\uf035", @"\uf036", @"\uf037", @"\uf038", @"\uf039", @"\uf03a", @"\uf03b", @"\uf03c", @"\uf03d", @"\uf03e", @"\uf040", @"\uf041", @"\uf042", @"\uf043", @"\uf044", @"\uf045", @"\uf046", @"\uf047", @"\uf048", @"\uf049", @"\uf04a", @"\uf04b", @"\uf04c", @"\uf04d", @"\uf04e", @"\uf050", @"\uf051", @"\uf052", @"\uf053", @"\uf054", @"\uf055", @"\uf056", @"\uf057", @"\uf058", @"\uf059", @"\uf05a", @"\uf05b", @"\uf05c", @"\uf05d", @"\uf05e", @"\uf060", @"\uf061", @"\uf062", @"\uf063", @"\uf064", @"\uf065", @"\uf066", @"\uf067", @"\uf068", @"\uf069", @"\uf06a", @"\uf06b", @"\uf06c", @"\uf06d", @"\uf06e", @"\uf070", @"\uf071", @"\uf072", @"\uf073", @"\uf074", @"\uf075", @"\uf076", @"\uf077", @"\uf078", @"\uf079", @"\uf07a", @"\uf07b", @"\uf07c", @"\uf07d", @"\uf07e", @"\uf080", @"\uf081", @"\uf082", @"\uf083", @"\uf084", @"\uf085", @"\uf086", @"\uf087", @"\uf088", @"\uf089", @"\uf08a", @"\uf08b", @"\uf08c", @"\uf08d", @"\uf08e", @"\uf090", @"\uf091", @"\uf092", @"\uf093", @"\uf094", @"\uf095", @"\uf096", @"\uf097", @"\uf098", @"\uf099", @"\uf09a", @"\uf09b", @"\uf09c", @"\uf09d", @"\uf09e", @"\uf0a0", @"\uf0a1", @"\uf0f3", @"\uf0a3", @"\uf0a4", @"\uf0a5", @"\uf0a6", @"\uf0a7", @"\uf0a8", @"\uf0a9", @"\uf0aa", @"\uf0ab", @"\uf0ac", @"\uf0ad", @"\uf0ae", @"\uf0b0", @"\uf0b1", @"\uf0b2", @"\uf0c0", @"\uf0c1", @"\uf0c2", @"\uf0c3", @"\uf0c4", @"\uf0c5", @"\uf0c6", @"\uf0c7", @"\uf0c8", @"\uf0c9", @"\uf0ca", @"\uf0cb", @"\uf0cc", @"\uf0cd", @"\uf0ce", @"\uf0d0", @"\uf0d1", @"\uf0d2", @"\uf0d3", @"\uf0d4", @"\uf0d5", @"\uf0d6", @"\uf0d7", @"\uf0d8", @"\uf0d9", @"\uf0da", @"\uf0db", @"\uf0dc", @"\uf0dd", @"\uf0de", @"\uf0e0", @"\uf0e1", @"\uf0e2", @"\uf0e3", @"\uf0e4", @"\uf0e5", @"\uf0e6", @"\uf0e7", @"\uf0e8", @"\uf0e9", @"\uf0ea", @"\uf0eb", @"\uf0ec", @"\uf0ed", @"\uf0ee", @"\uf0f0", @"\uf0f1", @"\uf0f2", @"\uf0a2", @"\uf0f4", @"\uf0f5", @"\uf0f6", @"\uf0f7", @"\uf0f8", @"\uf0f9", @"\uf0fa", @"\uf0fb", @"\uf0fc", @"\uf0fd", @"\uf0fe", @"\uf100", @"\uf101", @"\uf102", @"\uf103", @"\uf104", @"\uf105", @"\uf106", @"\uf107", @"\uf108", @"\uf109", @"\uf10a", @"\uf10b", @"\uf10c", @"\uf10d", @"\uf10e", @"\uf110", @"\uf111", @"\uf112", @"\uf113", @"\uf114", @"\uf115", @"\uf118", @"\uf119", @"\uf11a", @"\uf11b", @"\uf11c", @"\uf11d", @"\uf11e", @"\uf120", @"\uf121", @"\uf122", @"\uf122", @"\uf123", @"\uf124", @"\uf125", @"\uf126", @"\uf127", @"\uf128", @"\uf129", @"\uf12a", @"\uf12b", @"\uf12c", @"\uf12d", @"\uf12e", @"\uf130", @"\uf131", @"\uf132", @"\uf133", @"\uf134", @"\uf135", @"\uf136", @"\uf137", @"\uf138", @"\uf139", @"\uf13a", @"\uf13b", @"\uf13c", @"\uf13d", @"\uf13e", @"\uf140", @"\uf141", @"\uf142", @"\uf143", @"\uf144", @"\uf145", @"\uf146", @"\uf147", @"\uf148", @"\uf149", @"\uf14a", @"\uf14b", @"\uf14c", @"\uf14d", @"\uf14e", @"\uf150", @"\uf151", @"\uf152", @"\uf153", @"\uf154", @"\uf155", @"\uf156", @"\uf157", @"\uf158", @"\uf159", @"\uf15a", @"\uf15b", @"\uf15c", @"\uf15d", @"\uf15e", @"\uf160", @"\uf161", @"\uf162", @"\uf163", @"\uf164", @"\uf165", @"\uf166", @"\uf167", @"\uf168", @"\uf169", @"\uf16a", @"\uf16b", @"\uf16c", @"\uf16d", @"\uf16e", @"\uf170", @"\uf171", @"\uf172", @"\uf173", @"\uf174", @"\uf175", @"\uf176", @"\uf177", @"\uf178", @"\uf179", @"\uf17a", @"\uf17b", @"\uf17c", @"\uf17d", @"\uf17e", @"\uf180", @"\uf181", @"\uf182", @"\uf183", @"\uf184", @"\uf185", @"\uf186", @"\uf187", @"\uf188", @"\uf189", @"\uf18a", @"\uf18b", @"\uf18c", @"\uf18d", @"\uf18e", @"\uf190", @"\uf191", @"\uf192", @"\uf193", @"\uf194", @"\uf195", @"\uf196", + /* Font Awesome ver 4.10 */ + @"\uf1b9", @"\uf19c", @"\uf1b4", @"\uf1b5", @"\uf1e2", @"\uf1ad", @"\uf1ba", @"\uf1b9", @"\uf1ae", @"\uf1ce", @"\uf1db", @"\uf1cb", @"\uf1b2", @"\uf1b3", @"\uf1c0", @"\uf1a5", @"\uf1bd", @"\uf1a6", @"\uf1a9", @"\uf1d1", @"\uf199", @"\uf1ac", @"\uf1c6", @"\uf1c7", @"\uf1c9", @"\uf1c3", @"\uf1c5", @"\uf1c8", @"\uf1c1", @"\uf1c5", @"\uf1c5", @"\uf1c4", @"\uf1c7", @"\uf1c8", @"\uf1c2", @"\uf1c6", @"\uf1d1", @"\uf1d3", @"\uf1d2", @"\uf1a0", @"\uf19d", @"\uf1d4", @"\uf1dc", @"\uf1da", @"\uf19c", @"\uf1aa", @"\uf1cc", @"\uf1ab", @"\uf1cd", @"\uf1cd", @"\uf1cd", @"\uf19d", @"\uf19b", @"\uf1d8", @"\uf1d9", @"\uf1dd", @"\uf1b0", @"\uf1a7", @"\uf1a8", @"\uf1a7", @"\uf1d6", @"\uf1d0", @"\uf1d0", @"\uf1b8", @"\uf1a1", @"\uf1a2", @"\uf1d8", @"\uf1d9", @"\uf1e0", @"\uf1e1", @"\uf198", @"\uf1de", @"\uf1be", @"\uf197", @"\uf1b1", @"\uf1bc", @"\uf1b6", @"\uf1b7", @"\uf1a4", @"\uf1a3", @"\uf1cd", @"\uf1ba", @"\uf1d5", @"\uf1bb", @"\uf19c", @"\uf1ca", @"\uf1d7", @"\uf1d7", @"\uf19a", @"\uf19e", + /* Font Awesome ver 4.20 */ + @"\uf209", @"\uf1fe", @"\uf1fa", @"\uf1f6", @"\uf1f7", @"\uf206", @"\uf1e5", @"\uf1fd", @"\uf207", @"\uf1ec", @"\uf20a", @"\uf1f3", @"\uf1f2", @"\uf1f1", @"\uf1f4", @"\uf1f5", @"\uf1f0", @"\uf1f9", @"\uf1fb", @"\uf1e3", @"\uf1ee", @"\uf20b", @"\uf208", @"\uf202", @"\uf203", @"\uf201", @"\uf20c", @"\uf1ea", @"\uf1fc", @"\uf1ed", @"\uf200", @"\uf1e6", @"\uf20b", @"\uf20b", @"\uf1e7", @"\uf1e3", @"\uf204", @"\uf205", @"\uf1f8", @"\uf1e4", @"\uf1e8", @"\uf1eb", @"\uf1e9", + /* Font Awesome ver 4.30 */ + @"\uf236", @"\uf20d", @"\uf218", @"\uf217;", @"\uf20e", @"\uf210", @"\uf219", @"\uf230", @"\uf211", @"\uf21e", @"\uf236", @"\uf212", @"\uf222", @"\uf227", @"\uf229", @"\uf22b", @"\uf22a", @"\uf23a", @"\uf223", @"\uf21c", @"\uf22c", @"\uf231", @"\uf213", @"\uf233", @"\uf21a", @"\uf214", @"\uf215", @"\uf216", @"\uf21d", @"\uf239", @"\uf238", @"\uf224", @"\uf225", @"\uf234", @"\uf21b", @"\uf235", @"\uf221", @"\uf226", @"\uf228", @"\uf237", + /* Font Awesome ver 4.40 */ + @"\uf26e", @"\uf270", @"\uf24e", @"\uf244", @"\uf240", @"\uf242", @"\uf243", @"\uf241", @"\uf27e", @"\uf274", @"\uf272", @"\uf271", @"\uf273", @"\uf24c", @"\uf24b", @"\uf268", @"\uf24d", @"\uf27a", @"\uf27b", @"\uf26d", @"\uf25e", @"\uf23e", @"\uf269", @"\uf280", @"\uf22d", @"\uf265", @"\uf260", @"\uf261", @"\uf258", @"\uf256", @"\uf25b", @"\uf25a", @"\uf255", @"\uf257", @"\uf259", @"\uf254", @"\uf253", @"\uf252", @"\uf250", @"\uf251", @"\uf27c", @"\uf246", @"\uf275", @"\uf26b", @"\uf279", @"\uf278", @"\uf276", @"\uf277", @"\uf245", @"\uf247", @"\uf248", @"\uf263", @"\uf264", @"\uf23d", @"\uf26a", @"\uf23c", @"\uf25d", @"\uf267", @"\uf249", @"\uf24a", @"\uf26c", @"\uf25c", @"\uf262", @"\uf27d", @"\uf266", @"\uf23b"]; + + }); + + return fontAwesomeUnicodeStrings; } -+ (NSDictionary*)enumDictionary -{ ++ (NSDictionary *)enumDictionary { + static NSDictionary *enumDictionary; - if (nil == enumDictionary) { + + static dispatch_once_t enumDictionaryOnceToken; + dispatch_once(&enumDictionaryOnceToken, ^{ + NSMutableDictionary *tmp = [[NSMutableDictionary alloc] init]; - tmp[@"icon-glass"] = @(FAIconGlass); - tmp[@"icon-music"] = @(FAIconMusic); - tmp[@"icon-search"] = @(FAIconSearch); - tmp[@"icon-envelope"] = @(FAIconEnvelope); - tmp[@"icon-heart"] = @(FAIconHeart); - tmp[@"icon-star"] = @(FAIconStar); - tmp[@"icon-star-empty"] = @(FAIconStarEmpty); - tmp[@"icon-user"] = @(FAIconUser); - tmp[@"icon-film"] = @(FAIconFilm); - tmp[@"icon-th-large"] = @(FAIconThLarge); - tmp[@"icon-th"] = @(FAIconTh); - tmp[@"icon-th-list"] = @(FAIconThList); - tmp[@"icon-ok"] = @(FAIconOk); - tmp[@"icon-remove"] = @(FAIconRemove); - tmp[@"icon-zoom-in"] = @(FAIconZoomIn); - tmp[@"icon-zoom-out"] = @(FAIconZoomOut); - tmp[@"icon-off"] = @(FAIconOff); - tmp[@"icon-signal"] = @(FAIconSignal); - tmp[@"icon-cog"] = @(FAIconCog); - tmp[@"icon-trash"] = @(FAIconTrash); - tmp[@"icon-home"] = @(FAIconHome); - tmp[@"icon-file"] = @(FAIconFile); - tmp[@"icon-time"] = @(FAIconTime); - tmp[@"icon-road"] = @(FAIconRoad); - tmp[@"icon-download-alt"] = @(FAIconDownloadAlt); - tmp[@"icon-download"] = @(FAIconDownload); - tmp[@"icon-upload"] = @(FAIconUpload); - tmp[@"icon-inbox"] = @(FAIconInbox); - tmp[@"icon-play-circle"] = @(FAIconPlayCircle); - tmp[@"icon-repeat"] = @(FAIconRepeat); - tmp[@"icon-refresh"] = @(FAIconRefresh); - tmp[@"icon-list-alt"] = @(FAIconListAlt); - tmp[@"icon-lock"] = @(FAIconLock); - tmp[@"icon-flag"] = @(FAIconFlag); - tmp[@"icon-headphones"] = @(FAIconHeadphones); - tmp[@"icon-volume-off"] = @(FAIconVolumeOff); - tmp[@"icon-volume-down"] = @(FAIconVolumeDown); - tmp[@"icon-volume-up"] = @(FAIconVolumeUp); - tmp[@"icon-qrcode"] = @(FAIconQrcode); - tmp[@"icon-barcode"] = @(FAIconBarcode); - tmp[@"icon-tag"] = @(FAIconTag); - tmp[@"icon-tags"] = @(FAIconTags); - tmp[@"icon-book"] = @(FAIconBook); - tmp[@"icon-bookmark"] = @(FAIconBookmark); - tmp[@"icon-print"] = @(FAIconPrint); - tmp[@"icon-camera"] = @(FAIconCamera); - tmp[@"icon-font"] = @(FAIconFont); - tmp[@"icon-bold"] = @(FAIconBold); - tmp[@"icon-italic"] = @(FAIconItalic); - tmp[@"icon-text-height"] = @(FAIconTextHeight); - tmp[@"icon-text-width"] = @(FAIconTextWidth); - tmp[@"icon-align-left"] = @(FAIconAlignLeft); - tmp[@"icon-align-center"] = @(FAIconAlignCenter); - tmp[@"icon-align-right"] = @(FAIconAlignRight); - tmp[@"icon-align-justify"] = @(FAIconAlignJustify); - tmp[@"icon-list"] = @(FAIconList); - tmp[@"icon-indent-left"] = @(FAIconIndentLeft); - tmp[@"icon-indent-right"] = @(FAIconIndentRight); - tmp[@"icon-facetime-video"] = @(FAIconFacetimeVideo); - tmp[@"icon-picture"] = @(FAIconPicture); - tmp[@"icon-pencil"] = @(FAIconPencil); - tmp[@"icon-map-marker"] = @(FAIconMapMarker); - tmp[@"icon-adjust"] = @(FAIconAdjust); - tmp[@"icon-tint"] = @(FAIconTint); - tmp[@"icon-edit"] = @(FAIconEdit); - tmp[@"icon-share"] = @(FAIconShare); - tmp[@"icon-check"] = @(FAIconCheck); - tmp[@"icon-move"] = @(FAIconMove); - tmp[@"icon-step-backward"] = @(FAIconStepBackward); - tmp[@"icon-fast-backward"] = @(FAIconFastBackward); - tmp[@"icon-backward"] = @(FAIconBackward); - tmp[@"icon-play"] = @(FAIconPlay); - tmp[@"icon-pause"] = @(FAIconPause); - tmp[@"icon-stop"] = @(FAIconStop); - tmp[@"icon-forward"] = @(FAIconForward); - tmp[@"icon-fast-forward"] = @(FAIconFastForward); - tmp[@"icon-step-forward"] = @(FAIconStepForward); - tmp[@"icon-eject"] = @(FAIconEject); - tmp[@"icon-chevron-left"] = @(FAIconChevronLeft); - tmp[@"icon-chevron-right"] = @(FAIconChevronRight); - tmp[@"icon-plus-sign"] = @(FAIconPlusSign); - tmp[@"icon-minus-sign"] = @(FAIconMinusSign); - tmp[@"icon-remove-sign"] = @(FAIconRemoveSign); - tmp[@"icon-ok-sign"] = @(FAIconOkSign); - tmp[@"icon-question-sign"] = @(FAIconQuestionSign); - tmp[@"icon-info-sign"] = @(FAIconInfoSign); - tmp[@"icon-screenshot"] = @(FAIconScreenshot); - tmp[@"icon-remove-circle"] = @(FAIconRemoveCircle); - tmp[@"icon-ok-circle"] = @(FAIconOkCircle); - tmp[@"icon-ban-circle"] = @(FAIconBanCircle); - tmp[@"icon-arrow-left"] = @(FAIconArrowLeft); - tmp[@"icon-arrow-right"] = @(FAIconArrowRight); - tmp[@"icon-arrow-up"] = @(FAIconArrowUp); - tmp[@"icon-arrow-down"] = @(FAIconArrowDown); - tmp[@"icon-share-alt"] = @(FAIconShareAlt); - tmp[@"icon-resize-full"] = @(FAIconResizeFull); - tmp[@"icon-resize-small"] = @(FAIconResizeSmall); - tmp[@"icon-plus"] = @(FAIconPlus); - tmp[@"icon-minus"] = @(FAIconMinus); - tmp[@"icon-asterisk"] = @(FAIconAsterisk); - tmp[@"icon-exclamation-sign"] = @(FAIconExclamationSign); - tmp[@"icon-gift"] = @(FAIconGift); - tmp[@"icon-leaf"] = @(FAIconLeaf); - tmp[@"icon-fire"] = @(FAIconFire); - tmp[@"icon-eye-open"] = @(FAIconEyeOpen); - tmp[@"icon-eye-close"] = @(FAIconEyeClose); - tmp[@"icon-warning-sign"] = @(FAIconWarningSign); - tmp[@"icon-plane"] = @(FAIconPlane); - tmp[@"icon-calendar"] = @(FAIconCalendar); - tmp[@"icon-random"] = @(FAIconRandom); - tmp[@"icon-comment"] = @(FAIconComment); - tmp[@"icon-magnet"] = @(FAIconMagnet); - tmp[@"icon-chevron-up"] = @(FAIconChevronUp); - tmp[@"icon-chevron-down"] = @(FAIconChevronDown); - tmp[@"icon-retweet"] = @(FAIconRetweet); - tmp[@"icon-shopping-cart"] = @(FAIconShoppingCart); - tmp[@"icon-folder-close"] = @(FAIconFolderClose); - tmp[@"icon-folder-open"] = @(FAIconFolderOpen); - tmp[@"icon-resize-vertical"] = @(FAIconResizeVertical); - tmp[@"icon-resize-horizontal"] = @(FAIconResizeHorizontal); - tmp[@"icon-bar-chart"] = @(FAIconBarChart); - tmp[@"icon-twitter-sign"] = @(FAIconTwitterSign); - tmp[@"icon-facebook-sign"] = @(FAIconFacebookSign); - tmp[@"icon-camera-retro"] = @(FAIconCameraRetro); - tmp[@"icon-key"] = @(FAIconKey); - tmp[@"icon-cogs"] = @(FAIconCogs); - tmp[@"icon-comments"] = @(FAIconComments); - tmp[@"icon-thumbs-up"] = @(FAIconThumbsUp); - tmp[@"icon-thumbs-down"] = @(FAIconThumbsDown); - tmp[@"icon-star-half"] = @(FAIconStarHalf); - tmp[@"icon-heart-empty"] = @(FAIconHeartEmpty); - tmp[@"icon-signout"] = @(FAIconSignout); - tmp[@"icon-linkedin-sign"] = @(FAIconLinkedinSign); - tmp[@"icon-pushpin"] = @(FAIconPushpin); - tmp[@"icon-external-link"] = @(FAIconExternalLink); - tmp[@"icon-signin"] = @(FAIconSignin); - tmp[@"icon-trophy"] = @(FAIconTrophy); - tmp[@"icon-github-sign"] = @(FAIconGithubSign); - tmp[@"icon-upload-alt"] = @(FAIconUploadAlt); - tmp[@"icon-lemon"] = @(FAIconLemon); - tmp[@"icon-phone"] = @(FAIconPhone); - tmp[@"icon-check-empty"] = @(FAIconCheckEmpty); - tmp[@"icon-bookmark-empty"] = @(FAIconBookmarkEmpty); - tmp[@"icon-phone-sign"] = @(FAIconPhoneSign); - tmp[@"icon-twitter"] = @(FAIconTwitter); - tmp[@"icon-facebook"] = @(FAIconFacebook); - tmp[@"icon-github"] = @(FAIconGithub); - tmp[@"icon-unlock"] = @(FAIconUnlock); - tmp[@"icon-credit-card"] = @(FAIconCreditCard); - tmp[@"icon-rss"] = @(FAIconRss); - tmp[@"icon-hdd"] = @(FAIconHdd); - tmp[@"icon-bullhorn"] = @(FAIconBullhorn); - tmp[@"icon-bell"] = @(FAIconBell); - tmp[@"icon-certificate"] = @(FAIconCertificate); - tmp[@"icon-hand-right"] = @(FAIconHandRight); - tmp[@"icon-hand-left"] = @(FAIconHandLeft); - tmp[@"icon-hand-up"] = @(FAIconHandUp); - tmp[@"icon-hand-down"] = @(FAIconHandDown); - tmp[@"icon-circle-arrow-left"] = @(FAIconCircleArrowLeft); - tmp[@"icon-circle-arrow-right"] = @(FAIconCircleArrowRight); - tmp[@"icon-circle-arrow-up"] = @(FAIconCircleArrowUp); - tmp[@"icon-circle-arrow-down"] = @(FAIconCircleArrowDown); - tmp[@"icon-globe"] = @(FAIconGlobe); - tmp[@"icon-wrench"] = @(FAIconWrench); - tmp[@"icon-tasks"] = @(FAIconTasks); - tmp[@"icon-filter"] = @(FAIconFilter); - tmp[@"icon-briefcase"] = @(FAIconBriefcase); - tmp[@"icon-fullscreen"] = @(FAIconFullscreen); - tmp[@"icon-group"] = @(FAIconGroup); - tmp[@"icon-link"] = @(FAIconLink); - tmp[@"icon-cloud"] = @(FAIconCloud); - tmp[@"icon-beaker"] = @(FAIconBeaker); - tmp[@"icon-cut"] = @(FAIconCut); - tmp[@"icon-copy"] = @(FAIconCopy); - tmp[@"icon-paper-clip"] = @(FAIconPaperClip); - tmp[@"icon-save"] = @(FAIconSave); - tmp[@"icon-sign-blank"] = @(FAIconSignBlank); - tmp[@"icon-reorder"] = @(FAIconReorder); - tmp[@"icon-list-ul"] = @(FAIconListUl); - tmp[@"icon-list-ol"] = @(FAIconListOl); - tmp[@"icon-strikethrough"] = @(FAIconStrikethrough); - tmp[@"icon-underline"] = @(FAIconUnderline); - tmp[@"icon-table"] = @(FAIconTable); - tmp[@"icon-magic"] = @(FAIconMagic); - tmp[@"icon-truck"] = @(FAIconTruck); - tmp[@"icon-pinterest"] = @(FAIconPinterest); - tmp[@"icon-pinterest-sign"] = @(FAIconPinterestSign); - tmp[@"icon-google-plus-sign"] = @(FAIconGooglePlusSign); - tmp[@"icon-google-plus"] = @(FAIconGooglePlus); - tmp[@"icon-money"] = @(FAIconMoney); - tmp[@"icon-caret-down"] = @(FAIconCaretDown); - tmp[@"icon-caret-up"] = @(FAIconCaretUp); - tmp[@"icon-caret-left"] = @(FAIconCaretLeft); - tmp[@"icon-caret-right"] = @(FAIconCaretRight); - tmp[@"icon-columns"] = @(FAIconColumns); - tmp[@"icon-sort"] = @(FAIconSort); - tmp[@"icon-sort-down"] = @(FAIconSortDown); - tmp[@"icon-sort-up"] = @(FAIconSortUp); - tmp[@"icon-envelope-alt"] = @(FAIconEnvelopeAlt); - tmp[@"icon-linkedin"] = @(FAIconLinkedin); - tmp[@"icon-undo"] = @(FAIconUndo); - tmp[@"icon-legal"] = @(FAIconLegal); - tmp[@"icon-dashboard"] = @(FAIconDashboard); - tmp[@"icon-comment-alt"] = @(FAIconCommentAlt); - tmp[@"icon-comments-alt"] = @(FAIconCommentsAlt); - tmp[@"icon-bolt"] = @(FAIconBolt); - tmp[@"icon-sitemap"] = @(FAIconSitemap); - tmp[@"icon-umbrella"] = @(FAIconUmbrella); - tmp[@"icon-paste"] = @(FAIconPaste); - tmp[@"icon-user-md"] = @(FAIconUserMd); - tmp[@"icon-stethoscope"] = @(FAIconStethoscope); - tmp[@"icon-building"] = @(FAIconBuilding); - tmp[@"icon-hospital"] = @(FAIconHospital); - tmp[@"icon-ambulance"] = @(FAIconAmbulance); - tmp[@"icon-medkit"] = @(FAIconMedkit); - tmp[@"icon-h-sign"] = @(FAIconHSign); - tmp[@"icon-plus-sign-alt"] = @(FAIconPlusSignAlt); - tmp[@"icon-spinner"] = @(FAIconSpinner); - tmp[@"icon-cloud-download"] = @(FAIconCloudDownload); - tmp[@"icon-cloud-upload"] = @(FAIconCloudUpload); - tmp[@"icon-lightbulb"] = @(FAIconLightbulb); - tmp[@"icon-exchange"] = @(FAIconExchange); - tmp[@"icon-bell-alt"] = @(FAIconBellAlt); - tmp[@"icon-file-alt"] = @(FAIconFileAlt); - tmp[@"icon-beer"] = @(FAIconBeer); - tmp[@"icon-coffee"] = @(FAIconCoffee); - tmp[@"icon-food"] = @(FAIconFood); - tmp[@"icon-fighter-jet"] = @(FAIconFighterJet); - tmp[@"icon-angle-left"] = @(FAIconAngleLeft); - tmp[@"icon-angle-right"] = @(FAIconAngleRight); - tmp[@"icon-angle-up"] = @(FAIconAngleUp); - tmp[@"icon-angle-down"] = @(FAIconAngleDown); - tmp[@"icon-double-angle-left"] = @(FAIconDoubleAngleLeft); - tmp[@"icon-double-angle-right"] = @(FAIconDoubleAngleRight); - tmp[@"icon-double-angle-up"] = @(FAIconDoubleAngleUp); - tmp[@"icon-double-angle-down"] = @(FAIconDoubleAngleDown); - tmp[@"icon-circle-blank"] = @(FAIconCircleBlank); - tmp[@"icon-circle"] = @(FAIconCircle); - tmp[@"icon-desktop"] = @(FAIconDesktop); - tmp[@"icon-laptop"] = @(FAIconLaptop); - tmp[@"icon-tablet"] = @(FAIconTablet); - tmp[@"icon-mobile-phone"] = @(FAIconMobilePhone); - tmp[@"icon-quote-left"] = @(FAIconQuoteLeft); - tmp[@"icon-quote-right"] = @(FAIconQuoteRight); - tmp[@"icon-reply"] = @(FAIconReply); - tmp[@"icon-github-alt"] = @(FAIconGithubAlt); - tmp[@"icon-close-alt"] = @(FAIconFolderCloseAlt); - tmp[@"icon-folder-open-alt"] = @(FAIconFolderOpenAlt); - tmp[@"icon-suitcase"] = @(FAIconSuitcase); + + tmp[@"fa-glass"] = @(FAGlass); + tmp[@"fa-music"] = @(FAMusic); + tmp[@"fa-search"] = @(FASearch); + tmp[@"fa-envelope-o"] = @(FAEnvelopeO); + tmp[@"fa-heart"] = @(FAHeart); + tmp[@"fa-star"] = @(FAStar); + tmp[@"fa-star-o"] = @(FAStarO); + tmp[@"fa-user"] = @(FAUser); + tmp[@"fa-film"] = @(FAFilm); + tmp[@"fa-th-large"] = @(FAThLarge); + tmp[@"fa-th"] = @(FATh); + tmp[@"fa-th-list"] = @(FAThList); + tmp[@"fa-check"] = @(FACheck); + tmp[@"fa-times"] = @(FATimes); + tmp[@"fa-search-plus"] = @(FASearchPlus); + tmp[@"fa-search-minus"] = @(FASearchMinus); + tmp[@"fa-power-off"] = @(FAPowerOff); + tmp[@"fa-signal"] = @(FASignal); + tmp[@"fa-cog"] = @(FACog); + tmp[@"fa-trash-o"] = @(FATrashO); + tmp[@"fa-home"] = @(FAHome); + tmp[@"fa-file-o"] = @(FAFileO); + tmp[@"fa-clock-o"] = @(FAClockO); + tmp[@"fa-road"] = @(FARoad); + tmp[@"fa-download"] = @(FADownload); + tmp[@"fa-arrow-circle-o-down"] = @(FAArrowCircleODown); + tmp[@"fa-arrow-circle-o-up"] = @(FAArrowCircleOUp); + tmp[@"fa-inbox"] = @(FAInbox); + tmp[@"fa-play-circle-o"] = @(FAPlayCircleO); + tmp[@"fa-repeat"] = @(FARepeat); + tmp[@"fa-refresh"] = @(FARefresh); + tmp[@"fa-list-alt"] = @(FAListAlt); + tmp[@"fa-lock"] = @(FALock); + tmp[@"fa-flag"] = @(FAFlag); + tmp[@"fa-headphones"] = @(FAHeadphones); + tmp[@"fa-volume-off"] = @(FAVolumeOff); + tmp[@"fa-volume-down"] = @(FAVolumeDown); + tmp[@"fa-volume-up"] = @(FAVolumeUp); + tmp[@"fa-qrcode"] = @(FAQrcode); + tmp[@"fa-barcode"] = @(FABarcode); + tmp[@"fa-tag"] = @(FATag); + tmp[@"fa-tags"] = @(FATags); + tmp[@"fa-book"] = @(FABook); + tmp[@"fa-bookmark"] = @(FABookmark); + tmp[@"fa-print"] = @(FAPrint); + tmp[@"fa-camera"] = @(FACamera); + tmp[@"fa-font"] = @(FAFont); + tmp[@"fa-bold"] = @(FABold); + tmp[@"fa-italic"] = @(FAItalic); + tmp[@"fa-text-height"] = @(FATextHeight); + tmp[@"fa-text-width"] = @(FATextWidth); + tmp[@"fa-align-left"] = @(FAAlignLeft); + tmp[@"fa-align-center"] = @(FAAlignCenter); + tmp[@"fa-align-right"] = @(FAAlignRight); + tmp[@"fa-align-justify"] = @(FAAlignJustify); + tmp[@"fa-list"] = @(FAList); + tmp[@"fa-outdent"] = @(FAOutdent); + tmp[@"fa-indent"] = @(FAIndent); + tmp[@"fa-video-camera"] = @(FAVideoCamera); + tmp[@"fa-picture-o"] = @(FAPictureO); + tmp[@"fa-pencil"] = @(FAPencil); + tmp[@"fa-map-marker"] = @(FAMapMarker); + tmp[@"fa-adjust"] = @(FAAdjust); + tmp[@"fa-tint"] = @(FATint); + tmp[@"fa-pencil-square-o"] = @(FAPencilSquareO); + tmp[@"fa-share-square-o"] = @(FAShareSquareO); + tmp[@"fa-check-square-o"] = @(FACheckSquareO); + tmp[@"fa-arrows"] = @(FAArrows); + tmp[@"fa-step-backward"] = @(FAStepBackward); + tmp[@"fa-fast-backward"] = @(FAFastBackward); + tmp[@"fa-backward"] = @(FABackward); + tmp[@"fa-play"] = @(FAPlay); + tmp[@"fa-pause"] = @(FAPause); + tmp[@"fa-stop"] = @(FAStop); + tmp[@"fa-forward"] = @(FAForward); + tmp[@"fa-fast-forward"] = @(FAFastForward); + tmp[@"fa-step-forward"] = @(FAStepForward); + tmp[@"fa-eject"] = @(FAEject); + tmp[@"fa-chevron-left"] = @(FAChevronLeft); + tmp[@"fa-chevron-right"] = @(FAChevronRight); + tmp[@"fa-plus-circle"] = @(FAPlusCircle); + tmp[@"fa-minus-circle"] = @(FAMinusCircle); + tmp[@"fa-times-circle"] = @(FATimesCircle); + tmp[@"fa-check-circle"] = @(FACheckCircle); + tmp[@"fa-question-circle"] = @(FAQuestionCircle); + tmp[@"fa-info-circle"] = @(FAInfoCircle); + tmp[@"fa-crosshairs"] = @(FACrosshairs); + tmp[@"fa-times-circle-o"] = @(FATimesCircleO); + tmp[@"fa-check-circle-o"] = @(FACheckCircleO); + tmp[@"fa-ban"] = @(FABan); + tmp[@"fa-arrow-left"] = @(FAArrowLeft); + tmp[@"fa-arrow-right"] = @(FAArrowRight); + tmp[@"fa-arrow-up"] = @(FAArrowUp); + tmp[@"fa-arrow-down"] = @(FAArrowDown); + tmp[@"fa-share"] = @(FAShare); + tmp[@"fa-expand"] = @(FAExpand); + tmp[@"fa-compress"] = @(FACompress); + tmp[@"fa-plus"] = @(FAPlus); + tmp[@"fa-minus"] = @(FAMinus); + tmp[@"fa-asterisk"] = @(FAAsterisk); + tmp[@"fa-exclamation-circle"] = @(FAExclamationCircle); + tmp[@"fa-gift"] = @(FAGift); + tmp[@"fa-leaf"] = @(FALeaf); + tmp[@"fa-fire"] = @(FAFire); + tmp[@"fa-eye"] = @(FAEye); + tmp[@"fa-eye-slash"] = @(FAEyeSlash); + tmp[@"fa-exclamation-triangle"] = @(FAExclamationTriangle); + tmp[@"fa-plane"] = @(FAPlane); + tmp[@"fa-calendar"] = @(FACalendar); + tmp[@"fa-random"] = @(FARandom); + tmp[@"fa-comment"] = @(FAComment); + tmp[@"fa-magnet"] = @(FAMagnet); + tmp[@"fa-chevron-up"] = @(FAChevronUp); + tmp[@"fa-chevron-down"] = @(FAChevronDown); + tmp[@"fa-retweet"] = @(FARetweet); + tmp[@"fa-shopping-cart"] = @(FAShoppingCart); + tmp[@"fa-folder"] = @(FAFolder); + tmp[@"fa-folder-open"] = @(FAFolderOpen); + tmp[@"fa-arrows-v"] = @(FAArrowsV); + tmp[@"fa-arrows-h"] = @(FAArrowsH); + tmp[@"fa-bar-chart-o"] = @(FABarChartO); + tmp[@"fa-twitter-square"] = @(FATwitterSquare); + tmp[@"fa-facebook-square"] = @(FAFacebookSquare); + tmp[@"fa-camera-retro"] = @(FACameraRetro); + tmp[@"fa-key"] = @(FAKey); + tmp[@"fa-cogs"] = @(FACogs); + tmp[@"fa-comments"] = @(FAComments); + tmp[@"fa-thumbs-o-up"] = @(FAThumbsOUp); + tmp[@"fa-thumbs-o-down"] = @(FAThumbsODown); + tmp[@"fa-star-half"] = @(FAStarHalf); + tmp[@"fa-heart-o"] = @(FAHeartO); + tmp[@"fa-sign-out"] = @(FASignOut); + tmp[@"fa-linkedin-square"] = @(FALinkedinSquare); + tmp[@"fa-thumb-tack"] = @(FAThumbTack); + tmp[@"fa-external-link"] = @(FAExternalLink); + tmp[@"fa-sign-in"] = @(FASignIn); + tmp[@"fa-trophy"] = @(FATrophy); + tmp[@"fa-github-square"] = @(FAGithubSquare); + tmp[@"fa-upload"] = @(FAUpload); + tmp[@"fa-lemon-o"] = @(FALemonO); + tmp[@"fa-phone"] = @(FAPhone); + tmp[@"fa-square-o"] = @(FASquareO); + tmp[@"fa-bookmark-o"] = @(FABookmarkO); + tmp[@"fa-phone-square"] = @(FAPhoneSquare); + tmp[@"fa-twitter"] = @(FATwitter); + tmp[@"fa-facebook"] = @(FAFacebook); + tmp[@"fa-github"] = @(FAGithub); + tmp[@"fa-unlock"] = @(FAUnlock); + tmp[@"fa-credit-card"] = @(FACreditCard); + tmp[@"fa-rss"] = @(FARss); + tmp[@"fa-hdd-o"] = @(FAHddO); + tmp[@"fa-bullhorn"] = @(FABullhorn); + tmp[@"fa-bell"] = @(FABell); + tmp[@"fa-certificate"] = @(FACertificate); + tmp[@"fa-hand-o-right"] = @(FAHandORight); + tmp[@"fa-hand-o-left"] = @(FAHandOLeft); + tmp[@"fa-hand-o-up"] = @(FAHandOUp); + tmp[@"fa-hand-o-down"] = @(FAHandODown); + tmp[@"fa-arrow-circle-left"] = @(FAArrowCircleLeft); + tmp[@"fa-arrow-circle-right"] = @(FAArrowCircleRight); + tmp[@"fa-arrow-circle-up"] = @(FAArrowCircleUp); + tmp[@"fa-arrow-circle-down"] = @(FAArrowCircleDown); + tmp[@"fa-globe"] = @(FAGlobe); + tmp[@"fa-wrench"] = @(FAWrench); + tmp[@"fa-tasks"] = @(FATasks); + tmp[@"fa-filter"] = @(FAFilter); + tmp[@"fa-briefcase"] = @(FABriefcase); + tmp[@"fa-arrows-alt"] = @(FAArrowsAlt); + tmp[@"fa-users"] = @(FAUsers); + tmp[@"fa-link"] = @(FALink); + tmp[@"fa-cloud"] = @(FACloud); + tmp[@"fa-flask"] = @(FAFlask); + tmp[@"fa-scissors"] = @(FAScissors); + tmp[@"fa-files-o"] = @(FAFilesO); + tmp[@"fa-paperclip"] = @(FAPaperclip); + tmp[@"fa-floppy-o"] = @(FAFloppyO); + tmp[@"fa-square"] = @(FASquare); + tmp[@"fa-bars"] = @(FABars); + tmp[@"fa-list-ul"] = @(FAListUl); + tmp[@"fa-list-ol"] = @(FAListOl); + tmp[@"fa-strikethrough"] = @(FAStrikethrough); + tmp[@"fa-underline"] = @(FAUnderline); + tmp[@"fa-table"] = @(FATable); + tmp[@"fa-magic"] = @(FAMagic); + tmp[@"fa-truck"] = @(FATruck); + tmp[@"fa-pinterest"] = @(FAPinterest); + tmp[@"fa-pinterest-square"] = @(FAPinterestSquare); + tmp[@"fa-google-plus-square"] = @(FAGooglePlusSquare); + tmp[@"fa-google-plus"] = @(FAGooglePlus); + tmp[@"fa-money"] = @(FAMoney); + tmp[@"fa-caret-down"] = @(FACaretDown); + tmp[@"fa-caret-up"] = @(FACaretUp); + tmp[@"fa-caret-left"] = @(FACaretLeft); + tmp[@"fa-caret-right"] = @(FACaretRight); + tmp[@"fa-columns"] = @(FAColumns); + tmp[@"fa-sort"] = @(FASort); + tmp[@"fa-sort-asc"] = @(FASortAsc); + tmp[@"fa-sort-desc"] = @(FASortDesc); + tmp[@"fa-envelope"] = @(FAEnvelope); + tmp[@"fa-linkedin"] = @(FALinkedin); + tmp[@"fa-undo"] = @(FAUndo); + tmp[@"fa-gavel"] = @(FAGavel); + tmp[@"fa-tachometer"] = @(FATachometer); + tmp[@"fa-comment-o"] = @(FACommentO); + tmp[@"fa-comments-o"] = @(FACommentsO); + tmp[@"fa-bolt"] = @(FABolt); + tmp[@"fa-sitemap"] = @(FASitemap); + tmp[@"fa-umbrella"] = @(FAUmbrella); + tmp[@"fa-clipboard"] = @(FAClipboard); + tmp[@"fa-lightbulb-o"] = @(FALightbulbO); + tmp[@"fa-exchange"] = @(FAExchange); + tmp[@"fa-cloud-download"] = @(FACloudDownload); + tmp[@"fa-cloud-upload"] = @(FACloudUpload); + tmp[@"fa-user-md"] = @(FAUserMd); + tmp[@"fa-stethoscope"] = @(FAStethoscope); + tmp[@"fa-suitcase"] = @(FASuitcase); + tmp[@"fa-bell-o"] = @(FABellO); + tmp[@"fa-coffee"] = @(FACoffee); + tmp[@"fa-cutlery"] = @(FACutlery); + tmp[@"fa-file-text-o"] = @(FAFileTextO); + tmp[@"fa-building-o"] = @(FABuildingO); + tmp[@"fa-hospital-o"] = @(FAHospitalO); + tmp[@"fa-ambulance"] = @(FAAmbulance); + tmp[@"fa-medkit"] = @(FAMedkit); + tmp[@"fa-fighter-jet"] = @(FAFighterJet); + tmp[@"fa-beer"] = @(FABeer); + tmp[@"fa-h-square"] = @(FAHSquare); + tmp[@"fa-plus-square"] = @(FAPlusSquare); + tmp[@"fa-angle-double-left"] = @(FAAngleDoubleLeft); + tmp[@"fa-angle-double-right"] = @(FAAngleDoubleRight); + tmp[@"fa-angle-double-up"] = @(FAAngleDoubleUp); + tmp[@"fa-angle-double-down"] = @(FAAngleDoubleDown); + tmp[@"fa-angle-left"] = @(FAAngleLeft); + tmp[@"fa-angle-right"] = @(FAAngleRight); + tmp[@"fa-angle-up"] = @(FAAngleUp); + tmp[@"fa-angle-down"] = @(FAAngleDown); + tmp[@"fa-desktop"] = @(FADesktop); + tmp[@"fa-laptop"] = @(FALaptop); + tmp[@"fa-tablet"] = @(FATablet); + tmp[@"fa-mobile"] = @(FAMobile); + tmp[@"fa-circle-o"] = @(FACircleO); + tmp[@"fa-quote-left"] = @(FAQuoteLeft); + tmp[@"fa-quote-right"] = @(FAQuoteRight); + tmp[@"fa-spinner"] = @(FASpinner); + tmp[@"fa-circle"] = @(FACircle); + tmp[@"fa-reply"] = @(FAReply); + tmp[@"fa-github-alt"] = @(FAGithubAlt); + tmp[@"fa-folder-o"] = @(FAFolderO); + tmp[@"fa-folder-open-o"] = @(FAFolderOpenO); + tmp[@"fa-smile-o"] = @(FASmileO); + tmp[@"fa-frown-o"] = @(FAFrownO); + tmp[@"fa-meh-o"] = @(FAMehO); + tmp[@"fa-gamepad"] = @(FAGamepad); + tmp[@"fa-keyboard-o"] = @(FAKeyboardO); + tmp[@"fa-flag-o"] = @(FAFlagO); + tmp[@"fa-flag-checkered"] = @(FAFlagCheckered); + tmp[@"fa-terminal"] = @(FATerminal); + tmp[@"fa-code"] = @(FACode); + tmp[@"fa-reply-all"] = @(FAReplyAll); + tmp[@"fa-mail-reply-all"] = @(FAMailReplyAll); + tmp[@"fa-star-half-o"] = @(FAStarHalfO); + tmp[@"fa-location-arrow"] = @(FALocationArrow); + tmp[@"fa-crop"] = @(FACrop); + tmp[@"fa-code-fork"] = @(FACodeFork); + tmp[@"fa-chain-broken"] = @(FAChainBroken); + tmp[@"fa-question"] = @(FAQuestion); + tmp[@"fa-info"] = @(FAInfo); + tmp[@"fa-exclamation"] = @(FAExclamation); + tmp[@"fa-superscript"] = @(FASuperscript); + tmp[@"fa-subscript"] = @(FASubscript); + tmp[@"fa-eraser"] = @(FAEraser); + tmp[@"fa-puzzle-piece"] = @(FAPuzzlePiece); + tmp[@"fa-microphone"] = @(FAMicrophone); + tmp[@"fa-microphone-slash"] = @(FAMicrophoneSlash); + tmp[@"fa-shield"] = @(FAShield); + tmp[@"fa-calendar-o"] = @(FACalendarO); + tmp[@"fa-fire-extinguisher"] = @(FAFireExtinguisher); + tmp[@"fa-rocket"] = @(FARocket); + tmp[@"fa-maxcdn"] = @(FAMaxcdn); + tmp[@"fa-chevron-circle-left"] = @(FAChevronCircleLeft); + tmp[@"fa-chevron-circle-right"] = @(FAChevronCircleRight); + tmp[@"fa-chevron-circle-up"] = @(FAChevronCircleUp); + tmp[@"fa-chevron-circle-down"] = @(FAChevronCircleDown); + tmp[@"fa-html5"] = @(FAHtml5); + tmp[@"fa-css3"] = @(FACss3); + tmp[@"fa-anchor"] = @(FAAnchor); + tmp[@"fa-unlock-alt"] = @(FAUnlockAlt); + tmp[@"fa-bullseye"] = @(FABullseye); + tmp[@"fa-ellipsis-h"] = @(FAEllipsisH); + tmp[@"fa-ellipsis-v"] = @(FAEllipsisV); + tmp[@"fa-rss-square"] = @(FARssSquare); + tmp[@"fa-play-circle"] = @(FAPlayCircle); + tmp[@"fa-ticket"] = @(FATicket); + tmp[@"fa-minus-square"] = @(FAMinusSquare); + tmp[@"fa-minus-square-o"] = @(FAMinusSquareO); + tmp[@"fa-level-up"] = @(FALevelUp); + tmp[@"fa-level-down"] = @(FALevelDown); + tmp[@"fa-check-square"] = @(FACheckSquare); + tmp[@"fa-pencil-square"] = @(FAPencilSquare); + tmp[@"fa-external-link-square"] = @(FAExternalLinkSquare); + tmp[@"fa-share-square"] = @(FAShareSquare); + tmp[@"fa-compass"] = @(FACompass); + tmp[@"fa-caret-square-o-down"] = @(FACaretSquareODown); + tmp[@"fa-caret-square-o-up"] = @(FACaretSquareOUp); + tmp[@"fa-caret-square-o-right"] = @(FACaretSquareORight); + tmp[@"fa-eur"] = @(FAEur); + tmp[@"fa-gbp"] = @(FAGbp); + tmp[@"fa-usd"] = @(FAUsd); + tmp[@"fa-inr"] = @(FAInr); + tmp[@"fa-jpy"] = @(FAJpy); + tmp[@"fa-rub"] = @(FARub); + tmp[@"fa-krw"] = @(FAKrw); + tmp[@"fa-btc"] = @(FABtc); + tmp[@"fa-file"] = @(FAFile); + tmp[@"fa-file-text"] = @(FAFileText); + tmp[@"fa-sort-alpha-asc"] = @(FASortAlphaAsc); + tmp[@"fa-sort-alpha-desc"] = @(FASortAlphaDesc); + tmp[@"fa-sort-amount-asc"] = @(FASortAmountAsc); + tmp[@"fa-sort-amount-desc"] = @(FASortAmountDesc); + tmp[@"fa-sort-numeric-asc"] = @(FASortNumericAsc); + tmp[@"fa-sort-numeric-desc"] = @(FASortNumericDesc); + tmp[@"fa-thumbs-up"] = @(FAThumbsUp); + tmp[@"fa-thumbs-down"] = @(FAThumbsDown); + tmp[@"fa-youtube-square"] = @(FAYoutubeSquare); + tmp[@"fa-youtube"] = @(FAYoutube); + tmp[@"fa-xing"] = @(FAXing); + tmp[@"fa-xing-square"] = @(FAXingSquare); + tmp[@"fa-youtube-play"] = @(FAYoutubePlay); + tmp[@"fa-dropbox"] = @(FADropbox); + tmp[@"fa-stack-overflow"] = @(FAStackOverflow); + tmp[@"fa-instagram"] = @(FAInstagram); + tmp[@"fa-flickr"] = @(FAFlickr); + tmp[@"fa-adn"] = @(FAAdn); + tmp[@"fa-bitbucket"] = @(FABitbucket); + tmp[@"fa-bitbucket-square"] = @(FABitbucketSquare); + tmp[@"fa-tumblr"] = @(FATumblr); + tmp[@"fa-tumblr-square"] = @(FATumblrSquare); + tmp[@"fa-long-arrow-down"] = @(FALongArrowDown); + tmp[@"fa-long-arrow-up"] = @(FALongArrowUp); + tmp[@"fa-long-arrow-left"] = @(FALongArrowLeft); + tmp[@"fa-long-arrow-right"] = @(FALongArrowRight); + tmp[@"fa-apple"] = @(FAApple); + tmp[@"fa-windows"] = @(FAWindows); + tmp[@"fa-android"] = @(FAAndroid); + tmp[@"fa-linux"] = @(FALinux); + tmp[@"fa-dribbble"] = @(FADribbble); + tmp[@"fa-skype"] = @(FASkype); + tmp[@"fa-foursquare"] = @(FAFoursquare); + tmp[@"fa-trello"] = @(FATrello); + tmp[@"fa-female"] = @(FAFemale); + tmp[@"fa-male"] = @(FAMale); + tmp[@"fa-gittip"] = @(FAGittip); + tmp[@"fa-sun-o"] = @(FASunO); + tmp[@"fa-moon-o"] = @(FAMoonO); + tmp[@"fa-archive"] = @(FAArchive); + tmp[@"fa-bug"] = @(FABug); + tmp[@"fa-vk"] = @(FAVk); + tmp[@"fa-weibo"] = @(FAWeibo); + tmp[@"fa-renren"] = @(FARenren); + tmp[@"fa-pagelines"] = @(FAPagelines); + tmp[@"fa-stack-exchange"] = @(FAStackExchange); + tmp[@"fa-arrow-circle-o-right"] = @(FAArrowCircleORight); + tmp[@"fa-arrow-circle-o-left"] = @(FAArrowCircleOLeft); + tmp[@"fa-caret-square-o-left"] = @(FACaretSquareOLeft); + tmp[@"fa-dot-circle-o"] = @(FADotCircleO); + tmp[@"fa-wheelchair"] = @(FAWheelchair); + tmp[@"fa-vimeo-square"] = @(FAVimeoSquare); + tmp[@"fa-try"] = @(FATry); + tmp[@"fa-plus-square-o"] = @(FAPlusSquareO); + + /* FontAwesome ver 4.1.0 */ + tmp[@"fa-automobile"] = @(FAautomobile); + tmp[@"fa-bank"] = @(FAbank); + tmp[@"fa-behance"] = @(FAbehance); + tmp[@"fa-behance-square"] = @(FAbehanceSquare); + tmp[@"fa-bomb"] = @(FAbomb); + tmp[@"fa-building"] = @(FAbuilding); + tmp[@"fa-cab"] = @(FAcab); + tmp[@"fa-car"] = @(FAcar); + tmp[@"fa-child"] = @(FAchild); + tmp[@"fa-circle-o-notch"] = @(FAcircleONotch); + tmp[@"fa-circle-thin"] = @(FAcircleThin); + tmp[@"fa-codepen"] = @(FAcodepen); + tmp[@"fa-cube"] = @(FAcube); + tmp[@"fa-cubes"] = @(FAcubes); + tmp[@"fa-database"] = @(FAdatabase); + tmp[@"fa-delicious"] = @(FAdelicious); + tmp[@"fa-deviantart"] = @(FAdeviantart); + tmp[@"fa-digg"] = @(FAdigg); + tmp[@"fa-drupal"] = @(FAdrupal); + tmp[@"fa-empire"] = @(FAempire); + tmp[@"fa-envelope-square"] = @(FAenvelopeSquare); + tmp[@"fa-fax"] = @(FAfax); + tmp[@"fa-file-archive-o"] = @(FAfileArchiveO); + tmp[@"fa-file-audio-o"] = @(FAfileAudioO); + tmp[@"fa-file-code-o"] = @(FAfileCodeO); + tmp[@"fa-file-excel-o"] = @(FAfileExcelO); + tmp[@"fa-file-image-o"] = @(FAfileImageO); + tmp[@"fa-file-movie-o"] = @(FAfileMovieO); + tmp[@"fa-file-pdf-o"] = @(FAfilePdfO); + tmp[@"fa-file-photo-o"] = @(FAfilePhotoO); + tmp[@"fa-file-picture-o"] = @(FAfilePictureO); + tmp[@"fa-file-powerpoint-o"] = @(FAfilePowerpointO); + tmp[@"fa-file-sound-o"] = @(FAfileSoundO); + tmp[@"fa-file-video-o"] = @(FAfileVideoO); + tmp[@"fa-file-word-o"] = @(FAfileWordO); + tmp[@"fa-file-zip-o"] = @(FAfileZipO); + tmp[@"fa-ge"] = @(FAge); + tmp[@"fa-git"] = @(FAgit); + tmp[@"fa-git-square"] = @(FAgitSquare); + tmp[@"fa-google"] = @(FAgoogle); + tmp[@"fa-graduation-cap"] = @(FAgraduationCap); + tmp[@"fa-hacker-news"] = @(FAhackerNews); + tmp[@"fa-header"] = @(FAheader); + tmp[@"fa-history"] = @(FAhistory); + tmp[@"fa-institution"] = @(FAinstitution); + tmp[@"fa-joomla"] = @(FAjoomla); + tmp[@"fa-jsfiddle"] = @(FAjsfiddle); + tmp[@"fa-language"] = @(FAlanguage); + tmp[@"fa-life-bouy"] = @(FAlifeBouy); + tmp[@"fa-life-ring"] = @(FAlifeRing); + tmp[@"fa-life-saver"] = @(FAlifeSaver); + tmp[@"fa-mortar-board"] = @(FAmortarBoard); + tmp[@"fa-openid"] = @(FAopenid); + tmp[@"fa-paper-plane"] = @(FApaperPlane); + tmp[@"fa-paper-plane-o"] = @(FApaperPlaneO); + tmp[@"fa-paragraph"] = @(FAparagraph); + tmp[@"fa-paw"] = @(FApaw); + tmp[@"fa-pied-piper"] = @(FApiedPiper); + tmp[@"fa-pied-piper-alt"] = @(FApiedPiperalt); + tmp[@"fa-pied-piper-square"] = @(FApiedPipersquare); + tmp[@"fa-qq"] = @(FAqq); + tmp[@"fa-ra"] = @(FAra); + tmp[@"fa-rebel"] = @(FArebel); + tmp[@"fa-recycle"] = @(FArecycle); + tmp[@"fa-reddit"] = @(FAreddit); + tmp[@"fa-reddit-square"] = @(FAredditSquare); + tmp[@"fa-send"] = @(FAsend); + tmp[@"fa-send-o"] = @(FAsendO); + tmp[@"fa-share-alt"] = @(FAshareAlt); + tmp[@"fa-share-alt-square"] = @(FAshareAltSquare); + tmp[@"fa-slack"] = @(FAslack); + tmp[@"fa-sliders"] = @(FAsliders); + tmp[@"fa-soundcloud"] = @(FAsoundcloud); + tmp[@"fa-space-shuttle"] = @(FAspaceShuttle); + tmp[@"fa-spoon"] = @(FAspoon); + tmp[@"fa-spotify"] = @(FAspotify); + tmp[@"fa-steam"] = @(FAsteam); + tmp[@"fa-steam-square"] = @(FAsteamSquare); + tmp[@"fa-stumbleupon"] = @(FAstumbleupon); + tmp[@"fa-stumbleupon-circle"] = @(FAstumbleuponCircle); + tmp[@"fa-support"] = @(FAsupport); + tmp[@"fa-taxi"] = @(FAtaxi); + tmp[@"fa-tencent-weibo"] = @(FAtencentWeibo); + tmp[@"fa-tree"] = @(FAtree); + tmp[@"fa-university"] = @(FAuniversity); + tmp[@"fa-vine"] = @(FAvine); + tmp[@"fa-wechat"] = @(FAwechat); + tmp[@"fa-weixin"] = @(FAweixin); + tmp[@"fa-wordpress"] = @(FAwordpress); + tmp[@"fa-yahoo"] = @(FAyahoo); + + /* FontAwesome ver 4.2.0 */ + tmp[@"fa-angellist"] = @(FAangellist); + tmp[@"fa-area-chart"] = @(FAareaChart); + tmp[@"fa-at"] = @(FAat); + tmp[@"fa-bell-slash"] = @(FAbellSlash); + tmp[@"fa-bell-slash-o"] = @(FAbellSlashO); + tmp[@"fa-bicycle"] = @(FAbicycle); + tmp[@"fa-binoculars"] = @(FAbinoculars); + tmp[@"fa-birthday-cake"] = @(FAbirthdayCake); + tmp[@"fa-bus"] = @(FAbus); + tmp[@"fa-calculator"] = @(FAcalculator); + tmp[@"fa-cc"] = @(FAcc); + tmp[@"fa-cc-amex"] = @(FAccAmex); + tmp[@"fa-cc-discover"] = @(FAccDiscover); + tmp[@"fa-cc-mastercard"] = @(FAccMastercard); + tmp[@"fa-cc-paypal"] = @(FAccPaypal); + tmp[@"fa-cc-stripe"] = @(FAccStripe); + tmp[@"fa-cc-visa"] = @(FAccVisa); + tmp[@"fa-copyright"] = @(FAcopyright); + tmp[@"fa-eyedropper"] = @(FAeyedropper); + tmp[@"fa-futbol-o"] = @(FAfutbolO); + tmp[@"fa-google-wallet"] = @(FAgoogleWallet); + tmp[@"fa-ils"] = @(FAils); + tmp[@"fa-ioxhost"] = @(FAioxhost); + tmp[@"fa-lastfm"] = @(FAlastfm); + tmp[@"fa-lastfm-square"] = @(FAlastfmSquare); + tmp[@"fa-line-chart"] = @(FAlineChart); + tmp[@"fa-meanpath"] = @(FAmeanpath); + tmp[@"fa-newspaper-o"] = @(FAnewspaperO); + tmp[@"fa-paint-brush"] = @(FApaintBrush); + tmp[@"fa-paypal"] = @(FApaypal); + tmp[@"fa-pie-chart"] = @(FApieChart); + tmp[@"fa-plug"] = @(FAplug); + tmp[@"fa-shekel"] = @(FAshekel); + tmp[@"fa-sheqel"] = @(FAsheqel); + tmp[@"fa-slideshare"] = @(FAslideshare); + tmp[@"fa-soccer-ball-o"] = @(FAsoccerBallO); + tmp[@"fa-toggle-off"] = @(FAtoggleOff); + tmp[@"fa-toggle-on"] = @(FAtoggleOn); + tmp[@"fa-trash"] = @(FAtrash); + tmp[@"fa-tty"] = @(FAtty); + tmp[@"fa-twitch"] = @(FAtwitch); + tmp[@"fa-wifi"] = @(FAwifi); + tmp[@"fa-yelp"] = @(FAyelp); + + /* FontAwesome ver 4.3.0 */ + tmp[@"fa-bed"] = @(FAbed); + tmp[@"fa-buysellads"] = @(FAbuysellads); + tmp[@"fa-cart-arrow-down"] = @(FAcartArrowDown); + tmp[@"fa-cart-plus"] = @(FAcartPlus); + tmp[@"fa-connectdevelop"] = @(FAconnectdevelop); + tmp[@"fa-dashcube"] = @(FAdashcube); + tmp[@"fa-diamond"] = @(FAdiamond); + tmp[@"fa-facebook-official"] = @(FAfacebookOfficial); + tmp[@"fa-forumbee"] = @(FAforumbee); + tmp[@"fa-heartbeat"] = @(FAheartbeat); + tmp[@"fa-hotel"] = @(FAhotel); + tmp[@"fa-leanpub"] = @(FAleanpub); + tmp[@"fa-mars"] = @(FAmars); + tmp[@"fa-mars-double"] = @(FAmarsDouble); + tmp[@"fa-mars-stroke"] = @(FAmarsStroke); + tmp[@"fa-mars-stroke-h"] = @(FAmarsStrokeH); + tmp[@"fa-mars-stroke-v"] = @(FAmarsStrokeV); + tmp[@"fa-medium"] = @(FAmedium); + tmp[@"fa-mercury"] = @(FAmercury); + tmp[@"fa-motorcycle"] = @(FAmotorcycle); + tmp[@"fa-neuter"] = @(FAneuter); + tmp[@"fa-pinterest-p"] = @(FApinterestP); + tmp[@"fa-sellsy"] = @(FAsellsy); + tmp[@"fa-server"] = @(FAserver); + tmp[@"fa-ship"] = @(FAship); + tmp[@"fa-shirtsinbulk"] = @(FAshirtsinbulk); + tmp[@"fa-simplybuilt"] = @(FAsimplybuilt); + tmp[@"fa-skyatlas"] = @(FAskyatlas); + tmp[@"fa-street-view"] = @(FAstreetView); + tmp[@"fa-subway"] = @(FAsubway); + tmp[@"fa-train"] = @(FAtrain); + tmp[@"fa-transgender"] = @(FAtransgender); + tmp[@"fa-transgender-alt"] = @(FAtransgenderAlt); + tmp[@"fa-user-plus"] = @(FAuserPlus); + tmp[@"fa-user-secret"] = @(FAuserSecret); + tmp[@"fa-user-times"] = @(FAuserTimes); + tmp[@"fa-venus"] = @(FAvenus); + tmp[@"fa-venus-double"] = @(FAvenusDouble); + tmp[@"fa-venus-mars"] = @(FAvenusMars); + tmp[@"fa-viacoin"] = @(FAviacoin); + + /* FontAwesome ver 4.4.0 */ + tmp[@"fa-500px"] = @(FA500px); + tmp[@"fa-amazon"] = @(FAamazon); + tmp[@"fa-balance-scale"] = @(FAbalanceScale); + tmp[@"fa-battery-empty"] = @(FAbatteryEmpty); + tmp[@"fa-battery-full"] = @(FAbatteryFull); + tmp[@"fa-battery-half"] = @(FAbatteryHalf); + tmp[@"fa-battery-quarter"] = @(FAbatteryQuarter); + tmp[@"fa-battery-three-quarters"] = @(FAbatteryThreeQuarters); + tmp[@"fa-black-tie"] = @(FAblackTie); + tmp[@"fa-calendar-check-o"] = @(FAcalendarCheckO); + tmp[@"fa-calendar-minus-o"] = @(FAcalendarMinusO); + tmp[@"fa-calendar-plus-o"] = @(FAcalendarPlusO); + tmp[@"fa-calendar-times-o"] = @(FAcalendarTimesO); + tmp[@"fa-cc-diners-club"] = @(FAccDinersClub); + tmp[@"fa-cc-jcb"] = @(FAccJcb); + tmp[@"fa-chrome"] = @(FAchrome); + tmp[@"fa-clone"] = @(FAclone); + tmp[@"fa-commenting"] = @(FAcommenting); + tmp[@"fa-commenting-o"] = @(FAcommentingO); + tmp[@"fa-contao"] = @(FAcontao); + tmp[@"fa-creative-commons"] = @(FAcreativeCommons); + tmp[@"fa-expeditedssl"] = @(FAexpeditedssl); + tmp[@"fa-firefox"] = @(FAfirefox); + tmp[@"fa-fonticons"] = @(FAfonticons); + tmp[@"fa-genderless"] = @(FAgenderless); + tmp[@"fa-get-pocket"] = @(FAgetPocket); + tmp[@"fa-gg"] = @(FAgg); + tmp[@"fa-gg-circle"] = @(FAggCircle); + tmp[@"fa-hand-lizard-o"] = @(FAhandLizardO); + tmp[@"fa-hand-paper-o"] = @(FAhandPaperO); + tmp[@"fa-hand-peace-o"] = @(FAhandPeaceO); + tmp[@"fa-hand-pointer-o"] = @(FAhandPointerO); + tmp[@"fa-hand-rock-o"] = @(FAhandRockO); + tmp[@"fa-hand-scissors-o"] = @(FAhandScissorsO); + tmp[@"fa-hand-spock-o"] = @(FAhandSpockO); + tmp[@"fa-hourglass"] = @(FAhourglass); + tmp[@"fa-hourglass-end"] = @(FAhourglassEnd); + tmp[@"fa-hourglass-half"] = @(FAhourglassHalf); + tmp[@"fa-hourglass-o"] = @(FAhourglassO); + tmp[@"fa-hourglass-start"] = @(FAhourglassStart); + tmp[@"fa-houzz"] = @(FAhouzz); + tmp[@"fa-i-cursor"] = @(FAiCursor); + tmp[@"fa-industry"] = @(FAindustry); + tmp[@"fa-internet-explorer"] = @(FAinternetExplorer); + tmp[@"fa-map"] = @(FAmap); + tmp[@"fa-map-o"] = @(FAmapO); + tmp[@"fa-map-pin"] = @(FAmapPin); + tmp[@"fa-map-signs"] = @(FAmapSigns); + tmp[@"fa-mouse-pointer"] = @(FAmousePointer); + tmp[@"fa-object-group"] = @(FAobjectGroup); + tmp[@"fa-object-ungroup"] = @(FAobjectUngroup); + tmp[@"fa-odnoklassniki"] = @(FAodnoklassniki); + tmp[@"fa-odnoklassniki-square"] = @(FAodnoklassnikiSquare); + tmp[@"fa-opencart"] = @(FAopencart); + tmp[@"fa-opera"] = @(FAopera); + tmp[@"fa-optin-monster"] = @(FAoptinMonster); + tmp[@"fa-registered"] = @(FAregistered); + tmp[@"fa-safari"] = @(FAsafari); + tmp[@"fa-sticky-note"] = @(FAstickyNote); + tmp[@"fa-sticky-note-o"] = @(FAstickyNoteO); + tmp[@"fa-television"] = @(FAtelevision); + tmp[@"fa-trademark"] = @(FAtrademark); + tmp[@"fa-tripadvisor"] = @(FAtripadvisor); + tmp[@"fa-vimeo"] = @(FAvimeo); + tmp[@"fa-wikipedia-w"] = @(FAwikipediaW); + tmp[@"fa-y-combinator"] = @(FAyCombinator); + enumDictionary = tmp; - } + }); return enumDictionary; } diff --git a/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.h b/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.h index cfa2b25..0668da4 100755 --- a/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.h +++ b/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.h @@ -26,7 +26,9 @@ @interface UIFont (FontAwesome) -/* Returns the FontAwesome iconic font */ -+ (UIFont*)iconicFontOfSize:(CGFloat)size; +/** + @abstract Returns the FontAwesome iconic font. + */ ++ (UIFont*)fontAwesomeFontOfSize:(CGFloat)size; @end diff --git a/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.m b/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.m index 0242d67..727e96e 100755 --- a/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.m +++ b/Demo/KoaPullToRefresh/Resources/UIFont+FontAwesome.m @@ -11,10 +11,11 @@ @implementation UIFont (FontAwesome) -/* Returns the FontAwesome iconic font */ -+ (UIFont*)iconicFontOfSize:(CGFloat)size -{ - return [UIFont fontWithName:kFontAwesomeFamilyName size:size]; +#pragma mark - Public API ++ (UIFont*)fontAwesomeFontOfSize:(CGFloat)size { + UIFont *font = [UIFont fontWithName:kFontAwesomeFamilyName size:size]; + NSAssert(font!=nil, @"%@ couldn't be loaded",kFontAwesomeFamilyName); + return font; } @end diff --git a/Demo/KoaPullToRefresh/ViewController.m b/Demo/KoaPullToRefresh/ViewController.m index dcc2122..ef13a9b 100644 --- a/Demo/KoaPullToRefresh/ViewController.m +++ b/Demo/KoaPullToRefresh/ViewController.m @@ -43,14 +43,15 @@ - (void)viewDidLoad //Add pull to refresh [self.tableView addPullToRefreshWithActionHandler:^{ [self refreshTable]; - } withBackgroundColor:[UIColor colorWithRed:0.251 green:0.663 blue:0.827 alpha:1] withPullToRefreshHeightShowed:4]; + } backgroundColor:[UIColor colorWithRed:0.251 green:0.663 blue:0.827 alpha:1] pullToRefreshHeightShowed:4]; //Customize pulltorefresh text colors [self.tableView.pullToRefreshView setTextColor:[UIColor whiteColor]]; [self.tableView.pullToRefreshView setTextFont:[UIFont fontWithName:@"OpenSans-Semibold" size:16]]; //Set fontawesome icon - [self.tableView.pullToRefreshView setFontAwesomeIcon:@"icon-refresh"]; + + //[self.tableView.pullToRefreshView setFontAwesomeIcon:@"fa-refresh"]; //Set titles [self.tableView.pullToRefreshView setTitle:@"Pull" forState:KoaPullToRefreshStateStopped]; diff --git a/KoaPullToRefresh.podspec b/KoaPullToRefresh.podspec index e2819c3..4d36a1d 100644 --- a/KoaPullToRefresh.podspec +++ b/KoaPullToRefresh.podspec @@ -1,26 +1,21 @@ Pod::Spec.new do |s| s.name = 'KoaPullToRefresh' - s.version = '1.0.6' - s.platform = :ios, '5.0' + s.version = '1.1' + s.platform = :ios, '7.0' s.license = 'MIT' s.summary = 'Minimal & easily customizable pull-to-refresh control.' s.homepage = 'https://github.com/sergigracia/KoaPullToRefresh' - + s.author = { 'Sergi Gracia' => 'sergigram@gmail.com', 'Polina Flegontovna' => 'polina.flegontovna@gmail.com' } - s.source = { :git => 'https://github.com/sergigracia/KoaPullToRefresh.git', :tag => s.version.to_s } + s.source = { :git => 'https://github.com/tonimoeckel/KoaPullToRefresh.git', :tag => s.version.to_s } s.description = 'Add this custom, flat, minimal, modern pull-to-refresh ' \ 'control to your app. You can change the font, colors, size ' \ 'and even replace the spinning icon using FontAwesome. ' \ 'This library is very easy to add and customize. ' \ 'Enjoy.' - s.frameworks = 'QuartzCore' - - s.source_files = 'KoaPullToRefresh/*.{h,m}' - s.public_header_files = 'KoaPullToRefresh/*.h' + s.source_files = 'Classes', 'KoaPullToRefresh/*.{h,m}' s.dependency 'FontAwesome+iOS' - - s.preserve_paths = 'Demo' s.requires_arc = true -end \ No newline at end of file +end diff --git a/KoaPullToRefresh/KoaPullToRefresh.h b/KoaPullToRefresh/KoaPullToRefresh.h index dd1dae8..e17ed1b 100644 --- a/KoaPullToRefresh/KoaPullToRefresh.h +++ b/KoaPullToRefresh/KoaPullToRefresh.h @@ -16,8 +16,24 @@ @interface UIScrollView (KoaPullToRefresh) - (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler; -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler withBackgroundColor:(UIColor *)customBackgroundColor; -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler withBackgroundColor:(UIColor *)customBackgroundColor withPullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed; +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler + backgroundColor:(UIColor *)customBackgroundColor; + +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler + backgroundColor:(UIColor *)customBackgroundColor + pullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed; + +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler + backgroundColor:(UIColor *)customBackgroundColor + pullToRefreshHeight:(CGFloat)pullToRefreshHeight + pullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed; + +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler + backgroundColor:(UIColor *)customBackgroundColor + pullToRefreshHeight:(CGFloat)pullToRefreshHeight + pullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed + programmingAnimationOffestY:(CGFloat)programmingAnimationOffestY; + @property (nonatomic, strong) KoaPullToRefreshView *pullToRefreshView; @property (nonatomic, assign) BOOL showsPullToRefresh; @@ -43,6 +59,7 @@ typedef NSUInteger KoaPullToRefreshState; @property (nonatomic, strong, readonly) UILabel *loaderLabel; @property (nonatomic, strong, readonly) NSString *fontAwesomeIcon; @property (nonatomic, readonly) KoaPullToRefreshState state; +@property (nonatomic, assign) BOOL disable; - (void)setTitle:(NSString *)title forState:(KoaPullToRefreshState)state; - (void)setFontAwesomeIcon:(NSString *)fontAwesomeIcon; diff --git a/KoaPullToRefresh/KoaPullToRefresh.m b/KoaPullToRefresh/KoaPullToRefresh.m index 2bfbbc8..818bac3 100644 --- a/KoaPullToRefresh/KoaPullToRefresh.m +++ b/KoaPullToRefresh/KoaPullToRefresh.m @@ -28,11 +28,15 @@ @interface KoaPullToRefreshView () @property (nonatomic, readwrite) CGFloat originalBottomInset; @property (nonatomic, assign) BOOL wasTriggeredByUser; @property (nonatomic, assign) BOOL showsPullToRefresh; -@property(nonatomic, assign) BOOL isObserving; +@property (nonatomic, assign) BOOL isObserving; +@property (nonatomic, assign) BOOL programmaticallyLoading; +@property (nonatomic, assign) CGFloat offsetY; + - (void)resetScrollViewContentInset; -- (void)setScrollViewContentInsetForLoading; -- (void)setScrollViewContentInset:(UIEdgeInsets)insets; +- (void)setScrollViewContentInsetForLoadingWithComplitionBlock:(void(^)())complitionBlock; +- (void)setScrollViewContentInset:(UIEdgeInsets)contentInset withComplitionBlock:(void(^)())complitionBlock; +- (void)setScrollViewContentOffset:(CGPoint)contentOffset withComplitionBlock:(void(^)())complitionBlock; @end @@ -44,24 +48,53 @@ - (void)setScrollViewContentInset:(UIEdgeInsets)insets; @implementation UIScrollView (KoaPullToRefresh) @dynamic pullToRefreshView, showsPullToRefresh; -- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler { - [self addPullToRefreshWithActionHandler:actionHandler withBackgroundColor:[UIColor grayColor]]; + +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler +{ + [self addPullToRefreshWithActionHandler:actionHandler backgroundColor:[UIColor grayColor]]; } - (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler - withBackgroundColor:(UIColor *)customBackgroundColor { - [self addPullToRefreshWithActionHandler:actionHandler withBackgroundColor:customBackgroundColor withPullToRefreshHeightShowed:KoaPullToRefreshViewHeightShowed]; + backgroundColor:(UIColor *)customBackgroundColor +{ + [self addPullToRefreshWithActionHandler:actionHandler + backgroundColor:customBackgroundColor + pullToRefreshHeightShowed:KoaPullToRefreshViewHeightShowed]; } - (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler - withBackgroundColor:(UIColor *)customBackgroundColor - withPullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed { - - //KoaPullToRefreshViewHeight = pullToRefreshHeight; + backgroundColor:(UIColor *)customBackgroundColor + pullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed +{ + [self addPullToRefreshWithActionHandler:actionHandler + backgroundColor:customBackgroundColor + pullToRefreshHeight:KoaPullToRefreshViewHeight + pullToRefreshHeightShowed:KoaPullToRefreshViewHeightShowed]; +} + +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler + backgroundColor:(UIColor *)customBackgroundColor + pullToRefreshHeight:(CGFloat)pullToRefreshHeight + pullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed +{ + [self addPullToRefreshWithActionHandler:actionHandler + backgroundColor:customBackgroundColor + pullToRefreshHeight:pullToRefreshHeight + pullToRefreshHeightShowed:pullToRefreshHeightShowed + programmingAnimationOffestY:pullToRefreshHeight]; +} + +- (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler + backgroundColor:(UIColor *)customBackgroundColor + pullToRefreshHeight:(CGFloat)pullToRefreshHeight + pullToRefreshHeightShowed:(CGFloat)pullToRefreshHeightShowed + programmingAnimationOffestY:(CGFloat)programmingAnimationOffestY +{ + KoaPullToRefreshViewHeight = pullToRefreshHeight; KoaPullToRefreshViewHeightShowed = pullToRefreshHeightShowed; KoaPullToRefreshViewTitleBottomMargin += pullToRefreshHeightShowed; - [self setContentInset:UIEdgeInsetsMake(KoaPullToRefreshViewHeightShowed, self.contentInset.left, self.contentInset.bottom, self.contentInset.right)]; + [self setContentInset:UIEdgeInsetsMake(KoaPullToRefreshViewHeightShowed + self.contentInset.top, self.contentInset.left, self.contentInset.bottom, self.contentInset.right)]; if (!self.pullToRefreshView) { @@ -86,7 +119,12 @@ - (void)addPullToRefreshWithActionHandler:(void (^)(void))actionHandler self.pullToRefreshView = view; self.showsPullToRefresh = YES; + } else { + self.pullToRefreshView.pullToRefreshActionHandler = actionHandler; } + + self.pullToRefreshView.offsetY = programmingAnimationOffestY; +// self.pullToRefreshView.titleLabel.alpha = 1; } - (void)setPullToRefreshView:(KoaPullToRefreshView *)pullToRefreshView { @@ -101,12 +139,17 @@ - (KoaPullToRefreshView *)pullToRefreshView { return objc_getAssociatedObject(self, &UIScrollViewPullToRefreshView); } -- (void)setShowsPullToRefresh:(BOOL)showsPullToRefresh { +- (void)setShowsPullToRefresh:(BOOL)showsPullToRefresh +{ + if (!self.pullToRefreshView) { + return; + } + self.pullToRefreshView.hidden = !showsPullToRefresh; - if(!showsPullToRefresh) { if (self.pullToRefreshView.isObserving) { [self removeObserver:self.pullToRefreshView forKeyPath:@"contentOffset"]; + [self removeObserver:self.pullToRefreshView forKeyPath:@"contentSize"]; [self removeObserver:self.pullToRefreshView forKeyPath:@"frame"]; [self.pullToRefreshView resetScrollViewContentInset]; self.pullToRefreshView.isObserving = NO; @@ -124,6 +167,7 @@ - (void)setShowsPullToRefresh:(BOOL)showsPullToRefresh { } } + - (BOOL)showsPullToRefresh { return !self.pullToRefreshView.hidden; } @@ -154,9 +198,9 @@ - (id)initWithFrame:(CGRect)frame { [self.loaderLabel setTextAlignment:NSTextAlignmentLeft]; self.titles = [NSMutableArray arrayWithObjects: NSLocalizedString(@"Pull",), - NSLocalizedString(@"Release",), - NSLocalizedString(@"Loading",), - nil]; + NSLocalizedString(@"Release",), + NSLocalizedString(@"Loading",), + nil]; self.wasTriggeredByUser = YES; } @@ -168,6 +212,11 @@ - (void)willMoveToSuperview:(UIView *)newSuperview { UIScrollView *scrollView = (UIScrollView *)self.superview; if (scrollView.showsPullToRefresh) { if (self.isObserving) { + if (self.state == KoaPullToRefreshStateLoading) { + self.state = KoaPullToRefreshStateStopped; + [self stopAnimating]; + } + //If enter this branch, it is the moment just before "KoaPullToRefreshView's dealloc", so remove observer here [scrollView removeObserver:self forKeyPath:@"contentOffset"]; [scrollView removeObserver:self forKeyPath:@"contentSize"]; @@ -188,7 +237,11 @@ - (void)layoutSubviews self.titleLabel.text = [self.titles objectAtIndex:self.state]; //Set title frame - CGSize titleSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font constrainedToSize:CGSizeMake(labelMaxWidth,self.titleLabel.font.lineHeight) lineBreakMode:self.titleLabel.lineBreakMode]; + NSStringDrawingOptions options = NSStringDrawingTruncatesLastVisibleLine | + NSStringDrawingUsesLineFragmentOrigin; + NSDictionary *attr = @{NSFontAttributeName: self.titleLabel.font}; + + CGSize titleSize = [self.titleLabel.text boundingRectWithSize:CGSizeMake(labelMaxWidth,self.titleLabel.font.lineHeight) options:options attributes:attr context:nil].size; CGFloat titleY = KoaPullToRefreshViewHeight - KoaPullToRefreshViewHeightShowed - titleSize.height - KoaPullToRefreshViewTitleBottomMargin; [self.titleLabel setFrame:CGRectIntegral(CGRectMake(0, titleY, self.frame.size.width, titleSize.height))]; @@ -216,35 +269,61 @@ - (void)layoutSubviews #pragma mark - Scroll View -- (void)resetScrollViewContentInset { +- (void)resetScrollViewContentInset +{ UIEdgeInsets currentInsets = self.scrollView.contentInset; currentInsets.top = self.originalTopInset; - [self setScrollViewContentInset:currentInsets]; + + __weak KoaPullToRefreshView *weakSelf = self; + [self setScrollViewContentInset:currentInsets withComplitionBlock:^{ + if ([weakSelf.scrollView isKindOfClass:[UICollectionView class]]) { + if (weakSelf.scrollView.contentOffset.y < 0) { + [weakSelf.scrollView setContentOffset:CGPointZero animated:YES]; + } + } + }]; } -- (void)setScrollViewContentInsetForLoading { +- (void)setScrollViewContentInsetForLoadingWithComplitionBlock:(void(^)())complitionBlock +{ UIEdgeInsets currentInsets = self.scrollView.contentInset; //CGFloat offset = MAX(self.scrollView.contentOffset.y * -1, 0); //currentInsets.top = MIN(offset, self.originalTopInset + self.bounds.size.height); currentInsets.top = self.originalTopInset + self.bounds.size.height; - [self setScrollViewContentInset:currentInsets]; + [self setScrollViewContentInset:currentInsets withComplitionBlock:complitionBlock]; } -- (void)setScrollViewContentInset:(UIEdgeInsets)contentInset { +- (void)setScrollViewContentInset:(UIEdgeInsets)contentInset withComplitionBlock:(void(^)())complitionBlock +{ [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState animations:^{ self.scrollView.contentInset = contentInset; } - completion:NULL]; + completion:^(BOOL finished) { + if (complitionBlock) { + complitionBlock(); + } + }]; } #pragma mark - Observing -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if([keyPath isEqualToString:@"contentOffset"]) +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (self.disable) { + return; + } + + if (self.scrollView.contentOffset.y < -(self.offsetY + self.originalTopInset) && self.programmaticallyLoading) { + self.scrollView.contentOffset = CGPointMake(0, -(self.offsetY + self.originalTopInset)); + } + + + if([keyPath isEqualToString:@"contentOffset"]) { [self scrollViewDidScroll:[[change valueForKey:NSKeyValueChangeNewKey] CGPointValue]]; + } else if([keyPath isEqualToString:@"contentSize"]) { [self layoutSubviews]; @@ -252,18 +331,27 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N yOrigin = -KoaPullToRefreshViewHeight; self.frame = CGRectMake(0, yOrigin, self.bounds.size.width, KoaPullToRefreshViewHeight); } - else if([keyPath isEqualToString:@"frame"]) + else if([keyPath isEqualToString:@"frame"]) { [self layoutSubviews]; + } } -- (void)scrollViewDidScroll:(CGPoint)contentOffset { +- (void)scrollViewDidScroll:(CGPoint)contentOffset +{ + if (self.disable) { + return; + } //Change title label alpha - [self.titleLabel setAlpha: ((contentOffset.y * -1) / KoaPullToRefreshViewHeight) - 0.1]; + CGFloat absOffset = fabs(self.originalTopInset); + absOffset /= contentOffset.y; + absOffset = 1.4 + absOffset; + [self.titleLabel setAlpha:absOffset]; + if(self.state != KoaPullToRefreshStateLoading) { CGFloat scrollOffsetThreshold; - scrollOffsetThreshold = self.frame.origin.y-self.originalTopInset; + scrollOffsetThreshold = self.frame.origin.y - self.originalTopInset; if(!self.scrollView.isDragging && self.state == KoaPullToRefreshStateTriggered) self.state = KoaPullToRefreshStateLoading; @@ -283,13 +371,13 @@ - (void)scrollViewDidScroll:(CGPoint)contentOffset { //Set content offset for special cases if(self.state != KoaPullToRefreshStateLoading) { if (self.scrollView.contentOffset.y > -KoaPullToRefreshViewHeightShowed && self.scrollView.contentOffset.y < 0) { - [self.scrollView setContentInset:UIEdgeInsetsMake(abs(self.scrollView.contentOffset.y), self.scrollView.contentInset.left, self.scrollView.contentInset.bottom, self.scrollView.contentInset.right)]; - }else if(self.scrollView.contentOffset.y > -KoaPullToRefreshViewHeightShowed) { - [self.scrollView setContentInset:UIEdgeInsetsZero]; - }else{ - [self.scrollView setContentInset:UIEdgeInsetsMake(KoaPullToRefreshViewHeightShowed, self.scrollView.contentInset.left, self.scrollView.contentInset.bottom, self.scrollView.contentInset.right)]; + [self.scrollView setContentInset:UIEdgeInsetsMake(self.originalTopInset + fabs(self.scrollView.contentOffset.y), + self.scrollView.contentInset.left, + self.scrollView.contentInset.bottom, + self.scrollView.contentInset.right)]; } } + self.wasTriggeredByUser = YES; } @@ -309,9 +397,10 @@ - (UILabel *)titleLabel { - (UILabel *)loaderLabel { if(!_loaderLabel) { - _loaderLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.frame.size.width/2 - 17/2, 0, 17, 17)]; + float size = 20; + _loaderLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.frame.size.width/2 - size/2, 0, size, size)]; _loaderLabel.text = [NSString fontAwesomeIconStringForIconIdentifier:self.fontAwesomeIcon]; - _loaderLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:20]; + _loaderLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:size]; _loaderLabel.backgroundColor = [UIColor clearColor]; _loaderLabel.textColor = textColor; [_loaderLabel sizeToFit]; @@ -322,7 +411,7 @@ - (UILabel *)loaderLabel { - (NSString *)fontAwesomeIcon { if (!_fontAwesomeIcon) { - _fontAwesomeIcon = @"icon-refresh"; + _fontAwesomeIcon = @"fa-circle-o-notch"; } return _fontAwesomeIcon; } @@ -368,27 +457,46 @@ - (void)setFontAwesomeIcon:(NSString *)fontAwesomeIcon #pragma mark - -- (void)startAnimating{ - +- (void)startAnimating +{ //Show loader + self.wasTriggeredByUser = NO; + self.programmaticallyLoading = YES; self.state = KoaPullToRefreshStateTriggered; [self layoutSubviews]; - if(fequalzero(self.scrollView.contentOffset.y)) { - [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.frame.size.height) animated:YES]; - self.wasTriggeredByUser = NO; - } - else - self.wasTriggeredByUser = YES; + __weak KoaPullToRefreshView *weakSelf = self; + [self setScrollViewContentOffset:CGPointMake(self.scrollView.contentOffset.x, -(self.originalTopInset + KoaPullToRefreshViewHeightShowed + self.frame.size.height)) + withComplitionBlock:^{ + if (weakSelf.state != KoaPullToRefreshStateLoading) { +// weakSelf.state = KoaPullToRefreshStateLoading; + } + }]; +} - self.state = KoaPullToRefreshStateLoading; +- (void)setScrollViewContentOffset:(CGPoint)contentOffset withComplitionBlock:(void(^)())complitionBlock +{ + __weak KoaPullToRefreshView *weakSelf = self; + [UIView animateWithDuration:0.3 + delay:0 + options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState + animations:^{ + weakSelf.scrollView.contentOffset = contentOffset; + } + completion:^(BOOL finished) { + if (complitionBlock) { + complitionBlock(); + } + }]; } + - (void)stopAnimating { self.state = KoaPullToRefreshStateStopped; - - if(!self.wasTriggeredByUser && self.scrollView.contentOffset.y < -self.originalTopInset) + + if(self.scrollView.contentOffset.y < -self.originalTopInset) { [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.originalTopInset) animated:YES]; + } } - (void)setState:(KoaPullToRefreshState)newState { @@ -412,16 +520,26 @@ - (void)setState:(KoaPullToRefreshState)newState { break; case KoaPullToRefreshStateLoading: + self.programmaticallyLoading = NO; [self startRotatingIcon]; - [self setScrollViewContentInsetForLoading]; - if(previousState == KoaPullToRefreshStateTriggered && pullToRefreshActionHandler) - pullToRefreshActionHandler(); + __weak void (^actionHandler)(void) = pullToRefreshActionHandler; + __weak KoaPullToRefreshView *weakSelf = self; + [self setScrollViewContentInsetForLoadingWithComplitionBlock:^{ + if(previousState == KoaPullToRefreshStateTriggered && actionHandler) { + [weakSelf performSelector:@selector(runPullToRefreshActionHandler) withObject:nil afterDelay:0.3]; + } + }]; break; } } +- (void)runPullToRefreshActionHandler +{ + pullToRefreshActionHandler(); +} + - (void)startRotatingIcon { CABasicAnimation *rotation; rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];