From 79d90aaded303966d004a37afa8ec21fa085017f Mon Sep 17 00:00:00 2001 From: Richard Das Date: Fri, 27 Mar 2015 23:51:06 +0000 Subject: [PATCH 01/10] Added support for editing default parameters in Interface Builder --- .../MONActivityIndicatorView.h | 14 +++++++++----- .../MONActivityIndicatorView.m | 3 --- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h index 74e3145..fc35f79 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h @@ -8,22 +8,26 @@ @protocol MONActivityIndicatorViewDelegate; +IB_DESIGNABLE @interface MONActivityIndicatorView : UIView /** The number of circle indicators. */ -@property (readwrite, nonatomic) NSUInteger numberOfCircles; +@property (readwrite, nonatomic) IBInspectable NSUInteger numberOfCircles; /** The spacing between circles. */ -@property (readwrite, nonatomic) CGFloat internalSpacing; +@property (readwrite, nonatomic) IBInspectable CGFloat internalSpacing; /** The radius of each circle. */ -@property (readwrite, nonatomic) CGFloat radius; +@property (readwrite, nonatomic) IBInspectable CGFloat radius; /** The base animation delay of each circle. */ -@property (readwrite, nonatomic) CGFloat delay; +@property (readwrite, nonatomic) IBInspectable CGFloat delay; /** The base animation duration of each circle*/ -@property (readwrite, nonatomic) CGFloat duration; +@property (readwrite, nonatomic) IBInspectable CGFloat duration; + +/** The default color of each circle. */ +@property (strong, nonatomic) IBInspectable UIColor *defaultColor; /** The assigned delegate */ @property (weak, nonatomic) id delegate; diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m index df32a24..62fd837 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m @@ -9,9 +9,6 @@ @interface MONActivityIndicatorView () -/** The default color of each circle. */ -@property (strong, nonatomic) UIColor *defaultColor; - /** An indicator whether the activity indicator view is animating. */ @property (readwrite, nonatomic) BOOL isAnimating; From 271a7c56d8072f9ad1c2556d316bc28c546d7252 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 00:04:48 +0000 Subject: [PATCH 02/10] Added UIAppearance support for tintColor --- .../MONActivityIndicatorView.h | 2 +- .../MONActivityIndicatorView.m | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h index fc35f79..cbec085 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h @@ -27,7 +27,7 @@ IB_DESIGNABLE @property (readwrite, nonatomic) IBInspectable CGFloat duration; /** The default color of each circle. */ -@property (strong, nonatomic) IBInspectable UIColor *defaultColor; +@property (strong, nonatomic) IBInspectable UIColor *tintColor UI_APPEARANCE_SELECTOR; /** The assigned delegate */ @property (weak, nonatomic) id delegate; diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m index 62fd837..e02c12e 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m @@ -94,7 +94,7 @@ - (void)setupDefaults { self.radius = 10; self.delay = 0.2; self.duration = 0.8; - self.defaultColor = [UIColor lightGrayColor]; + self.tintColor = [UIColor lightGrayColor]; } - (UIView *)createCircleWithRadius:(CGFloat)radius @@ -128,7 +128,7 @@ - (void)addCircles { color = [self.delegate activityIndicatorView:self circleBackgroundColorAtIndex:i]; } UIView *circle = [self createCircleWithRadius:self.radius - color:(color == nil) ? self.defaultColor : color + color:(color == nil) ? self.tintColor : color positionX:(i * ((2 * self.radius) + self.internalSpacing))]; [circle setTransform:CGAffineTransformMakeScale(0, 0)]; [circle.layer addAnimation:[self createAnimationWithDuration:self.duration delay:(i * self.delay)] forKey:@"scale"]; @@ -179,4 +179,14 @@ - (void)setInternalSpacing:(CGFloat)internalSpacing { [self invalidateIntrinsicContentSize]; } +- (void)setTintColor:(UIColor *)tintColor +{ + _tintColor = tintColor; + if (self.isAnimating) + { + [self removeCircles]; + [self addCircles]; + } +} + @end From 13db654ce304468e5299c06a06bc3ada5ffc8994 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 15:46:45 +0000 Subject: [PATCH 03/10] UIAppearance & default values from custom setters + Dots now use UIAppearance TintColor (blue by default) + Default values are calculated in custom getters, so we don't need to override all the initializers, and the component should now honour values set in Interface Builder for IBInspectables. --- .../MONActivityIndicatorView.h | 17 +- .../MONActivityIndicatorView.m | 148 +++++++++--------- 2 files changed, 83 insertions(+), 82 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h index cbec085..82a8438 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h @@ -9,28 +9,25 @@ @protocol MONActivityIndicatorViewDelegate; IB_DESIGNABLE -@interface MONActivityIndicatorView : UIView +@interface MONActivityIndicatorView : UIView /** The number of circle indicators. */ -@property (readwrite, nonatomic) IBInspectable NSUInteger numberOfCircles; +@property (nonatomic) IBInspectable NSUInteger numberOfCircles; /** The spacing between circles. */ -@property (readwrite, nonatomic) IBInspectable CGFloat internalSpacing; +@property (nonatomic) IBInspectable CGFloat internalSpacing; /** The radius of each circle. */ -@property (readwrite, nonatomic) IBInspectable CGFloat radius; +@property (nonatomic) IBInspectable CGFloat radius; /** The base animation delay of each circle. */ -@property (readwrite, nonatomic) IBInspectable CGFloat delay; +@property (nonatomic) IBInspectable CGFloat delay; /** The base animation duration of each circle*/ -@property (readwrite, nonatomic) IBInspectable CGFloat duration; - -/** The default color of each circle. */ -@property (strong, nonatomic) IBInspectable UIColor *tintColor UI_APPEARANCE_SELECTOR; +@property (nonatomic) IBInspectable CGFloat duration; /** The assigned delegate */ -@property (weak, nonatomic) id delegate; +@property (nonatomic, weak) id delegate; /** diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m index e02c12e..9e3fc6b 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m @@ -7,75 +7,33 @@ #import #import "MONActivityIndicatorView.h" -@interface MONActivityIndicatorView () -/** An indicator whether the activity indicator view is animating. */ -@property (readwrite, nonatomic) BOOL isAnimating; -/** - Sets up default values - */ -- (void)setupDefaults; +@interface MONActivityIndicatorView () -/** - Adds circles. - */ -- (void)addCircles; -/** - Removes circles. - */ -- (void)removeCircles; -/** - Creates the circle view. - @param radius The radius of the circle. - @param color The background color of the circle. - @param positionX The x-position of the circle in the contentView. - @return The circle view. - */ -- (UIView *)createCircleWithRadius:(CGFloat)radius color:(UIColor *)color positionX:(CGFloat)x; +/** An indicator whether the activity indicator view is animating. */ +@property (nonatomic) BOOL isAnimating; + -/** - Creates the animation of the circle. - @param duration The duration of the animation. - @param delay The delay of the animation - @return The animation of the circle. - */ -- (CABasicAnimation *)createAnimationWithDuration:(CGFloat)duration delay:(CGFloat)delay; @end + + @implementation MONActivityIndicatorView -#pragma mark - -#pragma mark - Initializations -- (id)init { - self = [super initWithFrame:CGRectZero]; - if (self) { - [self setupDefaults]; - } - return self; -} -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self setupDefaults]; - } - return self; -} +@synthesize numberOfCircles = _numberOfCircles; +@synthesize internalSpacing = _internalSpacing; +@synthesize radius = _radius; +@synthesize delay = _delay; +@synthesize duration = _duration; + -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - [self setupDefaults]; - } - return self; -} -#pragma mark - #pragma mark - Intrinsic Content Size - (CGSize)intrinsicContentSize { @@ -84,22 +42,20 @@ - (CGSize)intrinsicContentSize { return CGSizeMake(width, height); } -#pragma mark - + + #pragma mark - Private Methods -- (void)setupDefaults { - self.translatesAutoresizingMaskIntoConstraints = NO; - self.numberOfCircles = 5; - self.internalSpacing = 5; - self.radius = 10; - self.delay = 0.2; - self.duration = 0.8; - self.tintColor = [UIColor lightGrayColor]; -} -- (UIView *)createCircleWithRadius:(CGFloat)radius - color:(UIColor *)color - positionX:(CGFloat)x { +/** + Creates the circle view. + @param radius The radius of the circle. + @param color The background color of the circle. + @param positionX The x-position of the circle in the contentView. + @return The circle view. + */ +- (UIView *)createCircleWithRadius:(CGFloat)radius color:(UIColor *)color positionX:(CGFloat)x +{ UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(x, 0, radius * 2, radius * 2)]; circle.backgroundColor = color; circle.layer.cornerRadius = radius; @@ -107,6 +63,12 @@ - (UIView *)createCircleWithRadius:(CGFloat)radius return circle; } +/** + Creates the animation of the circle. + @param duration The duration of the animation. + @param delay The delay of the animation + @return The animation of the circle. + */ - (CABasicAnimation *)createAnimationWithDuration:(CGFloat)duration delay:(CGFloat)delay { CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; anim.delegate = self; @@ -123,12 +85,12 @@ - (CABasicAnimation *)createAnimationWithDuration:(CGFloat)duration delay:(CGFlo - (void)addCircles { for (NSUInteger i = 0; i < self.numberOfCircles; i++) { - UIColor *color = nil; + UIColor *color = self.tintColor; if (self.delegate && [self.delegate respondsToSelector:@selector(activityIndicatorView:circleBackgroundColorAtIndex:)]) { color = [self.delegate activityIndicatorView:self circleBackgroundColorAtIndex:i]; } UIView *circle = [self createCircleWithRadius:self.radius - color:(color == nil) ? self.tintColor : color + color:color positionX:(i * ((2 * self.radius) + self.internalSpacing))]; [circle setTransform:CGAffineTransformMakeScale(0, 0)]; [circle.layer addAnimation:[self createAnimationWithDuration:self.duration delay:(i * self.delay)] forKey:@"scale"]; @@ -142,7 +104,8 @@ - (void)removeCircles { }]; } -#pragma mark - + + #pragma mark - Public Methods - (void)startAnimating { @@ -161,27 +124,68 @@ - (void)stopAnimating { } } -#pragma mark - + + #pragma mark - Custom Setters and Getters +- (NSUInteger)numberOfCircles +{ + if (!_numberOfCircles) return 5; + return _numberOfCircles; +} + - (void)setNumberOfCircles:(NSUInteger)numberOfCircles { _numberOfCircles = numberOfCircles; [self invalidateIntrinsicContentSize]; } + + +- (CGFloat)radius +{ + if (!_radius) return 10.f; + return _radius; +} + - (void)setRadius:(CGFloat)radius { _radius = radius; [self invalidateIntrinsicContentSize]; } + + +- (CGFloat)delay +{ + if (!_delay) return 0.2f; + return _delay; +} + + + +- (CGFloat)duration +{ + if (!_duration) return 0.8f; + return _duration; +} + + +- (CGFloat)internalSpacing +{ + if (!_internalSpacing) return 5; + return _internalSpacing; +} + - (void)setInternalSpacing:(CGFloat)internalSpacing { _internalSpacing = internalSpacing; [self invalidateIntrinsicContentSize]; } + + - (void)setTintColor:(UIColor *)tintColor { - _tintColor = tintColor; + [super setTintColor:tintColor]; + if (self.isAnimating) { [self removeCircles]; From c5d274d88875d0f23682413ca183c25659b21ece Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 15:47:25 +0000 Subject: [PATCH 04/10] Updated view controller example. + Cleaned up AutoLayout in view controller, so there's less code --- .../Source/Controllers/MONViewController.m | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m index 2707b05..ecb0af5 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m @@ -22,39 +22,24 @@ - (void)viewDidLoad { [super viewDidLoad]; MONActivityIndicatorView *indicatorView = [[MONActivityIndicatorView alloc] init]; - indicatorView.delegate = self; - indicatorView.numberOfCircles = 3; - indicatorView.radius = 20; - indicatorView.internalSpacing = 3; + // indicatorView.delegate = self; [indicatorView startAnimating]; - + indicatorView.backgroundColor = [UIColor redColor]; + indicatorView.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:indicatorView]; - [self placeAtTheCenterWithView:indicatorView]; + + NSDictionary *views = @{ @"indicatorView" : indicatorView, + @"superview" : self.view }; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[superview]-(<=1)-[indicatorView(==50)]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]]; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[superview]-(<=1)-[indicatorView(==100)]" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; + + // [self placeAtTheCenterWithView:indicatorView]; [NSTimer scheduledTimerWithTimeInterval:7 target:indicatorView selector:@selector(stopAnimating) userInfo:nil repeats:NO]; [NSTimer scheduledTimerWithTimeInterval:9 target:indicatorView selector:@selector(startAnimating) userInfo:nil repeats:NO]; } -#pragma mark - -#pragma mark - Centering Indicator View -- (void)placeAtTheCenterWithView:(UIView *)view { - [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view - attribute:NSLayoutAttributeCenterX - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeCenterX - multiplier:1.0f - constant:0.0f]]; - - [self.view addConstraint:[NSLayoutConstraint constraintWithItem:view - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeCenterY - multiplier:1.0f - constant:0.0f]]; -} #pragma mark - #pragma mark - MONActivityIndicatorViewDelegate Methods From 1757ca8dd03bbb4ba86b7470347272231170f598 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 15:56:23 +0000 Subject: [PATCH 05/10] Updated readme --- README.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f741f8a..eff7261 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,34 @@ MONActivityIndicatorView is an awesome custom activity indicator view for iOS. } ``` -### Custom Circle's Background Color -First, assign the `MONActivityIndicatorViewDelegate` protocol to a view controller. Then, implement the method `activityIndicatorView:circleBackgroundColorAtIndex:` +### Custom Dot Color +There are several ways to set the color of the dots in this component. + +**Option 1** + +MONActivityIndicatorView conforms to UIAppearance, so you can do this: + +``` objective-c +[[MONActivityIndicatorView appearance] setTintColor:[UIColor redColor]]; +``` + +or this: + +``` objective-c +MONActivityIndicatorView *indicatorView = [[MONActivityIndicatorView alloc] init]; +indicatorView.tintColor = [UIColor redColor]; +``` + + +**Option 2** + +MONActivityIndicatorView supports IBInspectable, so you can set the tintColor in Interface Builder/Storyboard. + + +**Option 3** + +MONActivityIndicatorViewDelegate provides the method `activityIndicatorView:circleBackgroundColorAtIndex:`, which you can implement in your delegate. + ``` objective-c @interface ViewController : UIViewController From 648218a8ebe19a2096f26d7ef2f4591119533fe9 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 16:04:44 +0000 Subject: [PATCH 06/10] Updated delegate, minor bug fix. + Updated delegate method (activityIndicatorView:circleBackgroundColorAtIndex: -> activityIndicatorView:dotColorAtIndex:) + Resolved issue where updating the number of dots when the component was animating would have no effect. --- .../Source/Controllers/MONViewController.m | 10 +++------- .../MONActivityIndicatorView.h | 3 +-- .../MONActivityIndicatorView.m | 13 ++++++++----- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m index ecb0af5..6ce27bc 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m @@ -24,17 +24,14 @@ - (void)viewDidLoad { MONActivityIndicatorView *indicatorView = [[MONActivityIndicatorView alloc] init]; // indicatorView.delegate = self; [indicatorView startAnimating]; - indicatorView.backgroundColor = [UIColor redColor]; indicatorView.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:indicatorView]; NSDictionary *views = @{ @"indicatorView" : indicatorView, @"superview" : self.view }; - [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[superview]-(<=1)-[indicatorView(==50)]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]]; - [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[superview]-(<=1)-[indicatorView(==100)]" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[superview]-(<=1)-[indicatorView]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]]; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[superview]-(<=1)-[indicatorView]" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; - // [self placeAtTheCenterWithView:indicatorView]; - [NSTimer scheduledTimerWithTimeInterval:7 target:indicatorView selector:@selector(stopAnimating) userInfo:nil repeats:NO]; [NSTimer scheduledTimerWithTimeInterval:9 target:indicatorView selector:@selector(startAnimating) userInfo:nil repeats:NO]; } @@ -44,8 +41,7 @@ - (void)viewDidLoad { #pragma mark - #pragma mark - MONActivityIndicatorViewDelegate Methods -- (UIColor *)activityIndicatorView:(MONActivityIndicatorView *)activityIndicatorView - circleBackgroundColorAtIndex:(NSUInteger)index { +- (UIColor *)activityIndicatorView:(MONActivityIndicatorView *)activityIndicatorView dotColorAtIndex:(NSUInteger)index { CGFloat red = (arc4random() % 256)/255.0; CGFloat green = (arc4random() % 256)/255.0; CGFloat blue = (arc4random() % 256)/255.0; diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h index 82a8438..c7bd42e 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h @@ -52,7 +52,6 @@ IB_DESIGNABLE @param index The index of a particular circle. @return The background color of a particular circle. */ -- (UIColor *)activityIndicatorView:(MONActivityIndicatorView *)activityIndicatorView - circleBackgroundColorAtIndex:(NSUInteger)index; +- (UIColor *)activityIndicatorView:(MONActivityIndicatorView *)activityIndicatorView dotColorAtIndex:(NSUInteger)index; @end diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m index 9e3fc6b..7052506 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m @@ -86,12 +86,10 @@ - (CABasicAnimation *)createAnimationWithDuration:(CGFloat)duration delay:(CGFlo - (void)addCircles { for (NSUInteger i = 0; i < self.numberOfCircles; i++) { UIColor *color = self.tintColor; - if (self.delegate && [self.delegate respondsToSelector:@selector(activityIndicatorView:circleBackgroundColorAtIndex:)]) { - color = [self.delegate activityIndicatorView:self circleBackgroundColorAtIndex:i]; + if (self.delegate && [self.delegate respondsToSelector:@selector(activityIndicatorView:dotColorAtIndex:)]) { + color = [self.delegate activityIndicatorView:self dotColorAtIndex:i]; } - UIView *circle = [self createCircleWithRadius:self.radius - color:color - positionX:(i * ((2 * self.radius) + self.internalSpacing))]; + UIView *circle = [self createCircleWithRadius:self.radius color:color positionX:(i * ((2 * self.radius) + self.internalSpacing))]; [circle setTransform:CGAffineTransformMakeScale(0, 0)]; [circle.layer addAnimation:[self createAnimationWithDuration:self.duration delay:(i * self.delay)] forKey:@"scale"]; [self addSubview:circle]; @@ -136,6 +134,11 @@ - (NSUInteger)numberOfCircles - (void)setNumberOfCircles:(NSUInteger)numberOfCircles { _numberOfCircles = numberOfCircles; + if (self.isAnimating) + { + [self removeCircles]; + [self addCircles]; + } [self invalidateIntrinsicContentSize]; } From 8890e24dc4d94796f8da5bd97d32fcdc105eaad1 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 16:10:53 +0000 Subject: [PATCH 07/10] Updated readme --- README.md | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index eff7261..304b28c 100644 --- a/README.md +++ b/README.md @@ -36,16 +36,11 @@ MONActivityIndicatorView is an awesome custom activity indicator view for iOS. ## Customization -### Default Property Values -* Animation delay : `delay = 0.2` -* Animation duration : `duration = 0.8` -* Number of circles : `numberOfCircles = 5` -* Circle's radius : `radius = 10` -* Circle's internal spacing : `internalSpacing = 5` -* Circle's background Color : `defaultColor = [UIColor lightGrayColor]` -### Custom Property Values +### Custom Properties +MONActivityIndicator is totally customizable: + ``` objective-c - (void)viewDidLoad { [super viewDidLoad]; @@ -56,8 +51,7 @@ MONActivityIndicatorView is an awesome custom activity indicator view for iOS. indicatorView.internalSpacing = 3; indicatorView.duration = 0.5; indicatorView.delay = 0.5 - indicatorView.center = self.view.center; - [self.view addSubview:indicatorView]; + ... [indicatorView startAnimating]; } ``` @@ -88,11 +82,10 @@ MONActivityIndicatorView supports IBInspectable, so you can set the tintColor in **Option 3** -MONActivityIndicatorViewDelegate provides the method `activityIndicatorView:circleBackgroundColorAtIndex:`, which you can implement in your delegate. +MONActivityIndicatorViewDelegate provides the method `activityIndicatorView:dotColorAtIndex:`, which you can implement in your delegate. ``` objective-c @interface ViewController : UIViewController - @end @implementation ViewController @@ -102,24 +95,12 @@ MONActivityIndicatorViewDelegate provides the method `activityIndicatorView:circ MONActivityIndicatorView *indicatorView = [[MONActivityIndicatorView alloc] init]; indicatorView.delegate = self; - indicatorView.numberOfCircles = 3; - indicatorView.radius = 20; - indicatorView.internalSpacing = 3; - indicatorView.duration = 0.5; - indicatorView.delay = 0.5 - indicatorView.center = self.view.center; - [self.view addSubview:indicatorView]; + ... [indicatorView startAnimating]; } -- (UIColor *)activityIndicatorView:(MONActivityIndicatorView *)activityIndicatorView - circleBackgroundColorAtIndex:(NSUInteger)index { - // For a random background color for a particular circle - CGFloat red = (arc4random() % 256)/255.0; - CGFloat green = (arc4random() % 256)/255.0; - CGFloat blue = (arc4random() % 256)/255.0; - CGFloat alpha = 1.0f; - return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; +- (UIColor *)activityIndicatorView:(MONActivityIndicatorView *)activityIndicatorView dotColorAtIndex:(NSUInteger)index { + return [UIColor redColor]; } @end From 995676f4f7a9ff014bcf298a8d55d99b14b42314 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Sat, 28 Mar 2015 20:12:55 +0000 Subject: [PATCH 08/10] Added access to all customizable params for UIAppearance --- .../MONActivityIndicatorView.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h index c7bd42e..1b3e70e 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h @@ -12,19 +12,19 @@ IB_DESIGNABLE @interface MONActivityIndicatorView : UIView /** The number of circle indicators. */ -@property (nonatomic) IBInspectable NSUInteger numberOfCircles; +@property (nonatomic) IBInspectable NSUInteger numberOfCircles; //UI_APPEARANCE_SELECTOR /** The spacing between circles. */ -@property (nonatomic) IBInspectable CGFloat internalSpacing; +@property (nonatomic) IBInspectable CGFloat internalSpacing; //UI_APPEARANCE_SELECTOR /** The radius of each circle. */ -@property (nonatomic) IBInspectable CGFloat radius; +@property (nonatomic) IBInspectable CGFloat radius; //UI_APPEARANCE_SELECTOR /** The base animation delay of each circle. */ -@property (nonatomic) IBInspectable CGFloat delay; +@property (nonatomic) IBInspectable CGFloat delay; //UI_APPEARANCE_SELECTOR /** The base animation duration of each circle*/ -@property (nonatomic) IBInspectable CGFloat duration; +@property (nonatomic) IBInspectable CGFloat duration; //UI_APPEARANCE_SELECTOR /** The assigned delegate */ @property (nonatomic, weak) id delegate; From 63cae37d574da1719416c3cbe05f4ada68c8fd26 Mon Sep 17 00:00:00 2001 From: Richard Das Date: Mon, 30 Mar 2015 09:41:45 +0100 Subject: [PATCH 09/10] Component redraws after any property is set. --- .../MONActivityIndicatorView.m | 65 ++++++++++++++----- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m index 7052506..96a023a 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.m @@ -47,6 +47,19 @@ - (CGSize)intrinsicContentSize { #pragma mark - Private Methods + +- (void)refresh +{ + if (self.isAnimating) + { + [self removeCircles]; + [self addCircles]; + } + [self invalidateIntrinsicContentSize]; +} + + + /** Creates the circle view. @param radius The radius of the circle. @@ -124,7 +137,9 @@ - (void)stopAnimating { -#pragma mark - Custom Setters and Getters +#pragma mark - *** Custom Setters and Getters *** + +#pragma mark - Number of Circles - (NSUInteger)numberOfCircles { @@ -132,18 +147,17 @@ - (NSUInteger)numberOfCircles return _numberOfCircles; } + + - (void)setNumberOfCircles:(NSUInteger)numberOfCircles { _numberOfCircles = numberOfCircles; - if (self.isAnimating) - { - [self removeCircles]; - [self addCircles]; - } - [self invalidateIntrinsicContentSize]; + [self refresh]; } +#pragma mark - Radius + - (CGFloat)radius { if (!_radius) return 10.f; @@ -152,11 +166,13 @@ - (CGFloat)radius - (void)setRadius:(CGFloat)radius { _radius = radius; - [self invalidateIntrinsicContentSize]; + [self refresh]; } +#pragma mark - Delay + - (CGFloat)delay { if (!_delay) return 0.2f; @@ -165,6 +181,16 @@ - (CGFloat)delay +- (void)setDelay:(CGFloat)delay +{ + _delay = delay; + [self refresh]; +} + + + +#pragma mark - Duration + - (CGFloat)duration { if (!_duration) return 0.8f; @@ -172,6 +198,16 @@ - (CGFloat)duration } + +- (void)setDuration:(CGFloat)duration +{ + _duration = duration; + [self refresh]; +} + + +#pragma mark - Internal Spacing + - (CGFloat)internalSpacing { if (!_internalSpacing) return 5; @@ -180,20 +216,19 @@ - (CGFloat)internalSpacing - (void)setInternalSpacing:(CGFloat)internalSpacing { _internalSpacing = internalSpacing; - [self invalidateIntrinsicContentSize]; + [self refresh]; } +#pragma mark - Tint Color + - (void)setTintColor:(UIColor *)tintColor { [super setTintColor:tintColor]; - - if (self.isAnimating) - { - [self removeCircles]; - [self addCircles]; - } + [self refresh]; } + + @end From c727d7bd37b25cbfbebbb4a554a9859e21e2928d Mon Sep 17 00:00:00 2001 From: Richard Das Date: Tue, 14 Apr 2015 09:27:38 +0100 Subject: [PATCH 10/10] Removed IB_DESIGNABLE (causing problems in xcode) --- .../Source/Controllers/MONViewController.m | 2 +- .../Views/MONActivityIndicatorView/MONActivityIndicatorView.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m index 6ce27bc..4e422a0 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Controllers/MONViewController.m @@ -20,7 +20,7 @@ @implementation MONViewController - (void)viewDidLoad { [super viewDidLoad]; - + MONActivityIndicatorView *indicatorView = [[MONActivityIndicatorView alloc] init]; // indicatorView.delegate = self; [indicatorView startAnimating]; diff --git a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h index 1b3e70e..bd83710 100644 --- a/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h +++ b/MONActivityIndicatorViewDemo/MONActivityIndicatorViewDemo/Source/Views/MONActivityIndicatorView/MONActivityIndicatorView.h @@ -8,7 +8,6 @@ @protocol MONActivityIndicatorViewDelegate; -IB_DESIGNABLE @interface MONActivityIndicatorView : UIView /** The number of circle indicators. */