From 4758196724372c5ee9ff3e1cb8cd7dd95dc34a8d Mon Sep 17 00:00:00 2001 From: Victor Shamanov Date: Tue, 11 Aug 2015 23:05:32 +0300 Subject: [PATCH 1/4] Add MEBadgeType and MEBadgeTypeFactory protocols --- MEBadgeFactoryType.h | 16 ++++++++++++++++ MESegmentedControl.xcodeproj/project.pbxproj | 5 +++++ MESegmentedControl/MEBadgeType.h | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 MEBadgeFactoryType.h create mode 100644 MESegmentedControl/MEBadgeType.h diff --git a/MEBadgeFactoryType.h b/MEBadgeFactoryType.h new file mode 100644 index 0000000..a476849 --- /dev/null +++ b/MEBadgeFactoryType.h @@ -0,0 +1,16 @@ +// +// MEBadgeFactoryType.h +// +// +// Created by Victor Shamanov on 8/11/15. +// +// + +#import +#import "MEBadgeType.h" + +@protocol MEBadgeFactoryType + +- (id )customBadgeWithString:(NSString *)string; + +@end diff --git a/MESegmentedControl.xcodeproj/project.pbxproj b/MESegmentedControl.xcodeproj/project.pbxproj index 0761185..f7e1693 100644 --- a/MESegmentedControl.xcodeproj/project.pbxproj +++ b/MESegmentedControl.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ 5502CF7E156B4D0500C4AC00 /* MESegmentedControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MESegmentedControl.m; sourceTree = ""; }; 5502CF7F156B4D0500C4AC00 /* CustomBadge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomBadge.h; sourceTree = ""; }; 5502CF80156B4D0500C4AC00 /* CustomBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomBadge.m; sourceTree = ""; }; + E6D6532E1B7A8C9F004A466B /* MEBadgeType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MEBadgeType.h; sourceTree = ""; }; + E6D6532F1B7A8CC3004A466B /* MEBadgeFactoryType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MEBadgeFactoryType.h; path = MESegmentedControl.xcodeproj/../MEBadgeFactoryType.h; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -112,6 +114,8 @@ 5502CF7E156B4D0500C4AC00 /* MESegmentedControl.m */, 5502CF7F156B4D0500C4AC00 /* CustomBadge.h */, 5502CF80156B4D0500C4AC00 /* CustomBadge.m */, + E6D6532F1B7A8CC3004A466B /* MEBadgeFactoryType.h */, + E6D6532E1B7A8C9F004A466B /* MEBadgeType.h */, ); name = "MESegmentedControl Library"; sourceTree = ""; @@ -295,6 +299,7 @@ 5502CF7C156B4CE200C4AC00 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/MESegmentedControl/MEBadgeType.h b/MESegmentedControl/MEBadgeType.h new file mode 100644 index 0000000..6f246fd --- /dev/null +++ b/MESegmentedControl/MEBadgeType.h @@ -0,0 +1,20 @@ +// +// MEBadgeType.h +// +// +// Created by Victor Shamanov on 8/11/15. +// +// + +#import + +@protocol MEBadgeType + +@property (nonatomic, assign, readwrite) CGRect frame; + +- (void)removeFromSuperview; +- (void)autoBadgeSizeWithString:(NSString *)string; + +- (void)addToView:(UIView *)view; + +@end From 4ce93a2318deb0f15b0a4a375cdca5de29d16212 Mon Sep 17 00:00:00 2001 From: Victor Shamanov Date: Tue, 11 Aug 2015 23:10:58 +0300 Subject: [PATCH 2/4] Add MEBadgeFactory --- MESegmentedControl.xcodeproj/project.pbxproj | 6 ++++++ MESegmentedControl/MEBadgeFactory.h | 15 +++++++++++++++ MESegmentedControl/MEBadgeFactory.m | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 MESegmentedControl/MEBadgeFactory.h create mode 100644 MESegmentedControl/MEBadgeFactory.m diff --git a/MESegmentedControl.xcodeproj/project.pbxproj b/MESegmentedControl.xcodeproj/project.pbxproj index f7e1693..37ccc06 100644 --- a/MESegmentedControl.xcodeproj/project.pbxproj +++ b/MESegmentedControl.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 5502CF77156B4CE200C4AC00 /* MEViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5502CF76156B4CE200C4AC00 /* MEViewController.m */; }; 5502CF81156B4D0500C4AC00 /* MESegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 5502CF7E156B4D0500C4AC00 /* MESegmentedControl.m */; }; 5502CF82156B4D0500C4AC00 /* CustomBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 5502CF80156B4D0500C4AC00 /* CustomBadge.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + E6D653321B7A8D3B004A466B /* MEBadgeFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E6D653311B7A8D3B004A466B /* MEBadgeFactory.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -39,6 +40,8 @@ 5502CF80156B4D0500C4AC00 /* CustomBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomBadge.m; sourceTree = ""; }; E6D6532E1B7A8C9F004A466B /* MEBadgeType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MEBadgeType.h; sourceTree = ""; }; E6D6532F1B7A8CC3004A466B /* MEBadgeFactoryType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MEBadgeFactoryType.h; path = MESegmentedControl.xcodeproj/../MEBadgeFactoryType.h; sourceTree = SOURCE_ROOT; }; + E6D653301B7A8D3B004A466B /* MEBadgeFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MEBadgeFactory.h; sourceTree = ""; }; + E6D653311B7A8D3B004A466B /* MEBadgeFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MEBadgeFactory.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -110,6 +113,8 @@ 5502CF83156B4D2000C4AC00 /* MESegmentedControl Library */ = { isa = PBXGroup; children = ( + E6D653301B7A8D3B004A466B /* MEBadgeFactory.h */, + E6D653311B7A8D3B004A466B /* MEBadgeFactory.m */, 5502CF7D156B4D0500C4AC00 /* MESegmentedControl.h */, 5502CF7E156B4D0500C4AC00 /* MESegmentedControl.m */, 5502CF7F156B4D0500C4AC00 /* CustomBadge.h */, @@ -183,6 +188,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E6D653321B7A8D3B004A466B /* MEBadgeFactory.m in Sources */, 5502CF6D156B4CE200C4AC00 /* main.m in Sources */, 5502CF71156B4CE200C4AC00 /* MEAppDelegate.m in Sources */, 5502CF77156B4CE200C4AC00 /* MEViewController.m in Sources */, diff --git a/MESegmentedControl/MEBadgeFactory.h b/MESegmentedControl/MEBadgeFactory.h new file mode 100644 index 0000000..b43a1fd --- /dev/null +++ b/MESegmentedControl/MEBadgeFactory.h @@ -0,0 +1,15 @@ +// +// MEBadgeFactory.h +// +// +// Created by Victor Shamanov on 8/11/15. +// +// + +#import + +#import "MEBadgeFactoryType.h" + +@interface MEBadgeFactory : NSObject + +@end diff --git a/MESegmentedControl/MEBadgeFactory.m b/MESegmentedControl/MEBadgeFactory.m new file mode 100644 index 0000000..6c9b9ee --- /dev/null +++ b/MESegmentedControl/MEBadgeFactory.m @@ -0,0 +1,18 @@ +// +// MEBadgeFactory.m +// +// +// Created by Victor Shamanov on 8/11/15. +// +// + +#import "MEBadgeFactory.h" +#import "CustomBadge.h" + +@implementation MEBadgeFactory + +- (id)customBadgeWithString:(NSString *)string { + return [CustomBadge customBadgeWithString:string]; +} + +@end From f433a0379466e243a0a273d8250c33a2ee5a79fb Mon Sep 17 00:00:00 2001 From: Victor Shamanov Date: Tue, 11 Aug 2015 23:11:35 +0300 Subject: [PATCH 3/4] Conform CustomBadge to MEBadgeType protocol --- MESegmentedControl/CustomBadge.h | 3 ++- MESegmentedControl/CustomBadge.m | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/MESegmentedControl/CustomBadge.h b/MESegmentedControl/CustomBadge.h index 928e32a..a37aa19 100644 --- a/MESegmentedControl/CustomBadge.h +++ b/MESegmentedControl/CustomBadge.h @@ -28,8 +28,9 @@ #import #import +#import "MEBadgeType.h" -@interface CustomBadge : UIView { +@interface CustomBadge : UIView { NSString *badgeText; UIColor *badgeTextColor; diff --git a/MESegmentedControl/CustomBadge.m b/MESegmentedControl/CustomBadge.m index 79dd28d..7c77ea0 100644 --- a/MESegmentedControl/CustomBadge.m +++ b/MESegmentedControl/CustomBadge.m @@ -30,6 +30,7 @@ - (void) drawFrameWithContext:(CGContextRef)context withRect:(CGRect)rect; @implementation CustomBadge +@dynamic frame; @synthesize badgeText; @synthesize badgeTextColor; @synthesize badgeInsetColor; @@ -39,6 +40,10 @@ @implementation CustomBadge @synthesize badgeScaleFactor; @synthesize badgeShining; +- (void)addToView:(UIView *)view { + [view addSubview:self]; +} + // I recommend to use the allocator customBadgeWithString - (id) initWithString:(NSString *)badgeString withScale:(CGFloat)scale withShining:(BOOL)shining { From 8fe39c1ecc2fcf73597099d2a04c4753a84cc8d0 Mon Sep 17 00:00:00 2001 From: Victor Shamanov Date: Tue, 11 Aug 2015 23:24:50 +0300 Subject: [PATCH 4/4] Refactor MESegmentControl to use MEBadgeFactory --- MESegmentedControl/MESegmentedControl.h | 10 +++++++--- MESegmentedControl/MESegmentedControl.m | 26 +++++++++++++++++-------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/MESegmentedControl/MESegmentedControl.h b/MESegmentedControl/MESegmentedControl.h index b7a1fe8..9b92dab 100755 --- a/MESegmentedControl/MESegmentedControl.h +++ b/MESegmentedControl/MESegmentedControl.h @@ -5,20 +5,24 @@ // Copyright (c) 2012 David Thompson. All rights reserved. // +#import "MEBadgeFactoryType.h" + @class CustomBadge; -@interface MESegmentedControl : UISegmentedControl -{ +@interface MESegmentedControl : UISegmentedControl { @private NSMutableArray *_segmentBadgeNumbers; NSMutableArray *_segmentBadges; UIView *_badgeView; } +// By default is MEBadgeFactory +@property (nonatomic, strong) id badgeFactory; + // Set the badge number for a specific segment. // Setting the badge number to 0 will clear the badge for that segment. // Use the block to make adjustments to badge formatting, using the methods outlined in CustomBadge.h. -- (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)segmentIndex usingBlock:(void(^)(CustomBadge *))configureBadge; +- (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)segmentIndex usingBlock:(void(^)(id ))configureBadge; // Convenience method for setting a badge number with default look and feel. - (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)segmentIndex; diff --git a/MESegmentedControl/MESegmentedControl.m b/MESegmentedControl/MESegmentedControl.m index cf7223c..44c53cd 100755 --- a/MESegmentedControl/MESegmentedControl.m +++ b/MESegmentedControl/MESegmentedControl.m @@ -1,6 +1,3 @@ -#import "MESegmentedControl.h" -#import "CustomBadge.h" - // // MESegmentedControl.m // @@ -8,9 +5,14 @@ // Copyright (c) 2012 David Thompson. All rights reserved. // +#import "MESegmentedControl.h" +#import "MEBadgeFactory.h" + @implementation MESegmentedControl -- (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)segmentIndex usingBlock:(void(^)(CustomBadge *))configureBadge +@synthesize badgeFactory = _badgeFactory; + +- (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)segmentIndex usingBlock:(void(^)(id ))configureBadge { // If this is the first time a badge number has been set, then initialise the badges if (_segmentBadgeNumbers.count == 0) @@ -39,11 +41,11 @@ - (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)seg if ((oldBadgeNumber == 0) && (badgeNumber > 0)) { // Add a badge, positioned on the upper right side of the requested segment - // (Assumes that all segments are the same size - if segments are of different sizes, modify the below to use the widthForSegmentAtIndex method on UISegmentedControl) - CustomBadge *customBadge = [CustomBadge customBadgeWithString:[NSString stringWithFormat:@"%d", badgeNumber]]; + id customBadge = [self.badgeFactory customBadgeWithString:[NSString stringWithFormat:@"%d", badgeNumber]]; [customBadge setFrame:CGRectMake(((self.frame.size.width/self.numberOfSegments) * (segmentIndex + 1))-customBadge.frame.size.width +5, -5, customBadge.frame.size.width, customBadge.frame.size.height)]; + [_segmentBadges replaceObjectAtIndex:segmentIndex withObject:customBadge]; - [_badgeView addSubview:customBadge]; + [customBadge addToView:_badgeView]; } else if ((oldBadgeNumber > 0) && (badgeNumber == 0)) { @@ -66,7 +68,7 @@ - (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)seg - (void)setBadgeNumber:(NSUInteger)badgeNumber forSegmentAtIndex:(NSUInteger)segmentIndex { - [self setBadgeNumber:badgeNumber forSegmentAtIndex:segmentIndex usingBlock:^(CustomBadge *badge){}]; + [self setBadgeNumber:badgeNumber forSegmentAtIndex:segmentIndex usingBlock:^(id badge){}]; } - (NSUInteger)getBadgeNumberForSegmentAtIndex:(NSUInteger)segmentIndex @@ -107,4 +109,12 @@ -(void)dealloc if (_badgeView) [_badgeView removeFromSuperview]; } +- (id )badgeFactory { + if (_badgeFactory == nil) { + _badgeFactory = [[MEBadgeFactory alloc] init]; + } + + return _badgeFactory; +} + @end