├── Classes ├── BadgeStyle.h ├── BadgeStyle.m ├── CustomBadge.h ├── CustomBadge.m ├── CustomBadgeAppDelegate.h ├── CustomBadgeAppDelegate.m ├── CustomBadgeViewController.h └── CustomBadgeViewController.m ├── CustomBadge-Info.plist ├── CustomBadge.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── CustomBadge.xccheckout │ └── xcuserdata │ │ └── sascha.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── WorkspaceSettings.xcsettings ├── sascha.pbxuser ├── sascha.perspectivev3 └── xcuserdata │ └── sascha.xcuserdatad │ └── xcschemes │ ├── CustomBadge.xcscheme │ └── xcschememanagement.plist ├── CustomBadgeViewController.xib ├── CustomBadge_Prefix.pch ├── Default-568h@2x.png ├── LICENSE ├── MainWindow.xib ├── README.markdown ├── example.png └── main.m /Classes/BadgeStyle.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ------------------------------------------------------------------------------------ 4 | BadgeStyle.h 5 | ------------------------------------------------------------------------------------ 6 | CustomBadge Version 3 comes with better separation between style and rendering. 7 | This class provides all informtion (Colors, Options, Font, ...) for the drawing 8 | The drawing itself happens in the "CustomBadge.m" class 9 | ------------------------------------------------------------------------------------ 10 | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2014 Sascha Paulus 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE. 32 | 33 | */ 34 | 35 | 36 | 37 | 38 | #import 39 | 40 | typedef enum : NSUInteger { 41 | BadgeStyleFontTypeHelveticaNeueMedium, 42 | BadgeStyleFontTypeHelveticaNeueLight, 43 | } BadgeStyleFontType; 44 | 45 | @interface BadgeStyle : NSObject { 46 | 47 | UIColor *badgeTextColor; 48 | UIColor *badgeInsetColor; 49 | UIColor *badgeFrameColor; 50 | BOOL badgeFrame; 51 | BOOL badgeShining; 52 | BadgeStyleFontType badgeFontType; 53 | 54 | } 55 | 56 | @property(nonatomic, strong) UIColor *badgeTextColor; 57 | @property(nonatomic, strong) UIColor *badgeInsetColor; 58 | @property(nonatomic, strong) UIColor *badgeFrameColor; 59 | @property(nonatomic) BadgeStyleFontType badgeFontType; 60 | @property(nonatomic) BOOL badgeFrame; 61 | @property(nonatomic) BOOL badgeShining; 62 | @property(nonatomic) BOOL badgeShadow; 63 | 64 | 65 | + (BadgeStyle*) defaultStyle; 66 | + (BadgeStyle*) oldStyle; 67 | + (BadgeStyle*) freeStyleWithTextColor:(UIColor*)textColor withInsetColor:(UIColor*)insetColor withFrameColor:(UIColor*)frameColor withFrame:(BOOL)frame withShadow:(BOOL)shadow withShining:(BOOL)shining withFontType:(BadgeStyleFontType)fontType; 68 | 69 | 70 | @end 71 | 72 | -------------------------------------------------------------------------------- /Classes/BadgeStyle.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ------------------------------------------------------------------------------------ 4 | BadgeStyle.m 5 | ------------------------------------------------------------------------------------ 6 | CustomBadge Version 3 comes with better separation between style and rendering. 7 | This class provides all informtion (Colors, Options, Font, ...) for the drawing 8 | The drawing itself happens in the "CustomBadge.m" class 9 | ------------------------------------------------------------------------------------ 10 | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2014 Sascha Paulus 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE. 32 | 33 | */ 34 | 35 | #import "BadgeStyle.h" 36 | 37 | @interface BadgeStyle () 38 | 39 | @end 40 | 41 | @implementation BadgeStyle 42 | 43 | @synthesize badgeTextColor; 44 | @synthesize badgeInsetColor; 45 | @synthesize badgeFrameColor; 46 | @synthesize badgeShining; 47 | @synthesize badgeShadow; 48 | @synthesize badgeFrame; 49 | @synthesize badgeFontType; 50 | 51 | 52 | /* Creates default BadgeStyle which means: 53 | - Helvetica Neue Light as font 54 | - White text 55 | - Red background color 56 | - No frame, shadow or shining */ 57 | + (BadgeStyle*) defaultStyle { 58 | 59 | id instance = [[super alloc] init]; 60 | [instance setBadgeFontType:BadgeStyleFontTypeHelveticaNeueLight]; 61 | [instance setBadgeTextColor:[UIColor whiteColor]]; 62 | [instance setBadgeInsetColor:[UIColor redColor]]; 63 | [instance setBadgeFrameColor:nil]; 64 | [instance setBadgeFrame:NO]; 65 | [instance setBadgeShadow:NO]; 66 | [instance setBadgeShining:NO]; 67 | return instance; 68 | } 69 | 70 | /* Creates prior to iOS7 style BadgeStyle which means: 71 | - Helvetica Neue Medium as font 72 | - White text 73 | - Red background color 74 | - With frame, shadow or shining */ 75 | + (BadgeStyle*) oldStyle { 76 | 77 | id instance = [[super alloc] init]; 78 | [instance setBadgeFontType:BadgeStyleFontTypeHelveticaNeueMedium]; 79 | [instance setBadgeTextColor:[UIColor whiteColor]]; 80 | [instance setBadgeInsetColor:[UIColor redColor]]; 81 | [instance setBadgeFrameColor:[UIColor whiteColor]]; 82 | [instance setBadgeFrame:YES]; 83 | [instance setBadgeShadow:YES]; 84 | [instance setBadgeShining:YES]; 85 | return instance; 86 | } 87 | 88 | 89 | /* Create your own BadgeStyle */ 90 | + (BadgeStyle*) freeStyleWithTextColor:(UIColor*)textColor withInsetColor:(UIColor*)insetColor withFrameColor:(UIColor*)frameColor withFrame:(BOOL)frame withShadow:(BOOL)shadow withShining:(BOOL)shining withFontType:(BadgeStyleFontType)fontType { 91 | 92 | id instance = [[super alloc] init]; 93 | [instance setBadgeFontType:fontType]; 94 | [instance setBadgeTextColor:textColor]; 95 | [instance setBadgeInsetColor:insetColor]; 96 | [instance setBadgeFrameColor:frameColor]; 97 | [instance setBadgeFrame:frame]; 98 | [instance setBadgeShadow:shadow]; 99 | [instance setBadgeShining:shining]; 100 | return instance; 101 | 102 | } 103 | 104 | 105 | 106 | 107 | 108 | @end 109 | -------------------------------------------------------------------------------- /Classes/CustomBadge.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ------------------------------------------------------------------------------------ 4 | CustomBadge.h 5 | ------------------------------------------------------------------------------------ 6 | CustomBadge is an UIView which draws a customizable badge on any other view. 7 | The latest version has separation between style and rendering. 8 | This class is the core of CustomBadge where the actual rendering happens. 9 | It recommended to use the convenient allocators instead of the init methods. 10 | ------------------------------------------------------------------------------------ 11 | 12 | The MIT License (MIT) 13 | 14 | Copyright (c) 2014 Sascha Paulus 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining a copy 17 | of this software and associated documentation files (the "Software"), to deal 18 | in the Software without restriction, including without limitation the rights 19 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 20 | copies of the Software, and to permit persons to whom the Software is 21 | furnished to do so, subject to the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included in all 24 | copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 | SOFTWARE. 33 | 34 | */ 35 | 36 | #import 37 | #import 38 | #import "BadgeStyle.h" 39 | 40 | @interface CustomBadge : UIView { 41 | NSString *badgeText; 42 | CGFloat badgeCornerRoundness; 43 | CGFloat badgeScaleFactor; 44 | BadgeStyle *badgeStyle; 45 | } 46 | 47 | @property(nonatomic, strong) NSString *badgeText; 48 | @property(nonatomic, strong) BadgeStyle *badgeStyle; 49 | @property(nonatomic) CGFloat badgeCornerRoundness; 50 | @property(nonatomic) CGFloat badgeScaleFactor; 51 | 52 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString; 53 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withScale:(CGFloat)scale; 54 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withStyle:(BadgeStyle*)style; 55 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withScale:(CGFloat)scale withStyle:(BadgeStyle*)style; 56 | 57 | - (void) autoBadgeSizeWithString:(NSString *)badgeString; 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /Classes/CustomBadge.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ------------------------------------------------------------------------------------ 4 | CustomBadge.m 5 | ------------------------------------------------------------------------------------ 6 | CustomBadge is an UIView which draws a customizable badge on any other view. 7 | The latest version has separation between style and rendering. 8 | This class is the core of CustomBadge where the actual rendering happens. 9 | It recommended to use the convenient allocators instead of the init methods. 10 | ------------------------------------------------------------------------------------ 11 | 12 | The MIT License (MIT) 13 | 14 | Copyright (c) 2014 Sascha Paulus 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining a copy 17 | of this software and associated documentation files (the "Software"), to deal 18 | in the Software without restriction, including without limitation the rights 19 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 20 | copies of the Software, and to permit persons to whom the Software is 21 | furnished to do so, subject to the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included in all 24 | copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 | SOFTWARE. 33 | 34 | */ 35 | 36 | 37 | #import "CustomBadge.h" 38 | 39 | 40 | @interface CustomBadge() 41 | 42 | @property(nonatomic) UIFont *badgeFont; 43 | 44 | - (void) drawRoundedRectWithContext:(CGContextRef)context withRect:(CGRect)rect; 45 | - (void) drawFrameWithContext:(CGContextRef)context withRect:(CGRect)rect; 46 | 47 | @end 48 | 49 | @implementation CustomBadge 50 | 51 | @synthesize badgeText; 52 | @synthesize badgeCornerRoundness; 53 | @synthesize badgeScaleFactor; 54 | @synthesize badgeStyle; 55 | 56 | // I recommend to use one of the allocators like customBadgeWithString 57 | - (id) initWithString:(NSString *)badgeString withScale:(CGFloat)scale withStyle:(BadgeStyle*)style 58 | { 59 | self = [super initWithFrame:CGRectMake(0, 0, 25, 25)]; 60 | if(self!=nil) { 61 | self.contentScaleFactor = [[UIScreen mainScreen] scale]; 62 | self.backgroundColor = [UIColor clearColor]; 63 | self.badgeText = badgeString; 64 | self.badgeStyle = style; 65 | self.badgeCornerRoundness = 0.4; 66 | self.badgeScaleFactor = scale; 67 | [self autoBadgeSizeWithString:badgeString]; 68 | } 69 | return self; 70 | } 71 | 72 | 73 | // Use this method if you want to change the badge text after the first rendering 74 | - (void) autoBadgeSizeWithString:(NSString *)badgeString 75 | { 76 | CGSize retValue; 77 | CGFloat rectWidth, rectHeight; 78 | NSDictionary *fontAttr = @{ NSFontAttributeName : [self fontForBadgeWithSize:12] }; 79 | CGSize stringSize = [badgeString sizeWithAttributes:fontAttr]; 80 | CGFloat flexSpace; 81 | if ([badgeString length]>=2) { 82 | flexSpace = [badgeString length]; 83 | rectWidth = 25 + (stringSize.width + flexSpace); rectHeight = 25; 84 | retValue = CGSizeMake(rectWidth*badgeScaleFactor, rectHeight*badgeScaleFactor); 85 | } else { 86 | retValue = CGSizeMake(25*badgeScaleFactor, 25*badgeScaleFactor); 87 | } 88 | self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, retValue.width, retValue.height); 89 | self.badgeText = badgeString; 90 | [self setNeedsDisplay]; 91 | } 92 | 93 | 94 | // Creates a Badge with a given Text in default BadgeStyle and normal scale 95 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString 96 | { 97 | return [[self alloc] initWithString:badgeString withScale:1.0 withStyle:[BadgeStyle defaultStyle]]; 98 | } 99 | 100 | // Creates a Badge with a given Text in default BadgeStyle and given scale 101 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withScale:(CGFloat)scale { 102 | 103 | return [[self alloc] initWithString:badgeString withScale:scale withStyle:[BadgeStyle defaultStyle]]; 104 | 105 | } 106 | 107 | // Creates a Badge with a given Text in given BadgeStyle and normal scale 108 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withStyle:(BadgeStyle*)style 109 | { 110 | return [[self alloc] initWithString:badgeString withScale:1.0 withStyle:style]; 111 | } 112 | 113 | 114 | // Creates a Badge with a given Text in given BadgeStyle and a given scale 115 | + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withScale:(CGFloat)scale withStyle:(BadgeStyle*)style { 116 | 117 | return [[self alloc] initWithString:badgeString withScale:scale withStyle:style]; 118 | 119 | } 120 | 121 | 122 | // Draws the Badge with Quartz 123 | -(void) drawRoundedRectWithContext:(CGContextRef)context withRect:(CGRect)rect 124 | { 125 | CGContextSaveGState(context); 126 | 127 | CGFloat radius = CGRectGetMaxY(rect)*self.badgeCornerRoundness; 128 | CGFloat puffer = CGRectGetMaxY(rect)*0.10; 129 | CGFloat maxX = CGRectGetMaxX(rect) - puffer; 130 | CGFloat maxY = CGRectGetMaxY(rect) - puffer; 131 | CGFloat minX = CGRectGetMinX(rect) + puffer; 132 | CGFloat minY = CGRectGetMinY(rect) + puffer; 133 | 134 | CGContextBeginPath(context); 135 | CGContextSetFillColorWithColor(context, [self.badgeStyle.badgeInsetColor CGColor]); 136 | CGContextAddArc(context, maxX-radius, minY+radius, radius, M_PI+(M_PI/2), 0, 0); 137 | CGContextAddArc(context, maxX-radius, maxY-radius, radius, 0, M_PI/2, 0); 138 | CGContextAddArc(context, minX+radius, maxY-radius, radius, M_PI/2, M_PI, 0); 139 | CGContextAddArc(context, minX+radius, minY+radius, radius, M_PI, M_PI+M_PI/2, 0); 140 | if (self.badgeStyle.badgeShadow) { 141 | CGContextSetShadowWithColor(context, CGSizeMake(1.0,1.0), 3, [[UIColor blackColor] CGColor]); 142 | } 143 | CGContextFillPath(context); 144 | 145 | CGContextRestoreGState(context); 146 | 147 | } 148 | 149 | // Draws the Badge Shine with Quartz 150 | -(void) drawShineWithContext:(CGContextRef)context withRect:(CGRect)rect 151 | { 152 | CGContextSaveGState(context); 153 | 154 | CGFloat radius = CGRectGetMaxY(rect)*self.badgeCornerRoundness; 155 | CGFloat puffer = CGRectGetMaxY(rect)*0.10; 156 | CGFloat maxX = CGRectGetMaxX(rect) - puffer; 157 | CGFloat maxY = CGRectGetMaxY(rect) - puffer; 158 | CGFloat minX = CGRectGetMinX(rect) + puffer; 159 | CGFloat minY = CGRectGetMinY(rect) + puffer; 160 | CGContextBeginPath(context); 161 | CGContextAddArc(context, maxX-radius, minY+radius, radius, M_PI+(M_PI/2), 0, 0); 162 | CGContextAddArc(context, maxX-radius, maxY-radius, radius, 0, M_PI/2, 0); 163 | CGContextAddArc(context, minX+radius, maxY-radius, radius, M_PI/2, M_PI, 0); 164 | CGContextAddArc(context, minX+radius, minY+radius, radius, M_PI, M_PI+M_PI/2, 0); 165 | CGContextClip(context); 166 | 167 | 168 | size_t num_locations = 2; 169 | CGFloat locations[2] = { 0.0, 0.4 }; 170 | CGFloat components[8] = { 0.92, 0.92, 0.92, 1.0, 0.82, 0.82, 0.82, 0.4 }; 171 | 172 | CGColorSpaceRef cspace; 173 | CGGradientRef gradient; 174 | cspace = CGColorSpaceCreateDeviceRGB(); 175 | gradient = CGGradientCreateWithColorComponents (cspace, components, locations, num_locations); 176 | 177 | CGPoint sPoint, ePoint; 178 | sPoint.x = 0; 179 | sPoint.y = 0; 180 | ePoint.x = 0; 181 | ePoint.y = maxY; 182 | CGContextDrawLinearGradient (context, gradient, sPoint, ePoint, 0); 183 | 184 | CGColorSpaceRelease(cspace); 185 | CGGradientRelease(gradient); 186 | 187 | CGContextRestoreGState(context); 188 | } 189 | 190 | 191 | // Draws the Badge Frame with Quartz 192 | -(void) drawFrameWithContext:(CGContextRef)context withRect:(CGRect)rect 193 | { 194 | CGFloat radius = CGRectGetMaxY(rect)*self.badgeCornerRoundness; 195 | CGFloat puffer = CGRectGetMaxY(rect)*0.10; 196 | 197 | CGFloat maxX = CGRectGetMaxX(rect) - puffer; 198 | CGFloat maxY = CGRectGetMaxY(rect) - puffer; 199 | CGFloat minX = CGRectGetMinX(rect) + puffer; 200 | CGFloat minY = CGRectGetMinY(rect) + puffer; 201 | 202 | 203 | CGContextBeginPath(context); 204 | CGFloat lineSize = 2; 205 | if(self.badgeScaleFactor>1) { 206 | lineSize += self.badgeScaleFactor*0.25; 207 | } 208 | CGContextSetLineWidth(context, lineSize); 209 | CGContextSetStrokeColorWithColor(context, [self.badgeStyle.badgeFrameColor CGColor]); 210 | CGContextAddArc(context, maxX-radius, minY+radius, radius, M_PI+(M_PI/2), 0, 0); 211 | CGContextAddArc(context, maxX-radius, maxY-radius, radius, 0, M_PI/2, 0); 212 | CGContextAddArc(context, minX+radius, maxY-radius, radius, M_PI/2, M_PI, 0); 213 | CGContextAddArc(context, minX+radius, minY+radius, radius, M_PI, M_PI+M_PI/2, 0); 214 | CGContextClosePath(context); 215 | CGContextStrokePath(context); 216 | } 217 | 218 | 219 | - (UIFont*) fontForBadgeWithSize:(CGFloat)size { 220 | switch (self.badgeStyle.badgeFontType) { 221 | case BadgeStyleFontTypeHelveticaNeueMedium: 222 | return [UIFont fontWithName:@"HelveticaNeue-Medium" size:size]; 223 | break; 224 | default: 225 | return [UIFont fontWithName:@"HelveticaNeue-Light" size:size]; 226 | break; 227 | } 228 | } 229 | 230 | - (void)drawRect:(CGRect)rect { 231 | 232 | CGContextRef context = UIGraphicsGetCurrentContext(); 233 | [self drawRoundedRectWithContext:context withRect:rect]; 234 | 235 | if(self.badgeStyle.badgeShining) { 236 | [self drawShineWithContext:context withRect:rect]; 237 | } 238 | 239 | if (self.badgeStyle.badgeFrame) { 240 | [self drawFrameWithContext:context withRect:rect]; 241 | } 242 | 243 | if ([self.badgeText length]>0) { 244 | CGFloat sizeOfFont = 13.5*badgeScaleFactor; 245 | if ([self.badgeText length]<2) { 246 | sizeOfFont += sizeOfFont * 0.20f; 247 | } 248 | UIFont *textFont = [self fontForBadgeWithSize:sizeOfFont]; 249 | NSDictionary *fontAttr = @{ NSFontAttributeName : textFont, NSForegroundColorAttributeName : self.badgeStyle.badgeTextColor }; 250 | CGSize textSize = [self.badgeText sizeWithAttributes:fontAttr]; 251 | CGPoint textPoint = CGPointMake((rect.size.width/2-textSize.width/2), (rect.size.height/2-textSize.height/2) - 1 ); 252 | [self.badgeText drawAtPoint:textPoint withAttributes:fontAttr]; 253 | } 254 | } 255 | 256 | 257 | 258 | 259 | @end 260 | -------------------------------------------------------------------------------- /Classes/CustomBadgeAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // CustomBadgeAppDelegate.h 3 | // CustomBadge 4 | // 5 | 6 | 7 | #import 8 | 9 | @class CustomBadgeViewController; 10 | 11 | @interface CustomBadgeAppDelegate : NSObject { 12 | UIWindow *window; 13 | CustomBadgeViewController *viewController; 14 | } 15 | 16 | @property (nonatomic) IBOutlet UIWindow *window; 17 | @property (nonatomic) IBOutlet CustomBadgeViewController *viewController; 18 | 19 | @end 20 | 21 | -------------------------------------------------------------------------------- /Classes/CustomBadgeAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // CustomBadgeAppDelegate.m 3 | // CustomBadge 4 | // 5 | 6 | 7 | #import "CustomBadgeAppDelegate.h" 8 | #import "CustomBadgeViewController.h" 9 | 10 | @implementation CustomBadgeAppDelegate 11 | 12 | @synthesize window; 13 | @synthesize viewController; 14 | 15 | 16 | #pragma mark - 17 | #pragma mark Application lifecycle 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 20 | 21 | // Override point for customization after application launch. 22 | 23 | // Add the view controller's view to the window and display. 24 | [window addSubview:viewController.view]; 25 | [window makeKeyAndVisible]; 26 | 27 | return YES; 28 | } 29 | 30 | 31 | - (void)applicationWillResignActive:(UIApplication *)application { 32 | /* 33 | Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 34 | Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 35 | */ 36 | } 37 | 38 | 39 | - (void)applicationDidEnterBackground:(UIApplication *)application { 40 | /* 41 | Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 42 | If your application supports background execution, called instead of applicationWillTerminate: when the user quits. 43 | */ 44 | } 45 | 46 | 47 | - (void)applicationWillEnterForeground:(UIApplication *)application { 48 | /* 49 | Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. 50 | */ 51 | } 52 | 53 | 54 | - (void)applicationDidBecomeActive:(UIApplication *)application { 55 | /* 56 | Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 57 | */ 58 | } 59 | 60 | 61 | - (void)applicationWillTerminate:(UIApplication *)application { 62 | /* 63 | Called when the application is about to terminate. 64 | See also applicationDidEnterBackground:. 65 | */ 66 | } 67 | 68 | 69 | #pragma mark - 70 | #pragma mark Memory management 71 | 72 | - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 73 | /* 74 | Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. 75 | */ 76 | } 77 | 78 | 79 | 80 | 81 | @end 82 | -------------------------------------------------------------------------------- /Classes/CustomBadgeViewController.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ------------------------------------------------------------------------------------ 4 | CustomBadgeViewController.h 5 | ------------------------------------------------------------------------------------ 6 | This is an example which shows the diversity of CustomerBadge. 7 | With Version 3 comes with better separation between style and rendering. 8 | BadgeStyle.m contains all style information; In CustomBadge.m happens the rendering. 9 | ------------------------------------------------------------------------------------ 10 | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2014 Sascha Paulus 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE. 32 | 33 | */ 34 | 35 | 36 | #import 37 | 38 | @interface CustomBadgeViewController : UIViewController { 39 | 40 | } 41 | 42 | @end 43 | 44 | -------------------------------------------------------------------------------- /Classes/CustomBadgeViewController.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ------------------------------------------------------------------------------------ 4 | CustomBadgeViewController.h 5 | ------------------------------------------------------------------------------------ 6 | This is an example which shows the diversity of CustomerBadge. 7 | With Version 3 comes with better separation between style and rendering. 8 | BadgeStyle.m contains all style information; In CustomBadge.m happens the rendering. 9 | ------------------------------------------------------------------------------------ 10 | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2014 Sascha Paulus 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE. 32 | 33 | */ 34 | 35 | #import "CustomBadgeViewController.h" 36 | #import "CustomBadge.h" 37 | 38 | @implementation CustomBadgeViewController 39 | 40 | 41 | - (void) viewDidLoad 42 | { 43 | 44 | [super viewDidLoad]; 45 | 46 | // An array to hold the badges 47 | NSMutableArray *badges = [NSMutableArray array]; 48 | 49 | 50 | // Creates a badge with scale of 1.5 51 | CustomBadge *badge1 = [CustomBadge customBadgeWithString:@"CustomBadge" withScale:1.5]; 52 | [badges addObject:badge1]; 53 | 54 | // Creates a badge with pre-defined style "old" (for prior-iOS7 style) 55 | CustomBadge *badge2 = [CustomBadge customBadgeWithString:@"Old iOS Style" withScale:1.5 withStyle:[BadgeStyle oldStyle]]; 56 | [badges addObject:badge2]; 57 | 58 | // Creates a badge with free customer definitions 59 | BadgeStyle *badge3Style = [BadgeStyle freeStyleWithTextColor:[UIColor whiteColor] 60 | withInsetColor:[UIColor blueColor] 61 | withFrameColor:nil 62 | withFrame:NO 63 | withShadow:NO 64 | withShining:NO 65 | withFontType:BadgeStyleFontTypeHelveticaNeueLight]; 66 | 67 | CustomBadge *badge3 = [CustomBadge customBadgeWithString:@"Retina ready!" withScale:1.5 withStyle:badge3Style]; 68 | [badges addObject:badge3]; 69 | 70 | BadgeStyle *badge4Style = [BadgeStyle freeStyleWithTextColor:[UIColor whiteColor] 71 | withInsetColor:[UIColor purpleColor] 72 | withFrameColor:[UIColor blackColor] 73 | withFrame:YES 74 | withShadow:YES 75 | withShining:YES 76 | withFontType:BadgeStyleFontTypeHelveticaNeueLight]; 77 | 78 | CustomBadge *badge4 = [CustomBadge customBadgeWithString:@"Highly customizable" withScale:2.0 withStyle:badge4Style]; 79 | [badges addObject:badge4]; 80 | 81 | CustomBadge *badge5 = [CustomBadge customBadgeWithString:@"1"]; 82 | [badges addObject:badge5]; 83 | 84 | CustomBadge *badge6 = [CustomBadge customBadgeWithString:@"2" withStyle:[BadgeStyle oldStyle]]; 85 | [badges addObject:badge6]; 86 | 87 | 88 | // Creates a baddge ... 89 | CustomBadge *badge7 = [CustomBadge customBadgeWithString:@"Easy to use"]; 90 | [badges addObject:badge7]; 91 | [badge7.badgeStyle setBadgeTextColor:[UIColor blackColor]]; 92 | [badge7.badgeStyle setBadgeInsetColor:[UIColor whiteColor]]; 93 | [badge7.badgeStyle setBadgeShadow:YES]; 94 | // ... and change it afterwards with autoBadgeSizeWithString 95 | [badge7 autoBadgeSizeWithString:@"Easy to use & flexible"]; 96 | 97 | CustomBadge *badge8 = [CustomBadge customBadgeWithString:@"Still Open & Free" withScale:1.25]; 98 | [badge8.badgeStyle setBadgeShadow:YES]; 99 | [badge8.badgeStyle setBadgeFrame:YES]; 100 | [badge8.badgeStyle setBadgeFrameColor:[UIColor yellowColor]]; 101 | [badges addObject:badge8]; 102 | 103 | 104 | 105 | // Put all badges to the screen 106 | for (int i=0; i 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | 30 | 31 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D3623260D0F684500981E51 /* CustomBadgeAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CustomBadgeAppDelegate.m */; }; 11 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 15 | 2899E5220DE3E06400AC0155 /* CustomBadgeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* CustomBadgeViewController.xib */; }; 16 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 17 | 28D7ACF80DDB3853001CB0EB /* CustomBadgeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* CustomBadgeViewController.m */; }; 18 | 2B013E0C1A07A9AF00815F52 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2B013E0B1A07A9AF00815F52 /* Default-568h@2x.png */; }; 19 | 2B2D78D71A0CEBCC00E153D9 /* BadgeStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B2D78D61A0CEBCC00E153D9 /* BadgeStyle.m */; }; 20 | 2B3EB1EA1219595D00E3C351 /* CustomBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B3EB1E81219595D00E3C351 /* CustomBadge.m */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 25 | 1D3623240D0F684500981E51 /* CustomBadgeAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomBadgeAppDelegate.h; sourceTree = ""; }; 26 | 1D3623250D0F684500981E51 /* CustomBadgeAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomBadgeAppDelegate.m; sourceTree = ""; }; 27 | 1D6058910D05DD3D006BFB54 /* CustomBadge.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CustomBadge.app; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 29 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 30 | 2899E5210DE3E06400AC0155 /* CustomBadgeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CustomBadgeViewController.xib; sourceTree = ""; }; 31 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 32 | 28D7ACF60DDB3853001CB0EB /* CustomBadgeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomBadgeViewController.h; sourceTree = ""; }; 33 | 28D7ACF70DDB3853001CB0EB /* CustomBadgeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomBadgeViewController.m; sourceTree = ""; }; 34 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 35 | 2B013E0B1A07A9AF00815F52 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 36 | 2B2D78D51A0CEBCC00E153D9 /* BadgeStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BadgeStyle.h; sourceTree = ""; }; 37 | 2B2D78D61A0CEBCC00E153D9 /* BadgeStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BadgeStyle.m; sourceTree = ""; }; 38 | 2B3EB1E81219595D00E3C351 /* CustomBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomBadge.m; sourceTree = ""; }; 39 | 2B3EB1E91219595D00E3C351 /* CustomBadge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomBadge.h; sourceTree = ""; }; 40 | 32CA4F630368D1EE00C91783 /* CustomBadge_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomBadge_Prefix.pch; sourceTree = ""; }; 41 | 8D1107310486CEB800E47090 /* CustomBadge-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CustomBadge-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 42 | /* End PBXFileReference section */ 43 | 44 | /* Begin PBXFrameworksBuildPhase section */ 45 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 50 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 51 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 080E96DDFE201D6D7F000001 /* Classes */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 2B3EB1E91219595D00E3C351 /* CustomBadge.h */, 62 | 2B3EB1E81219595D00E3C351 /* CustomBadge.m */, 63 | 2B2D78D51A0CEBCC00E153D9 /* BadgeStyle.h */, 64 | 2B2D78D61A0CEBCC00E153D9 /* BadgeStyle.m */, 65 | 1D3623240D0F684500981E51 /* CustomBadgeAppDelegate.h */, 66 | 1D3623250D0F684500981E51 /* CustomBadgeAppDelegate.m */, 67 | 28D7ACF60DDB3853001CB0EB /* CustomBadgeViewController.h */, 68 | 28D7ACF70DDB3853001CB0EB /* CustomBadgeViewController.m */, 69 | ); 70 | path = Classes; 71 | sourceTree = ""; 72 | }; 73 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | 1D6058910D05DD3D006BFB54 /* CustomBadge.app */, 77 | ); 78 | name = Products; 79 | sourceTree = ""; 80 | }; 81 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 2B013E0B1A07A9AF00815F52 /* Default-568h@2x.png */, 85 | 080E96DDFE201D6D7F000001 /* Classes */, 86 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 87 | 29B97317FDCFA39411CA2CEA /* Resources */, 88 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 89 | 19C28FACFE9D520D11CA2CBB /* Products */, 90 | ); 91 | name = CustomTemplate; 92 | sourceTree = ""; 93 | }; 94 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 32CA4F630368D1EE00C91783 /* CustomBadge_Prefix.pch */, 98 | 29B97316FDCFA39411CA2CEA /* main.m */, 99 | ); 100 | name = "Other Sources"; 101 | sourceTree = ""; 102 | }; 103 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 2899E5210DE3E06400AC0155 /* CustomBadgeViewController.xib */, 107 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 108 | 8D1107310486CEB800E47090 /* CustomBadge-Info.plist */, 109 | ); 110 | name = Resources; 111 | sourceTree = ""; 112 | }; 113 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 117 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 118 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */, 119 | ); 120 | name = Frameworks; 121 | sourceTree = ""; 122 | }; 123 | /* End PBXGroup section */ 124 | 125 | /* Begin PBXNativeTarget section */ 126 | 1D6058900D05DD3D006BFB54 /* CustomBadge */ = { 127 | isa = PBXNativeTarget; 128 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CustomBadge" */; 129 | buildPhases = ( 130 | 1D60588D0D05DD3D006BFB54 /* Resources */, 131 | 1D60588E0D05DD3D006BFB54 /* Sources */, 132 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 133 | ); 134 | buildRules = ( 135 | ); 136 | dependencies = ( 137 | ); 138 | name = CustomBadge; 139 | productName = CustomBadge; 140 | productReference = 1D6058910D05DD3D006BFB54 /* CustomBadge.app */; 141 | productType = "com.apple.product-type.application"; 142 | }; 143 | /* End PBXNativeTarget section */ 144 | 145 | /* Begin PBXProject section */ 146 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 147 | isa = PBXProject; 148 | attributes = { 149 | LastUpgradeCheck = 0610; 150 | }; 151 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CustomBadge" */; 152 | compatibilityVersion = "Xcode 3.2"; 153 | developmentRegion = English; 154 | hasScannedForEncodings = 1; 155 | knownRegions = ( 156 | English, 157 | Japanese, 158 | French, 159 | German, 160 | ); 161 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 162 | projectDirPath = ""; 163 | projectRoot = ""; 164 | targets = ( 165 | 1D6058900D05DD3D006BFB54 /* CustomBadge */, 166 | ); 167 | }; 168 | /* End PBXProject section */ 169 | 170 | /* Begin PBXResourcesBuildPhase section */ 171 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 172 | isa = PBXResourcesBuildPhase; 173 | buildActionMask = 2147483647; 174 | files = ( 175 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 176 | 2899E5220DE3E06400AC0155 /* CustomBadgeViewController.xib in Resources */, 177 | 2B013E0C1A07A9AF00815F52 /* Default-568h@2x.png in Resources */, 178 | ); 179 | runOnlyForDeploymentPostprocessing = 0; 180 | }; 181 | /* End PBXResourcesBuildPhase section */ 182 | 183 | /* Begin PBXSourcesBuildPhase section */ 184 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 185 | isa = PBXSourcesBuildPhase; 186 | buildActionMask = 2147483647; 187 | files = ( 188 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 189 | 2B2D78D71A0CEBCC00E153D9 /* BadgeStyle.m in Sources */, 190 | 1D3623260D0F684500981E51 /* CustomBadgeAppDelegate.m in Sources */, 191 | 28D7ACF80DDB3853001CB0EB /* CustomBadgeViewController.m in Sources */, 192 | 2B3EB1EA1219595D00E3C351 /* CustomBadge.m in Sources */, 193 | ); 194 | runOnlyForDeploymentPostprocessing = 0; 195 | }; 196 | /* End PBXSourcesBuildPhase section */ 197 | 198 | /* Begin XCBuildConfiguration section */ 199 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 200 | isa = XCBuildConfiguration; 201 | buildSettings = { 202 | ALWAYS_SEARCH_USER_PATHS = NO; 203 | CLANG_ENABLE_OBJC_ARC = YES; 204 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; 205 | COPY_PHASE_STRIP = NO; 206 | GCC_DYNAMIC_NO_PIC = NO; 207 | GCC_OPTIMIZATION_LEVEL = 0; 208 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 209 | GCC_PREFIX_HEADER = CustomBadge_Prefix.pch; 210 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 211 | INFOPLIST_FILE = "CustomBadge-Info.plist"; 212 | PRODUCT_NAME = CustomBadge; 213 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 214 | SDKROOT = iphoneos; 215 | }; 216 | name = Debug; 217 | }; 218 | 1D6058950D05DD3E006BFB54 /* Release */ = { 219 | isa = XCBuildConfiguration; 220 | buildSettings = { 221 | ALWAYS_SEARCH_USER_PATHS = NO; 222 | CLANG_ENABLE_OBJC_ARC = YES; 223 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; 224 | COPY_PHASE_STRIP = YES; 225 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 226 | GCC_PREFIX_HEADER = CustomBadge_Prefix.pch; 227 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 228 | INFOPLIST_FILE = "CustomBadge-Info.plist"; 229 | PRODUCT_NAME = CustomBadge; 230 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 231 | SDKROOT = iphoneos; 232 | VALIDATE_PRODUCT = YES; 233 | }; 234 | name = Release; 235 | }; 236 | C01FCF4F08A954540054247B /* Debug */ = { 237 | isa = XCBuildConfiguration; 238 | buildSettings = { 239 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; 240 | GCC_C_LANGUAGE_STANDARD = "compiler-default"; 241 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 242 | GCC_WARN_UNUSED_VARIABLE = YES; 243 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 244 | ONLY_ACTIVE_ARCH = YES; 245 | PREBINDING = ""; 246 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 247 | SDKROOT = iphoneos; 248 | }; 249 | name = Debug; 250 | }; 251 | C01FCF5008A954540054247B /* Release */ = { 252 | isa = XCBuildConfiguration; 253 | buildSettings = { 254 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; 255 | GCC_C_LANGUAGE_STANDARD = "compiler-default"; 256 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 257 | GCC_WARN_UNUSED_VARIABLE = YES; 258 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 259 | OTHER_CFLAGS = ""; 260 | PREBINDING = ""; 261 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 262 | SDKROOT = iphoneos; 263 | }; 264 | name = Release; 265 | }; 266 | /* End XCBuildConfiguration section */ 267 | 268 | /* Begin XCConfigurationList section */ 269 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CustomBadge" */ = { 270 | isa = XCConfigurationList; 271 | buildConfigurations = ( 272 | 1D6058940D05DD3E006BFB54 /* Debug */, 273 | 1D6058950D05DD3E006BFB54 /* Release */, 274 | ); 275 | defaultConfigurationIsVisible = 0; 276 | defaultConfigurationName = Release; 277 | }; 278 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CustomBadge" */ = { 279 | isa = XCConfigurationList; 280 | buildConfigurations = ( 281 | C01FCF4F08A954540054247B /* Debug */, 282 | C01FCF5008A954540054247B /* Release */, 283 | ); 284 | defaultConfigurationIsVisible = 0; 285 | defaultConfigurationName = Release; 286 | }; 287 | /* End XCConfigurationList section */ 288 | }; 289 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 290 | } 291 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/project.xcworkspace/xcshareddata/CustomBadge.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | B648DD10-EDB0-4BC9-BC52-7223C1F9A406 9 | IDESourceControlProjectName 10 | CustomBadge 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | E3CF2773A872EB474970B53B3A195037653BA800 14 | https://github.com/ckteebe/CustomBadge.git 15 | 16 | IDESourceControlProjectPath 17 | CustomBadge.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | E3CF2773A872EB474970B53B3A195037653BA800 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/ckteebe/CustomBadge.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | E3CF2773A872EB474970B53B3A195037653BA800 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | E3CF2773A872EB474970B53B3A195037653BA800 36 | IDESourceControlWCCName 37 | CustomBadge 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/project.xcworkspace/xcuserdata/sascha.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ckteebe/CustomBadge/cbc5ad88f350e7783f5b77c8e3044b23b6b5876f/CustomBadge.xcodeproj/project.xcworkspace/xcuserdata/sascha.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/project.xcworkspace/xcuserdata/sascha.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/sascha.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 1D3623240D0F684500981E51 /* CustomBadgeAppDelegate.h */ = { 4 | uiCtxt = { 5 | sepNavIntBoundsRect = "{{0, 0}, {1526, 549}}"; 6 | sepNavSelRange = "{0, 0}"; 7 | sepNavVisRange = "{0, 507}"; 8 | }; 9 | }; 10 | 1D3623250D0F684500981E51 /* CustomBadgeAppDelegate.m */ = { 11 | uiCtxt = { 12 | sepNavIntBoundsRect = "{{0, 0}, {1965, 1392}}"; 13 | sepNavSelRange = "{0, 0}"; 14 | sepNavVisRange = "{3, 1224}"; 15 | }; 16 | }; 17 | 1D6058900D05DD3D006BFB54 /* CustomBadge */ = { 18 | activeExec = 0; 19 | executables = ( 20 | 2B3EB1DC1219594800E3C351 /* CustomBadge */, 21 | ); 22 | }; 23 | 28D7ACF60DDB3853001CB0EB /* CustomBadgeViewController.h */ = { 24 | uiCtxt = { 25 | sepNavIntBoundsRect = "{{0, 0}, {1526, 549}}"; 26 | sepNavSelRange = "{0, 0}"; 27 | sepNavVisRange = "{0, 254}"; 28 | }; 29 | }; 30 | 28D7ACF70DDB3853001CB0EB /* CustomBadgeViewController.m */ = { 31 | uiCtxt = { 32 | sepNavIntBoundsRect = "{{0, 0}, {1526, 2160}}"; 33 | sepNavSelRange = "{592, 0}"; 34 | sepNavVisRange = "{160, 1111}"; 35 | }; 36 | }; 37 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 38 | activeBuildConfigurationName = Debug; 39 | activeExecutable = 2B3EB1DC1219594800E3C351 /* CustomBadge */; 40 | activeSDKPreference = iphonesimulator4.2; 41 | activeTarget = 1D6058900D05DD3D006BFB54 /* CustomBadge */; 42 | addToTargets = ( 43 | 1D6058900D05DD3D006BFB54 /* CustomBadge */, 44 | ); 45 | breakpoints = ( 46 | ); 47 | codeSenseManager = 2B3EB1EC1219595D00E3C351 /* Code sense */; 48 | executables = ( 49 | 2B3EB1DC1219594800E3C351 /* CustomBadge */, 50 | ); 51 | perUserDictionary = { 52 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 53 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 54 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 55 | PBXFileTableDataSourceColumnWidthsKey = ( 56 | 20, 57 | 1348, 58 | 20, 59 | 48, 60 | 43, 61 | 43, 62 | 20, 63 | ); 64 | PBXFileTableDataSourceColumnsKey = ( 65 | PBXFileDataSource_FiletypeID, 66 | PBXFileDataSource_Filename_ColumnID, 67 | PBXFileDataSource_Built_ColumnID, 68 | PBXFileDataSource_ObjectSize_ColumnID, 69 | PBXFileDataSource_Errors_ColumnID, 70 | PBXFileDataSource_Warnings_ColumnID, 71 | PBXFileDataSource_Target_ColumnID, 72 | ); 73 | }; 74 | PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = { 75 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 76 | PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID; 77 | PBXFileTableDataSourceColumnWidthsKey = ( 78 | 16, 79 | 200, 80 | 50, 81 | 636, 82 | ); 83 | PBXFileTableDataSourceColumnsKey = ( 84 | PBXSymbolsDataSource_SymbolTypeIconID, 85 | PBXSymbolsDataSource_SymbolNameID, 86 | PBXSymbolsDataSource_SymbolTypeID, 87 | PBXSymbolsDataSource_ReferenceNameID, 88 | ); 89 | }; 90 | PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = { 91 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 92 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 93 | PBXFileTableDataSourceColumnWidthsKey = ( 94 | 20, 95 | 20, 96 | 672, 97 | 20, 98 | 48.16259765625, 99 | 43, 100 | 43, 101 | 20, 102 | ); 103 | PBXFileTableDataSourceColumnsKey = ( 104 | PBXFileDataSource_SCM_ColumnID, 105 | PBXFileDataSource_FiletypeID, 106 | PBXFileDataSource_Filename_ColumnID, 107 | PBXFileDataSource_Built_ColumnID, 108 | PBXFileDataSource_ObjectSize_ColumnID, 109 | PBXFileDataSource_Errors_ColumnID, 110 | PBXFileDataSource_Warnings_ColumnID, 111 | PBXFileDataSource_Target_ColumnID, 112 | ); 113 | }; 114 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 115 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 116 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 117 | PBXFileTableDataSourceColumnWidthsKey = ( 118 | 20, 119 | 656, 120 | 60, 121 | 20, 122 | 48, 123 | 43, 124 | 43, 125 | ); 126 | PBXFileTableDataSourceColumnsKey = ( 127 | PBXFileDataSource_FiletypeID, 128 | PBXFileDataSource_Filename_ColumnID, 129 | PBXTargetDataSource_PrimaryAttribute, 130 | PBXFileDataSource_Built_ColumnID, 131 | PBXFileDataSource_ObjectSize_ColumnID, 132 | PBXFileDataSource_Errors_ColumnID, 133 | PBXFileDataSource_Warnings_ColumnID, 134 | ); 135 | }; 136 | PBXPerProjectTemplateStateSaveDate = 325858868; 137 | PBXWorkspaceStateSaveDate = 325858868; 138 | }; 139 | perUserProjectItems = { 140 | 2B179661136B16F900BDDB7B /* PBXTextBookmark */ = 2B179661136B16F900BDDB7B /* PBXTextBookmark */; 141 | 2B179662136B16F900BDDB7B /* PBXTextBookmark */ = 2B179662136B16F900BDDB7B /* PBXTextBookmark */; 142 | 2B179663136B16F900BDDB7B /* PBXTextBookmark */ = 2B179663136B16F900BDDB7B /* PBXTextBookmark */; 143 | 2BC44991136C3788009B147B /* PBXTextBookmark */ = 2BC44991136C3788009B147B /* PBXTextBookmark */; 144 | 2BC44997136C37B1009B147B /* PBXTextBookmark */ = 2BC44997136C37B1009B147B /* PBXTextBookmark */; 145 | 2BC44998136C37B1009B147B /* PBXTextBookmark */ = 2BC44998136C37B1009B147B /* PBXTextBookmark */; 146 | 2BC44AF4136C6C04009B147B /* PBXTextBookmark */ = 2BC44AF4136C6C04009B147B /* PBXTextBookmark */; 147 | }; 148 | sourceControlManager = 2B3EB1EB1219595D00E3C351 /* Source Control */; 149 | userBuildSettings = { 150 | }; 151 | }; 152 | 2B179661136B16F900BDDB7B /* PBXTextBookmark */ = { 153 | isa = PBXTextBookmark; 154 | fRef = 28D7ACF60DDB3853001CB0EB /* CustomBadgeViewController.h */; 155 | name = "CustomBadgeViewController.h: 1"; 156 | rLen = 0; 157 | rLoc = 0; 158 | rType = 0; 159 | vrLen = 254; 160 | vrLoc = 0; 161 | }; 162 | 2B179662136B16F900BDDB7B /* PBXTextBookmark */ = { 163 | isa = PBXTextBookmark; 164 | fRef = 1D3623250D0F684500981E51 /* CustomBadgeAppDelegate.m */; 165 | name = "CustomBadgeAppDelegate.m: 1"; 166 | rLen = 0; 167 | rLoc = 0; 168 | rType = 0; 169 | vrLen = 1224; 170 | vrLoc = 3; 171 | }; 172 | 2B179663136B16F900BDDB7B /* PBXTextBookmark */ = { 173 | isa = PBXTextBookmark; 174 | fRef = 1D3623240D0F684500981E51 /* CustomBadgeAppDelegate.h */; 175 | name = "CustomBadgeAppDelegate.h: 1"; 176 | rLen = 0; 177 | rLoc = 0; 178 | rType = 0; 179 | vrLen = 507; 180 | vrLoc = 0; 181 | }; 182 | 2B3EB1DC1219594800E3C351 /* CustomBadge */ = { 183 | isa = PBXExecutable; 184 | activeArgIndices = ( 185 | ); 186 | argumentStrings = ( 187 | ); 188 | autoAttachOnCrash = 1; 189 | breakpointsEnabled = 1; 190 | configStateDict = { 191 | }; 192 | customDataFormattersEnabled = 1; 193 | dataTipCustomDataFormattersEnabled = 1; 194 | dataTipShowTypeColumn = 1; 195 | dataTipSortType = 0; 196 | debuggerPlugin = GDBDebugging; 197 | disassemblyDisplayState = 0; 198 | dylibVariantSuffix = ""; 199 | enableDebugStr = 1; 200 | environmentEntries = ( 201 | ); 202 | executableSystemSymbolLevel = 0; 203 | executableUserSymbolLevel = 0; 204 | libgmallocEnabled = 0; 205 | name = CustomBadge; 206 | savedGlobals = { 207 | }; 208 | showTypeColumn = 0; 209 | sourceDirectories = ( 210 | ); 211 | variableFormatDictionary = { 212 | }; 213 | }; 214 | 2B3EB1E81219595D00E3C351 /* CustomBadge.m */ = { 215 | uiCtxt = { 216 | sepNavIntBoundsRect = "{{0, 0}, {1859, 4032}}"; 217 | sepNavSelRange = "{7825, 0}"; 218 | sepNavVisRange = "{7000, 665}"; 219 | }; 220 | }; 221 | 2B3EB1E91219595D00E3C351 /* CustomBadge.h */ = { 222 | uiCtxt = { 223 | sepNavIntBoundsRect = "{{0, 0}, {1526, 944}}"; 224 | sepNavSelRange = "{437, 69}"; 225 | sepNavVisRange = "{0, 1129}"; 226 | }; 227 | }; 228 | 2B3EB1EB1219595D00E3C351 /* Source Control */ = { 229 | isa = PBXSourceControlManager; 230 | fallbackIsa = XCSourceControlManager; 231 | isSCMEnabled = 0; 232 | scmConfiguration = { 233 | repositoryNamesForRoots = { 234 | "" = ""; 235 | }; 236 | }; 237 | }; 238 | 2B3EB1EC1219595D00E3C351 /* Code sense */ = { 239 | isa = PBXCodeSenseManager; 240 | indexTemplatePath = ""; 241 | }; 242 | 2BC44991136C3788009B147B /* PBXTextBookmark */ = { 243 | isa = PBXTextBookmark; 244 | fRef = 2B3EB1E91219595D00E3C351 /* CustomBadge.h */; 245 | name = "CustomBadge.h: 12"; 246 | rLen = 69; 247 | rLoc = 437; 248 | rType = 0; 249 | vrLen = 1129; 250 | vrLoc = 0; 251 | }; 252 | 2BC44997136C37B1009B147B /* PBXTextBookmark */ = { 253 | isa = PBXTextBookmark; 254 | fRef = 2B3EB1E81219595D00E3C351 /* CustomBadge.m */; 255 | name = "CustomBadge.m: 12"; 256 | rLen = 0; 257 | rLoc = 506; 258 | rType = 0; 259 | vrLen = 1098; 260 | vrLoc = 2621; 261 | }; 262 | 2BC44998136C37B1009B147B /* PBXTextBookmark */ = { 263 | isa = PBXTextBookmark; 264 | fRef = 28D7ACF70DDB3853001CB0EB /* CustomBadgeViewController.m */; 265 | name = "CustomBadgeViewController.m: 27"; 266 | rLen = 0; 267 | rLoc = 957; 268 | rType = 0; 269 | vrLen = 1362; 270 | vrLoc = 389; 271 | }; 272 | 2BC44AF4136C6C04009B147B /* PBXTextBookmark */ = { 273 | isa = PBXTextBookmark; 274 | fRef = 28D7ACF70DDB3853001CB0EB /* CustomBadgeViewController.m */; 275 | name = "CustomBadgeViewController.m: 23"; 276 | rLen = 0; 277 | rLoc = 592; 278 | rType = 0; 279 | vrLen = 1111; 280 | vrLoc = 160; 281 | }; 282 | } 283 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/sascha.perspectivev3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | AIODescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | perspectivev3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | 2B3EB2081219756C00E3C351 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.defaultV3 191 | MajorVersion 192 | 34 193 | MinorVersion 194 | 0 195 | Name 196 | All-In-One 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | 1920 204 | 1920 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | XCToolbarPerspectiveControl 212 | NSToolbarSeparatorItem 213 | active-combo-popup 214 | action 215 | NSToolbarFlexibleSpaceItem 216 | debugger-enable-breakpoints 217 | build-and-go 218 | com.apple.ide.PBXToolbarStopButton 219 | get-info 220 | NSToolbarFlexibleSpaceItem 221 | com.apple.pbx.toolbar.searchfield 222 | 223 | ControllerClassBaseName 224 | 225 | IconName 226 | WindowOfProject 227 | Identifier 228 | perspective.project 229 | IsVertical 230 | 231 | Layout 232 | 233 | 234 | ContentConfiguration 235 | 236 | PBXBottomSmartGroupGIDs 237 | 238 | 1C37FBAC04509CD000000102 239 | 1C37FAAC04509CD000000102 240 | 1C37FABC05509CD000000102 241 | 1C37FABC05539CD112110102 242 | E2644B35053B69B200211256 243 | 1C37FABC04509CD000100104 244 | 1CC0EA4004350EF90044410B 245 | 1CC0EA4004350EF90041110B 246 | 1C77FABC04509CD000000102 247 | 248 | PBXProjectModuleGUID 249 | 1CA23ED40692098700951B8B 250 | PBXProjectModuleLabel 251 | Files 252 | PBXProjectStructureProvided 253 | yes 254 | PBXSmartGroupTreeModuleColumnData 255 | 256 | PBXSmartGroupTreeModuleColumnWidthsKey 257 | 258 | 311 259 | 260 | PBXSmartGroupTreeModuleColumnsKey_v4 261 | 262 | MainColumn 263 | 264 | 265 | PBXSmartGroupTreeModuleOutlineStateKey_v7 266 | 267 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 268 | 269 | 29B97314FDCFA39411CA2CEA 270 | 080E96DDFE201D6D7F000001 271 | 29B97315FDCFA39411CA2CEA 272 | 29B97317FDCFA39411CA2CEA 273 | 1C37FBAC04509CD000000102 274 | 275 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 276 | 277 | 278 | 7 279 | 1 280 | 0 281 | 282 | 283 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 284 | {{0, 0}, {311, 1007}} 285 | 286 | PBXTopSmartGroupGIDs 287 | 288 | XCIncludePerspectivesSwitch 289 | 290 | 291 | GeometryConfiguration 292 | 293 | Frame 294 | {{0, 0}, {328, 1025}} 295 | GroupTreeTableConfiguration 296 | 297 | MainColumn 298 | 311 299 | 300 | RubberWindowFrame 301 | 0 112 1920 1066 0 0 1920 1178 302 | 303 | Module 304 | PBXSmartGroupTreeModule 305 | Proportion 306 | 328pt 307 | 308 | 309 | Dock 310 | 311 | 312 | ContentConfiguration 313 | 314 | PBXProjectModuleGUID 315 | 2B3EB1FB1219756C00E3C351 316 | PBXProjectModuleLabel 317 | CustomBadgeViewController.m 318 | PBXSplitModuleInNavigatorKey 319 | 320 | Split0 321 | 322 | PBXProjectModuleGUID 323 | 2B3EB1FC1219756C00E3C351 324 | PBXProjectModuleLabel 325 | CustomBadgeViewController.m 326 | _historyCapacity 327 | 0 328 | bookmark 329 | 2BC44AF4136C6C04009B147B 330 | history 331 | 332 | 2B179661136B16F900BDDB7B 333 | 2B179662136B16F900BDDB7B 334 | 2B179663136B16F900BDDB7B 335 | 2BC44991136C3788009B147B 336 | 2BC44997136C37B1009B147B 337 | 2BC44998136C37B1009B147B 338 | 339 | 340 | SplitCount 341 | 1 342 | 343 | StatusBarVisibility 344 | 345 | XCSharingToken 346 | com.apple.Xcode.CommonNavigatorGroupSharingToken 347 | 348 | GeometryConfiguration 349 | 350 | Frame 351 | {{0, 0}, {1587, 579}} 352 | RubberWindowFrame 353 | 0 112 1920 1066 0 0 1920 1178 354 | 355 | Module 356 | PBXNavigatorGroup 357 | Proportion 358 | 579pt 359 | 360 | 361 | Proportion 362 | 441pt 363 | Tabs 364 | 365 | 366 | BecomeActive 367 | 368 | ContentConfiguration 369 | 370 | PBXProjectModuleGUID 371 | 1CA23EDF0692099D00951B8B 372 | PBXProjectModuleLabel 373 | Detail 374 | 375 | GeometryConfiguration 376 | 377 | Frame 378 | {{10, 27}, {1587, 414}} 379 | RubberWindowFrame 380 | 0 112 1920 1066 0 0 1920 1178 381 | 382 | Module 383 | XCDetailModule 384 | 385 | 386 | ContentConfiguration 387 | 388 | PBXProjectModuleGUID 389 | 1CA23EE00692099D00951B8B 390 | PBXProjectModuleLabel 391 | Project Find 392 | 393 | GeometryConfiguration 394 | 395 | Frame 396 | {{10, 31}, {603, 297}} 397 | 398 | Module 399 | PBXProjectFindModule 400 | 401 | 402 | ContentConfiguration 403 | 404 | PBXCVSModuleFilterTypeKey 405 | 1032 406 | PBXProjectModuleGUID 407 | 1CA23EE10692099D00951B8B 408 | PBXProjectModuleLabel 409 | SCM Results 410 | 411 | GeometryConfiguration 412 | 413 | Frame 414 | {{10, 31}, {603, 297}} 415 | 416 | Module 417 | PBXCVSModule 418 | 419 | 420 | ContentConfiguration 421 | 422 | PBXProjectModuleGUID 423 | XCMainBuildResultsModuleGUID 424 | PBXProjectModuleLabel 425 | Build Results 426 | XCBuildResultsTrigger_Collapse 427 | 1021 428 | XCBuildResultsTrigger_Open 429 | 1011 430 | 431 | GeometryConfiguration 432 | 433 | Frame 434 | {{10, 27}, {1587, 387}} 435 | 436 | Module 437 | PBXBuildResultsModule 438 | 439 | 440 | 441 | 442 | Proportion 443 | 1587pt 444 | 445 | 446 | Name 447 | Project 448 | ServiceClasses 449 | 450 | XCModuleDock 451 | PBXSmartGroupTreeModule 452 | XCModuleDock 453 | PBXNavigatorGroup 454 | XCDockableTabModule 455 | XCDetailModule 456 | PBXProjectFindModule 457 | PBXCVSModule 458 | PBXBuildResultsModule 459 | 460 | TableOfContents 461 | 462 | 2BC44960136C3639009B147B 463 | 1CA23ED40692098700951B8B 464 | 2BC44961136C3639009B147B 465 | 2B3EB1FB1219756C00E3C351 466 | 2BC44962136C3639009B147B 467 | 1CA23EDF0692099D00951B8B 468 | 1CA23EE00692099D00951B8B 469 | 1CA23EE10692099D00951B8B 470 | XCMainBuildResultsModuleGUID 471 | 472 | ToolbarConfigUserDefaultsMinorVersion 473 | 2 474 | ToolbarConfiguration 475 | xcode.toolbar.config.defaultV3 476 | 477 | 478 | ChosenToolbarItems 479 | 480 | XCToolbarPerspectiveControl 481 | NSToolbarSeparatorItem 482 | active-combo-popup 483 | NSToolbarFlexibleSpaceItem 484 | debugger-enable-breakpoints 485 | build-and-go 486 | com.apple.ide.PBXToolbarStopButton 487 | debugger-restart-executable 488 | debugger-pause 489 | debugger-step-over 490 | debugger-step-into 491 | debugger-step-out 492 | NSToolbarFlexibleSpaceItem 493 | servicesModulebreakpoints 494 | debugger-show-console-window 495 | 496 | ControllerClassBaseName 497 | PBXDebugSessionModule 498 | IconName 499 | DebugTabIcon 500 | Identifier 501 | perspective.debug 502 | IsVertical 503 | 504 | Layout 505 | 506 | 507 | ContentConfiguration 508 | 509 | PBXProjectModuleGUID 510 | 1CCC7628064C1048000F2A68 511 | PBXProjectModuleLabel 512 | Debugger Console 513 | 514 | GeometryConfiguration 515 | 516 | Frame 517 | {{0, 0}, {1920, 389}} 518 | 519 | Module 520 | PBXDebugCLIModule 521 | Proportion 522 | 389pt 523 | 524 | 525 | ContentConfiguration 526 | 527 | Debugger 528 | 529 | HorizontalSplitView 530 | 531 | _collapsingFrameDimension 532 | 0.0 533 | _indexOfCollapsedView 534 | 0 535 | _percentageOfCollapsedView 536 | 0.0 537 | isCollapsed 538 | yes 539 | sizes 540 | 541 | {{0, 0}, {936, 307}} 542 | {{936, 0}, {984, 307}} 543 | 544 | 545 | VerticalSplitView 546 | 547 | _collapsingFrameDimension 548 | 0.0 549 | _indexOfCollapsedView 550 | 0 551 | _percentageOfCollapsedView 552 | 0.0 553 | isCollapsed 554 | yes 555 | sizes 556 | 557 | {{0, 0}, {1920, 307}} 558 | {{0, 307}, {1920, 324}} 559 | 560 | 561 | 562 | LauncherConfigVersion 563 | 8 564 | PBXProjectModuleGUID 565 | 1CCC7629064C1048000F2A68 566 | PBXProjectModuleLabel 567 | Debug 568 | 569 | GeometryConfiguration 570 | 571 | DebugConsoleVisible 572 | None 573 | DebugConsoleWindowFrame 574 | {{200, 200}, {500, 300}} 575 | DebugSTDIOWindowFrame 576 | {{200, 200}, {500, 300}} 577 | Frame 578 | {{0, 394}, {1920, 631}} 579 | PBXDebugSessionStackFrameViewKey 580 | 581 | DebugVariablesTableConfiguration 582 | 583 | Name 584 | 263 585 | Value 586 | 85 587 | Summary 588 | 611 589 | 590 | Frame 591 | {{936, 0}, {984, 307}} 592 | 593 | 594 | Module 595 | PBXDebugSessionModule 596 | Proportion 597 | 631pt 598 | 599 | 600 | Name 601 | Debug 602 | ServiceClasses 603 | 604 | XCModuleDock 605 | PBXDebugCLIModule 606 | PBXDebugSessionModule 607 | PBXDebugProcessAndThreadModule 608 | PBXDebugProcessViewModule 609 | PBXDebugThreadViewModule 610 | PBXDebugStackFrameViewModule 611 | PBXNavigatorGroup 612 | 613 | TableOfContents 614 | 615 | 2BC44963136C3639009B147B 616 | 1CCC7628064C1048000F2A68 617 | 1CCC7629064C1048000F2A68 618 | 2BC44964136C3639009B147B 619 | 2BC44965136C3639009B147B 620 | 2BC44966136C3639009B147B 621 | 2BC44967136C3639009B147B 622 | 2B3EB1FB1219756C00E3C351 623 | 624 | ToolbarConfigUserDefaultsMinorVersion 625 | 2 626 | ToolbarConfiguration 627 | xcode.toolbar.config.debugV3 628 | 629 | 630 | PerspectivesBarVisible 631 | 632 | ShelfIsVisible 633 | 634 | SourceDescription 635 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecification.xcperspec' 636 | StatusbarIsVisible 637 | 638 | TimeStamp 639 | 0.0 640 | ToolbarConfigUserDefaultsMinorVersion 641 | 2 642 | ToolbarDisplayMode 643 | 1 644 | ToolbarIsVisible 645 | 646 | ToolbarSizeMode 647 | 1 648 | Type 649 | Perspectives 650 | UpdateMessage 651 | 652 | WindowJustification 653 | 5 654 | WindowOrderList 655 | 656 | 2BC44971136C365E009B147B 657 | 2BC44969136C3639009B147B 658 | /Users/sascha/DATEN/DEV/Cocoa/CustomBadge/CustomBadge.xcodeproj 659 | 660 | WindowString 661 | 0 112 1920 1066 0 0 1920 1178 662 | WindowToolsV3 663 | 664 | 665 | Identifier 666 | windowTool.debugger 667 | Layout 668 | 669 | 670 | Dock 671 | 672 | 673 | ContentConfiguration 674 | 675 | Debugger 676 | 677 | HorizontalSplitView 678 | 679 | _collapsingFrameDimension 680 | 0.0 681 | _indexOfCollapsedView 682 | 0 683 | _percentageOfCollapsedView 684 | 0.0 685 | isCollapsed 686 | yes 687 | sizes 688 | 689 | {{0, 0}, {317, 164}} 690 | {{317, 0}, {377, 164}} 691 | 692 | 693 | VerticalSplitView 694 | 695 | _collapsingFrameDimension 696 | 0.0 697 | _indexOfCollapsedView 698 | 0 699 | _percentageOfCollapsedView 700 | 0.0 701 | isCollapsed 702 | yes 703 | sizes 704 | 705 | {{0, 0}, {694, 164}} 706 | {{0, 164}, {694, 216}} 707 | 708 | 709 | 710 | LauncherConfigVersion 711 | 8 712 | PBXProjectModuleGUID 713 | 1C162984064C10D400B95A72 714 | PBXProjectModuleLabel 715 | Debug - GLUTExamples (Underwater) 716 | 717 | GeometryConfiguration 718 | 719 | DebugConsoleDrawerSize 720 | {100, 120} 721 | DebugConsoleVisible 722 | None 723 | DebugConsoleWindowFrame 724 | {{200, 200}, {500, 300}} 725 | DebugSTDIOWindowFrame 726 | {{200, 200}, {500, 300}} 727 | Frame 728 | {{0, 0}, {694, 380}} 729 | RubberWindowFrame 730 | 321 238 694 422 0 0 1440 878 731 | 732 | Module 733 | PBXDebugSessionModule 734 | Proportion 735 | 100% 736 | 737 | 738 | Proportion 739 | 100% 740 | 741 | 742 | Name 743 | Debugger 744 | ServiceClasses 745 | 746 | PBXDebugSessionModule 747 | 748 | StatusbarIsVisible 749 | 1 750 | TableOfContents 751 | 752 | 1CD10A99069EF8BA00B06720 753 | 1C0AD2AB069F1E9B00FABCE6 754 | 1C162984064C10D400B95A72 755 | 1C0AD2AC069F1E9B00FABCE6 756 | 757 | ToolbarConfiguration 758 | xcode.toolbar.config.debugV3 759 | WindowString 760 | 321 238 694 422 0 0 1440 878 761 | WindowToolGUID 762 | 1CD10A99069EF8BA00B06720 763 | WindowToolIsVisible 764 | 0 765 | 766 | 767 | Identifier 768 | windowTool.build 769 | Layout 770 | 771 | 772 | Dock 773 | 774 | 775 | ContentConfiguration 776 | 777 | PBXProjectModuleGUID 778 | 1CD0528F0623707200166675 779 | PBXProjectModuleLabel 780 | <No Editor> 781 | PBXSplitModuleInNavigatorKey 782 | 783 | Split0 784 | 785 | PBXProjectModuleGUID 786 | 1CD052900623707200166675 787 | 788 | SplitCount 789 | 1 790 | 791 | StatusBarVisibility 792 | 1 793 | 794 | GeometryConfiguration 795 | 796 | Frame 797 | {{0, 0}, {500, 215}} 798 | RubberWindowFrame 799 | 192 257 500 500 0 0 1280 1002 800 | 801 | Module 802 | PBXNavigatorGroup 803 | Proportion 804 | 218pt 805 | 806 | 807 | BecomeActive 808 | 1 809 | ContentConfiguration 810 | 811 | PBXProjectModuleGUID 812 | XCMainBuildResultsModuleGUID 813 | PBXProjectModuleLabel 814 | Build Results 815 | 816 | GeometryConfiguration 817 | 818 | Frame 819 | {{0, 222}, {500, 236}} 820 | RubberWindowFrame 821 | 192 257 500 500 0 0 1280 1002 822 | 823 | Module 824 | PBXBuildResultsModule 825 | Proportion 826 | 236pt 827 | 828 | 829 | Proportion 830 | 458pt 831 | 832 | 833 | Name 834 | Build Results 835 | ServiceClasses 836 | 837 | PBXBuildResultsModule 838 | 839 | StatusbarIsVisible 840 | 1 841 | TableOfContents 842 | 843 | 1C78EAA5065D492600B07095 844 | 1C78EAA6065D492600B07095 845 | 1CD0528F0623707200166675 846 | XCMainBuildResultsModuleGUID 847 | 848 | ToolbarConfiguration 849 | xcode.toolbar.config.buildV3 850 | WindowString 851 | 192 257 500 500 0 0 1280 1002 852 | 853 | 854 | Identifier 855 | windowTool.find 856 | Layout 857 | 858 | 859 | Dock 860 | 861 | 862 | Dock 863 | 864 | 865 | ContentConfiguration 866 | 867 | PBXProjectModuleGUID 868 | 1CDD528C0622207200134675 869 | PBXProjectModuleLabel 870 | <No Editor> 871 | PBXSplitModuleInNavigatorKey 872 | 873 | Split0 874 | 875 | PBXProjectModuleGUID 876 | 1CD0528D0623707200166675 877 | 878 | SplitCount 879 | 1 880 | 881 | StatusBarVisibility 882 | 1 883 | 884 | GeometryConfiguration 885 | 886 | Frame 887 | {{0, 0}, {781, 167}} 888 | RubberWindowFrame 889 | 62 385 781 470 0 0 1440 878 890 | 891 | Module 892 | PBXNavigatorGroup 893 | Proportion 894 | 781pt 895 | 896 | 897 | Proportion 898 | 50% 899 | 900 | 901 | BecomeActive 902 | 1 903 | ContentConfiguration 904 | 905 | PBXProjectModuleGUID 906 | 1CD0528E0623707200166675 907 | PBXProjectModuleLabel 908 | Project Find 909 | 910 | GeometryConfiguration 911 | 912 | Frame 913 | {{8, 0}, {773, 254}} 914 | RubberWindowFrame 915 | 62 385 781 470 0 0 1440 878 916 | 917 | Module 918 | PBXProjectFindModule 919 | Proportion 920 | 50% 921 | 922 | 923 | Proportion 924 | 428pt 925 | 926 | 927 | Name 928 | Project Find 929 | ServiceClasses 930 | 931 | PBXProjectFindModule 932 | 933 | StatusbarIsVisible 934 | 1 935 | TableOfContents 936 | 937 | 1C530D57069F1CE1000CFCEE 938 | 1C530D58069F1CE1000CFCEE 939 | 1C530D59069F1CE1000CFCEE 940 | 1CDD528C0622207200134675 941 | 1C530D5A069F1CE1000CFCEE 942 | 1CE0B1FE06471DED0097A5F4 943 | 1CD0528E0623707200166675 944 | 945 | WindowString 946 | 62 385 781 470 0 0 1440 878 947 | WindowToolGUID 948 | 1C530D57069F1CE1000CFCEE 949 | WindowToolIsVisible 950 | 0 951 | 952 | 953 | Identifier 954 | windowTool.snapshots 955 | Layout 956 | 957 | 958 | Dock 959 | 960 | 961 | Module 962 | XCSnapshotModule 963 | Proportion 964 | 100% 965 | 966 | 967 | Proportion 968 | 100% 969 | 970 | 971 | Name 972 | Snapshots 973 | ServiceClasses 974 | 975 | XCSnapshotModule 976 | 977 | StatusbarIsVisible 978 | Yes 979 | ToolbarConfiguration 980 | xcode.toolbar.config.snapshots 981 | WindowString 982 | 315 824 300 550 0 0 1440 878 983 | WindowToolIsVisible 984 | Yes 985 | 986 | 987 | Identifier 988 | windowTool.debuggerConsole 989 | Layout 990 | 991 | 992 | Dock 993 | 994 | 995 | BecomeActive 996 | 1 997 | ContentConfiguration 998 | 999 | PBXProjectModuleGUID 1000 | 1C78EAAC065D492600B07095 1001 | PBXProjectModuleLabel 1002 | Debugger Console 1003 | 1004 | GeometryConfiguration 1005 | 1006 | Frame 1007 | {{0, 0}, {700, 358}} 1008 | RubberWindowFrame 1009 | 149 87 700 400 0 0 1440 878 1010 | 1011 | Module 1012 | PBXDebugCLIModule 1013 | Proportion 1014 | 358pt 1015 | 1016 | 1017 | Proportion 1018 | 358pt 1019 | 1020 | 1021 | Name 1022 | Debugger Console 1023 | ServiceClasses 1024 | 1025 | PBXDebugCLIModule 1026 | 1027 | StatusbarIsVisible 1028 | 1 1029 | TableOfContents 1030 | 1031 | 1C530D5B069F1CE1000CFCEE 1032 | 1C530D5C069F1CE1000CFCEE 1033 | 1C78EAAC065D492600B07095 1034 | 1035 | ToolbarConfiguration 1036 | xcode.toolbar.config.consoleV3 1037 | WindowString 1038 | 149 87 440 400 0 0 1440 878 1039 | WindowToolGUID 1040 | 1C530D5B069F1CE1000CFCEE 1041 | WindowToolIsVisible 1042 | 0 1043 | 1044 | 1045 | Identifier 1046 | windowTool.scm 1047 | Layout 1048 | 1049 | 1050 | Dock 1051 | 1052 | 1053 | ContentConfiguration 1054 | 1055 | PBXProjectModuleGUID 1056 | 1C78EAB2065D492600B07095 1057 | PBXProjectModuleLabel 1058 | <No Editor> 1059 | PBXSplitModuleInNavigatorKey 1060 | 1061 | Split0 1062 | 1063 | PBXProjectModuleGUID 1064 | 1C78EAB3065D492600B07095 1065 | 1066 | SplitCount 1067 | 1 1068 | 1069 | StatusBarVisibility 1070 | 1 1071 | 1072 | GeometryConfiguration 1073 | 1074 | Frame 1075 | {{0, 0}, {452, 0}} 1076 | RubberWindowFrame 1077 | 743 379 452 308 0 0 1280 1002 1078 | 1079 | Module 1080 | PBXNavigatorGroup 1081 | Proportion 1082 | 0pt 1083 | 1084 | 1085 | BecomeActive 1086 | 1 1087 | ContentConfiguration 1088 | 1089 | PBXProjectModuleGUID 1090 | 1CD052920623707200166675 1091 | PBXProjectModuleLabel 1092 | SCM 1093 | 1094 | GeometryConfiguration 1095 | 1096 | ConsoleFrame 1097 | {{0, 259}, {452, 0}} 1098 | Frame 1099 | {{0, 7}, {452, 259}} 1100 | RubberWindowFrame 1101 | 743 379 452 308 0 0 1280 1002 1102 | TableConfiguration 1103 | 1104 | Status 1105 | 30 1106 | FileName 1107 | 199 1108 | Path 1109 | 197.09500122070312 1110 | 1111 | TableFrame 1112 | {{0, 0}, {452, 250}} 1113 | 1114 | Module 1115 | PBXCVSModule 1116 | Proportion 1117 | 262pt 1118 | 1119 | 1120 | Proportion 1121 | 266pt 1122 | 1123 | 1124 | Name 1125 | SCM 1126 | ServiceClasses 1127 | 1128 | PBXCVSModule 1129 | 1130 | StatusbarIsVisible 1131 | 1 1132 | TableOfContents 1133 | 1134 | 1C78EAB4065D492600B07095 1135 | 1C78EAB5065D492600B07095 1136 | 1C78EAB2065D492600B07095 1137 | 1CD052920623707200166675 1138 | 1139 | ToolbarConfiguration 1140 | xcode.toolbar.config.scmV3 1141 | WindowString 1142 | 743 379 452 308 0 0 1280 1002 1143 | 1144 | 1145 | Identifier 1146 | windowTool.breakpoints 1147 | IsVertical 1148 | 0 1149 | Layout 1150 | 1151 | 1152 | Dock 1153 | 1154 | 1155 | BecomeActive 1156 | 1 1157 | ContentConfiguration 1158 | 1159 | PBXBottomSmartGroupGIDs 1160 | 1161 | 1C77FABC04509CD000000102 1162 | 1163 | PBXProjectModuleGUID 1164 | 1CE0B1FE06471DED0097A5F4 1165 | PBXProjectModuleLabel 1166 | Files 1167 | PBXProjectStructureProvided 1168 | no 1169 | PBXSmartGroupTreeModuleColumnData 1170 | 1171 | PBXSmartGroupTreeModuleColumnWidthsKey 1172 | 1173 | 168 1174 | 1175 | PBXSmartGroupTreeModuleColumnsKey_v4 1176 | 1177 | MainColumn 1178 | 1179 | 1180 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1181 | 1182 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1183 | 1184 | 1C77FABC04509CD000000102 1185 | 1186 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1187 | 1188 | 1189 | 0 1190 | 1191 | 1192 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1193 | {{0, 0}, {168, 350}} 1194 | 1195 | PBXTopSmartGroupGIDs 1196 | 1197 | XCIncludePerspectivesSwitch 1198 | 0 1199 | 1200 | GeometryConfiguration 1201 | 1202 | Frame 1203 | {{0, 0}, {185, 368}} 1204 | GroupTreeTableConfiguration 1205 | 1206 | MainColumn 1207 | 168 1208 | 1209 | RubberWindowFrame 1210 | 315 424 744 409 0 0 1440 878 1211 | 1212 | Module 1213 | PBXSmartGroupTreeModule 1214 | Proportion 1215 | 185pt 1216 | 1217 | 1218 | ContentConfiguration 1219 | 1220 | PBXProjectModuleGUID 1221 | 1CA1AED706398EBD00589147 1222 | PBXProjectModuleLabel 1223 | Detail 1224 | 1225 | GeometryConfiguration 1226 | 1227 | Frame 1228 | {{190, 0}, {554, 368}} 1229 | RubberWindowFrame 1230 | 315 424 744 409 0 0 1440 878 1231 | 1232 | Module 1233 | XCDetailModule 1234 | Proportion 1235 | 554pt 1236 | 1237 | 1238 | Proportion 1239 | 368pt 1240 | 1241 | 1242 | MajorVersion 1243 | 3 1244 | MinorVersion 1245 | 0 1246 | Name 1247 | Breakpoints 1248 | ServiceClasses 1249 | 1250 | PBXSmartGroupTreeModule 1251 | XCDetailModule 1252 | 1253 | StatusbarIsVisible 1254 | 1 1255 | TableOfContents 1256 | 1257 | 1CDDB66807F98D9800BB5817 1258 | 1CDDB66907F98D9800BB5817 1259 | 1CE0B1FE06471DED0097A5F4 1260 | 1CA1AED706398EBD00589147 1261 | 1262 | ToolbarConfiguration 1263 | xcode.toolbar.config.breakpointsV3 1264 | WindowString 1265 | 315 424 744 409 0 0 1440 878 1266 | WindowToolGUID 1267 | 1CDDB66807F98D9800BB5817 1268 | WindowToolIsVisible 1269 | 1 1270 | 1271 | 1272 | Identifier 1273 | windowTool.debugAnimator 1274 | Layout 1275 | 1276 | 1277 | Dock 1278 | 1279 | 1280 | Module 1281 | PBXNavigatorGroup 1282 | Proportion 1283 | 100% 1284 | 1285 | 1286 | Proportion 1287 | 100% 1288 | 1289 | 1290 | Name 1291 | Debug Visualizer 1292 | ServiceClasses 1293 | 1294 | PBXNavigatorGroup 1295 | 1296 | StatusbarIsVisible 1297 | 1 1298 | ToolbarConfiguration 1299 | xcode.toolbar.config.debugAnimatorV3 1300 | WindowString 1301 | 100 100 700 500 0 0 1280 1002 1302 | 1303 | 1304 | Identifier 1305 | windowTool.bookmarks 1306 | Layout 1307 | 1308 | 1309 | Dock 1310 | 1311 | 1312 | Module 1313 | PBXBookmarksModule 1314 | Proportion 1315 | 166pt 1316 | 1317 | 1318 | Proportion 1319 | 166pt 1320 | 1321 | 1322 | Name 1323 | Bookmarks 1324 | ServiceClasses 1325 | 1326 | PBXBookmarksModule 1327 | 1328 | StatusbarIsVisible 1329 | 0 1330 | WindowString 1331 | 538 42 401 187 0 0 1280 1002 1332 | 1333 | 1334 | Identifier 1335 | windowTool.projectFormatConflicts 1336 | Layout 1337 | 1338 | 1339 | Dock 1340 | 1341 | 1342 | Module 1343 | XCProjectFormatConflictsModule 1344 | Proportion 1345 | 100% 1346 | 1347 | 1348 | Proportion 1349 | 100% 1350 | 1351 | 1352 | Name 1353 | Project Format Conflicts 1354 | ServiceClasses 1355 | 1356 | XCProjectFormatConflictsModule 1357 | 1358 | StatusbarIsVisible 1359 | 0 1360 | WindowContentMinSize 1361 | 450 300 1362 | WindowString 1363 | 50 850 472 307 0 0 1440 877 1364 | 1365 | 1366 | Identifier 1367 | windowTool.classBrowser 1368 | Layout 1369 | 1370 | 1371 | Dock 1372 | 1373 | 1374 | BecomeActive 1375 | 1 1376 | ContentConfiguration 1377 | 1378 | OptionsSetName 1379 | Hierarchy, all classes 1380 | PBXProjectModuleGUID 1381 | 1CA6456E063B45B4001379D8 1382 | PBXProjectModuleLabel 1383 | Class Browser - NSObject 1384 | 1385 | GeometryConfiguration 1386 | 1387 | ClassesFrame 1388 | {{0, 0}, {369, 96}} 1389 | ClassesTreeTableConfiguration 1390 | 1391 | PBXClassNameColumnIdentifier 1392 | 208 1393 | PBXClassBookColumnIdentifier 1394 | 22 1395 | 1396 | Frame 1397 | {{0, 0}, {616, 353}} 1398 | MembersFrame 1399 | {{0, 105}, {369, 395}} 1400 | MembersTreeTableConfiguration 1401 | 1402 | PBXMemberTypeIconColumnIdentifier 1403 | 22 1404 | PBXMemberNameColumnIdentifier 1405 | 216 1406 | PBXMemberTypeColumnIdentifier 1407 | 94 1408 | PBXMemberBookColumnIdentifier 1409 | 22 1410 | 1411 | PBXModuleWindowStatusBarHidden2 1412 | 1 1413 | RubberWindowFrame 1414 | 597 125 616 374 0 0 1280 1002 1415 | 1416 | Module 1417 | PBXClassBrowserModule 1418 | Proportion 1419 | 354pt 1420 | 1421 | 1422 | Proportion 1423 | 354pt 1424 | 1425 | 1426 | Name 1427 | Class Browser 1428 | ServiceClasses 1429 | 1430 | PBXClassBrowserModule 1431 | 1432 | StatusbarIsVisible 1433 | 0 1434 | TableOfContents 1435 | 1436 | 1C78EABA065D492600B07095 1437 | 1C78EABB065D492600B07095 1438 | 1CA6456E063B45B4001379D8 1439 | 1440 | ToolbarConfiguration 1441 | xcode.toolbar.config.classbrowser 1442 | WindowString 1443 | 597 125 616 374 0 0 1280 1002 1444 | 1445 | 1446 | Identifier 1447 | windowTool.refactoring 1448 | IncludeInToolsMenu 1449 | 0 1450 | Layout 1451 | 1452 | 1453 | Dock 1454 | 1455 | 1456 | BecomeActive 1457 | 1 1458 | GeometryConfiguration 1459 | 1460 | Frame 1461 | {0, 0}, {500, 335} 1462 | RubberWindowFrame 1463 | {0, 0}, {500, 335} 1464 | 1465 | Module 1466 | XCRefactoringModule 1467 | Proportion 1468 | 100% 1469 | 1470 | 1471 | Proportion 1472 | 100% 1473 | 1474 | 1475 | Name 1476 | Refactoring 1477 | ServiceClasses 1478 | 1479 | XCRefactoringModule 1480 | 1481 | WindowString 1482 | 200 200 500 356 0 0 1920 1200 1483 | 1484 | 1485 | 1486 | 1487 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/xcuserdata/sascha.xcuserdatad/xcschemes/CustomBadge.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 44 | 45 | 51 | 52 | 53 | 54 | 55 | 56 | 64 | 65 | 71 | 72 | 73 | 74 | 76 | 77 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /CustomBadge.xcodeproj/xcuserdata/sascha.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CustomBadge.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1D6058900D05DD3D006BFB54 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /CustomBadgeViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1056 5 | 10J869 6 | 823 7 | 1038.35 8 | 461.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 132 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | 42 | 274 43 | {320, 460} 44 | 45 | 46 | 3 47 | MC43NQA 48 | 49 | 2 50 | 51 | 52 | NO 53 | 54 | IBCocoaTouchFramework 55 | 56 | 57 | 58 | 59 | YES 60 | 61 | 62 | view 63 | 64 | 65 | 66 | 7 67 | 68 | 69 | 70 | 71 | YES 72 | 73 | 0 74 | 75 | 76 | 77 | 78 | 79 | -1 80 | 81 | 82 | File's Owner 83 | 84 | 85 | -2 86 | 87 | 88 | 89 | 90 | 6 91 | 92 | 93 | YES 94 | 95 | 96 | 97 | 98 | 99 | 100 | YES 101 | 102 | YES 103 | -1.CustomClassName 104 | -2.CustomClassName 105 | 6.IBEditorWindowLastContentRect 106 | 6.IBPluginDependency 107 | 108 | 109 | YES 110 | CustomBadgeViewController 111 | UIResponder 112 | {{239, 654}, {320, 480}} 113 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 114 | 115 | 116 | 117 | YES 118 | 119 | 120 | YES 121 | 122 | 123 | 124 | 125 | YES 126 | 127 | 128 | YES 129 | 130 | 131 | 132 | 8 133 | 134 | 135 | 136 | YES 137 | 138 | CustomBadgeViewController 139 | UIViewController 140 | 141 | IBProjectSource 142 | Classes/CustomBadgeViewController.h 143 | 144 | 145 | 146 | 147 | YES 148 | 149 | NSObject 150 | 151 | IBFrameworkSource 152 | Foundation.framework/Headers/NSError.h 153 | 154 | 155 | 156 | NSObject 157 | 158 | IBFrameworkSource 159 | Foundation.framework/Headers/NSFileManager.h 160 | 161 | 162 | 163 | NSObject 164 | 165 | IBFrameworkSource 166 | Foundation.framework/Headers/NSKeyValueCoding.h 167 | 168 | 169 | 170 | NSObject 171 | 172 | IBFrameworkSource 173 | Foundation.framework/Headers/NSKeyValueObserving.h 174 | 175 | 176 | 177 | NSObject 178 | 179 | IBFrameworkSource 180 | Foundation.framework/Headers/NSKeyedArchiver.h 181 | 182 | 183 | 184 | NSObject 185 | 186 | IBFrameworkSource 187 | Foundation.framework/Headers/NSObject.h 188 | 189 | 190 | 191 | NSObject 192 | 193 | IBFrameworkSource 194 | Foundation.framework/Headers/NSRunLoop.h 195 | 196 | 197 | 198 | NSObject 199 | 200 | IBFrameworkSource 201 | Foundation.framework/Headers/NSThread.h 202 | 203 | 204 | 205 | NSObject 206 | 207 | IBFrameworkSource 208 | Foundation.framework/Headers/NSURL.h 209 | 210 | 211 | 212 | NSObject 213 | 214 | IBFrameworkSource 215 | Foundation.framework/Headers/NSURLConnection.h 216 | 217 | 218 | 219 | NSObject 220 | 221 | IBFrameworkSource 222 | UIKit.framework/Headers/UIAccessibility.h 223 | 224 | 225 | 226 | NSObject 227 | 228 | IBFrameworkSource 229 | UIKit.framework/Headers/UINibLoading.h 230 | 231 | 232 | 233 | NSObject 234 | 235 | IBFrameworkSource 236 | UIKit.framework/Headers/UIResponder.h 237 | 238 | 239 | 240 | UIResponder 241 | NSObject 242 | 243 | 244 | 245 | UISearchBar 246 | UIView 247 | 248 | IBFrameworkSource 249 | UIKit.framework/Headers/UISearchBar.h 250 | 251 | 252 | 253 | UISearchDisplayController 254 | NSObject 255 | 256 | IBFrameworkSource 257 | UIKit.framework/Headers/UISearchDisplayController.h 258 | 259 | 260 | 261 | UIView 262 | 263 | IBFrameworkSource 264 | UIKit.framework/Headers/UIPrintFormatter.h 265 | 266 | 267 | 268 | UIView 269 | 270 | IBFrameworkSource 271 | UIKit.framework/Headers/UITextField.h 272 | 273 | 274 | 275 | UIView 276 | UIResponder 277 | 278 | IBFrameworkSource 279 | UIKit.framework/Headers/UIView.h 280 | 281 | 282 | 283 | UIViewController 284 | 285 | IBFrameworkSource 286 | UIKit.framework/Headers/UINavigationController.h 287 | 288 | 289 | 290 | UIViewController 291 | 292 | IBFrameworkSource 293 | UIKit.framework/Headers/UIPopoverController.h 294 | 295 | 296 | 297 | UIViewController 298 | 299 | IBFrameworkSource 300 | UIKit.framework/Headers/UISplitViewController.h 301 | 302 | 303 | 304 | UIViewController 305 | 306 | IBFrameworkSource 307 | UIKit.framework/Headers/UITabBarController.h 308 | 309 | 310 | 311 | UIViewController 312 | UIResponder 313 | 314 | IBFrameworkSource 315 | UIKit.framework/Headers/UIViewController.h 316 | 317 | 318 | 319 | 320 | 0 321 | IBCocoaTouchFramework 322 | 323 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 324 | 325 | 326 | 327 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 328 | 329 | 330 | YES 331 | CustomBadge.xcodeproj 332 | 3 333 | 132 334 | 335 | 336 | -------------------------------------------------------------------------------- /CustomBadge_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'CustomBadge' target in the 'CustomBadge' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ckteebe/CustomBadge/cbc5ad88f350e7783f5b77c8e3044b23b6b5876f/Default-568h@2x.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Sascha Paulus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1024 5 | 10D571 6 | 786 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 112 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | IBCocoaTouchFramework 42 | 43 | 44 | CustomBadgeViewController 45 | 46 | 47 | 1 48 | 49 | IBCocoaTouchFramework 50 | NO 51 | 52 | 53 | 54 | 292 55 | {320, 480} 56 | 57 | 1 58 | MSAxIDEAA 59 | 60 | NO 61 | NO 62 | 63 | IBCocoaTouchFramework 64 | YES 65 | 66 | 67 | 68 | 69 | YES 70 | 71 | 72 | delegate 73 | 74 | 75 | 76 | 4 77 | 78 | 79 | 80 | viewController 81 | 82 | 83 | 84 | 11 85 | 86 | 87 | 88 | window 89 | 90 | 91 | 92 | 14 93 | 94 | 95 | 96 | 97 | YES 98 | 99 | 0 100 | 101 | 102 | 103 | 104 | 105 | -1 106 | 107 | 108 | File's Owner 109 | 110 | 111 | 3 112 | 113 | 114 | CustomBadge App Delegate 115 | 116 | 117 | -2 118 | 119 | 120 | 121 | 122 | 10 123 | 124 | 125 | 126 | 127 | 12 128 | 129 | 130 | 131 | 132 | 133 | 134 | YES 135 | 136 | YES 137 | -1.CustomClassName 138 | -2.CustomClassName 139 | 10.CustomClassName 140 | 10.IBEditorWindowLastContentRect 141 | 10.IBPluginDependency 142 | 12.IBEditorWindowLastContentRect 143 | 12.IBPluginDependency 144 | 3.CustomClassName 145 | 3.IBPluginDependency 146 | 147 | 148 | YES 149 | UIApplication 150 | UIResponder 151 | CustomBadgeViewController 152 | {{234, 376}, {320, 480}} 153 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 154 | {{525, 346}, {320, 480}} 155 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 156 | CustomBadgeAppDelegate 157 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 158 | 159 | 160 | 161 | YES 162 | 163 | 164 | YES 165 | 166 | 167 | 168 | 169 | YES 170 | 171 | 172 | YES 173 | 174 | 175 | 176 | 15 177 | 178 | 179 | 180 | YES 181 | 182 | UIWindow 183 | UIView 184 | 185 | IBUserSource 186 | 187 | 188 | 189 | 190 | CustomBadgeAppDelegate 191 | NSObject 192 | 193 | YES 194 | 195 | YES 196 | viewController 197 | window 198 | 199 | 200 | YES 201 | CustomBadgeViewController 202 | UIWindow 203 | 204 | 205 | 206 | YES 207 | 208 | YES 209 | viewController 210 | window 211 | 212 | 213 | YES 214 | 215 | viewController 216 | CustomBadgeViewController 217 | 218 | 219 | window 220 | UIWindow 221 | 222 | 223 | 224 | 225 | IBProjectSource 226 | Classes/CustomBadgeAppDelegate.h 227 | 228 | 229 | 230 | CustomBadgeAppDelegate 231 | NSObject 232 | 233 | IBUserSource 234 | 235 | 236 | 237 | 238 | CustomBadgeViewController 239 | UIViewController 240 | 241 | IBProjectSource 242 | Classes/CustomBadgeViewController.h 243 | 244 | 245 | 246 | 247 | YES 248 | 249 | NSObject 250 | 251 | IBFrameworkSource 252 | Foundation.framework/Headers/NSError.h 253 | 254 | 255 | 256 | NSObject 257 | 258 | IBFrameworkSource 259 | Foundation.framework/Headers/NSFileManager.h 260 | 261 | 262 | 263 | NSObject 264 | 265 | IBFrameworkSource 266 | Foundation.framework/Headers/NSKeyValueCoding.h 267 | 268 | 269 | 270 | NSObject 271 | 272 | IBFrameworkSource 273 | Foundation.framework/Headers/NSKeyValueObserving.h 274 | 275 | 276 | 277 | NSObject 278 | 279 | IBFrameworkSource 280 | Foundation.framework/Headers/NSKeyedArchiver.h 281 | 282 | 283 | 284 | NSObject 285 | 286 | IBFrameworkSource 287 | Foundation.framework/Headers/NSObject.h 288 | 289 | 290 | 291 | NSObject 292 | 293 | IBFrameworkSource 294 | Foundation.framework/Headers/NSRunLoop.h 295 | 296 | 297 | 298 | NSObject 299 | 300 | IBFrameworkSource 301 | Foundation.framework/Headers/NSThread.h 302 | 303 | 304 | 305 | NSObject 306 | 307 | IBFrameworkSource 308 | Foundation.framework/Headers/NSURL.h 309 | 310 | 311 | 312 | NSObject 313 | 314 | IBFrameworkSource 315 | Foundation.framework/Headers/NSURLConnection.h 316 | 317 | 318 | 319 | NSObject 320 | 321 | IBFrameworkSource 322 | UIKit.framework/Headers/UIAccessibility.h 323 | 324 | 325 | 326 | NSObject 327 | 328 | IBFrameworkSource 329 | UIKit.framework/Headers/UINibLoading.h 330 | 331 | 332 | 333 | NSObject 334 | 335 | IBFrameworkSource 336 | UIKit.framework/Headers/UIResponder.h 337 | 338 | 339 | 340 | UIApplication 341 | UIResponder 342 | 343 | IBFrameworkSource 344 | UIKit.framework/Headers/UIApplication.h 345 | 346 | 347 | 348 | UIResponder 349 | NSObject 350 | 351 | 352 | 353 | UISearchBar 354 | UIView 355 | 356 | IBFrameworkSource 357 | UIKit.framework/Headers/UISearchBar.h 358 | 359 | 360 | 361 | UISearchDisplayController 362 | NSObject 363 | 364 | IBFrameworkSource 365 | UIKit.framework/Headers/UISearchDisplayController.h 366 | 367 | 368 | 369 | UIView 370 | 371 | IBFrameworkSource 372 | UIKit.framework/Headers/UITextField.h 373 | 374 | 375 | 376 | UIView 377 | UIResponder 378 | 379 | IBFrameworkSource 380 | UIKit.framework/Headers/UIView.h 381 | 382 | 383 | 384 | UIViewController 385 | 386 | IBFrameworkSource 387 | UIKit.framework/Headers/UINavigationController.h 388 | 389 | 390 | 391 | UIViewController 392 | 393 | IBFrameworkSource 394 | UIKit.framework/Headers/UIPopoverController.h 395 | 396 | 397 | 398 | UIViewController 399 | 400 | IBFrameworkSource 401 | UIKit.framework/Headers/UISplitViewController.h 402 | 403 | 404 | 405 | UIViewController 406 | 407 | IBFrameworkSource 408 | UIKit.framework/Headers/UITabBarController.h 409 | 410 | 411 | 412 | UIViewController 413 | UIResponder 414 | 415 | IBFrameworkSource 416 | UIKit.framework/Headers/UIViewController.h 417 | 418 | 419 | 420 | UIWindow 421 | UIView 422 | 423 | IBFrameworkSource 424 | UIKit.framework/Headers/UIWindow.h 425 | 426 | 427 | 428 | 429 | 0 430 | IBCocoaTouchFramework 431 | 432 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 433 | 434 | 435 | 436 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 437 | 438 | 439 | YES 440 | CustomBadge.xcodeproj 441 | 3 442 | 112 443 | 444 | 445 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # CustomBadge 2 | 3 | ## About 4 | 5 | CustomBadge is a little simple iOS class to draw badges on any iOS view. 6 | I'm sure you've seen badges before! For example on App icons when 7 | you received a notification. Anyway, there was never an official 8 | class or API from Apple to provide those badges inside an App. 9 | For instance to put it on top of a Button. 10 | 11 | In 2011 I decided to make this class (based on the QuarzCore-Framework). 12 | The latest version has reusable badge-styles according to the old 13 | iOS design (< iOS 7) and for the current iOS version (8+). 14 | But you can compose any style you like with font color, background color, 15 | font style, frame, shadow, shinging, ... 16 | 17 | ![Example](http://assets.saschapaulus.de/custombadge/example.png) -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ckteebe/CustomBadge/cbc5ad88f350e7783f5b77c8e3044b23b6b5876f/example.png -------------------------------------------------------------------------------- /main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // CustomBadge 4 | // 5 | // Created by Sascha Marc Paulus on 16.08.10. 6 | // Copyright paulusWebMedia 2010. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) { 12 | 13 | @autoreleasepool { 14 | int retVal = UIApplicationMain(argc, argv, nil, nil); 15 | return retVal; 16 | } 17 | } 18 | --------------------------------------------------------------------------------