Created
May 17, 2011 13:33
-
-
Save netshade/976469 to your computer and use it in GitHub Desktop.
Rounded Rect View
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RoundedRectView.m | |
// | |
// | |
#import "RoundedRectView.h" | |
@implementation RoundedRectView | |
@synthesize backgroundFillColor; | |
@synthesize strokeColor; | |
@synthesize fillColor; | |
@synthesize titleColor; | |
@synthesize strokeSize; | |
@synthesize title; | |
@synthesize titleHeight; | |
@synthesize arcSize; | |
@synthesize topMaskHeight; | |
@synthesize bottomMaskHeight; | |
@synthesize topMask; | |
@synthesize bottomMask; | |
@synthesize titleBackgroundColor; | |
- (id)initWithFrame:(CGRect)frame { | |
if (self = [super initWithFrame:frame]) { | |
strokeSize = 3.0f; | |
arcSize = 25.0; | |
titleHeight = 50.0; | |
[self setBackgroundColor:[UIColor clearColor]]; | |
[self setOpaque:NO]; | |
title = [[UILabel alloc] initWithFrame:CGRectMake(arcSize, 0.0, frame.size.width - (arcSize * 2.0), titleHeight )]; | |
[title setOpaque:NO]; | |
[title setTextAlignment:UITextAlignmentCenter]; | |
[title setBackgroundColor:[UIColor clearColor]]; | |
[self addSubview:title]; | |
} | |
return self; | |
} | |
-(void) setTitleBackgroundColor:(CGGradientRef)gradient { | |
if(titleBackgroundColor){ | |
CGGradientRelease(titleBackgroundColor); | |
} | |
titleBackgroundColor = gradient; | |
} | |
-(void) populateClippingPath:(CGMutablePathRef)path { | |
CGRect bodyRect = [self frame]; | |
bodyRect.origin = CGPointZero; | |
bodyRect.size.width -= strokeSize; | |
bodyRect.size.height -= strokeSize; | |
[self populateClippingPath:path fromRect:bodyRect]; | |
} | |
-(void) populateClippingPath:(CGMutablePathRef)path fromRect:(CGRect)bodyRect{ | |
CGFloat minx = CGRectGetMinX(bodyRect), | |
midx = CGRectGetMidX(bodyRect), | |
maxx = CGRectGetMaxX(bodyRect), | |
miny = CGRectGetMinY(bodyRect), | |
midy = CGRectGetMidY(bodyRect), | |
maxy = CGRectGetMaxY(bodyRect); | |
CGPathMoveToPoint(path, NULL, minx, midy); | |
CGPathAddArcToPoint(path, NULL, minx, miny, midx, miny, arcSize); | |
CGPathAddArcToPoint(path, NULL, maxx, miny, maxx, midy, arcSize); | |
CGPathAddArcToPoint(path, NULL, maxx, maxy, midx, maxy, arcSize); | |
CGPathAddArcToPoint(path, NULL, minx, maxy, minx, midy, arcSize); | |
CGPathCloseSubpath(path); | |
} | |
- (void)drawRect:(CGRect)rect { | |
CGContextRef context = UIGraphicsGetCurrentContext(); | |
CGRect bodyRect = [self frame]; | |
UIColor * bgColor = [self backgroundColor]; | |
CGContextSetFillColorWithColor(context, bgColor.CGColor); | |
CGContextFillRect(context, bodyRect); | |
bodyRect.origin = CGPointZero; | |
bodyRect.size.width -= strokeSize; | |
bodyRect.size.height -= strokeSize; | |
CGFloat arc = arcSize; | |
CGFloat minx = CGRectGetMinX(bodyRect), | |
midx = CGRectGetMidX(bodyRect), | |
maxx = CGRectGetMaxX(bodyRect), | |
miny = CGRectGetMinY(bodyRect), | |
midy = CGRectGetMidY(bodyRect), | |
maxy = CGRectGetMaxY(bodyRect); | |
CGMutablePathRef path = CGPathCreateMutable(); | |
[self populateClippingPath:path fromRect:bodyRect]; | |
CGContextSetLineWidth(context, strokeSize); | |
CGContextAddPath(context, path); | |
CGContextClip(context); | |
CGContextSetFillColorWithColor(context, fillColor.CGColor); | |
CGContextFillRect(context, bodyRect); | |
CGContextSaveGState(context); | |
CGContextSetLineWidth(context, strokeSize); | |
CGContextAddPath(context, path); | |
CGContextSetStrokeColorWithColor(context, strokeColor.CGColor); | |
UIColor * b = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; | |
CGContextSetShadowWithColor(context, CGSizeMake(2.0, -2.0), 3.0, b.CGColor); | |
CGContextDrawPath(context, kCGPathStroke); | |
CGContextRestoreGState(context); | |
if(backgroundFillColor){ | |
CGContextSetFillColorWithColor(context, [backgroundFillColor CGColor]); | |
CGContextAddPath(context, path); | |
CGContextDrawPath(context, kCGPathFill); | |
} | |
CGPathRelease(path); | |
path = CGPathCreateMutable(); | |
minx += strokeSize; | |
maxx -= 1.0;//strokeSize; | |
miny += strokeSize; | |
maxy -= strokeSize; | |
CGPathMoveToPoint(path, NULL, minx, midy); | |
CGPathAddArcToPoint(path, NULL, minx, miny, midx, miny, arc); | |
CGPathAddArcToPoint(path, NULL, maxx, miny, maxx, midy, arc); | |
CGPathAddArcToPoint(path, NULL, maxx, maxy, midx, maxy, arc); | |
CGPathAddArcToPoint(path, NULL, minx, maxy, minx, midy, arc); | |
CGPathCloseSubpath(path); | |
if(titleBackgroundColor){ | |
CGContextSetLineWidth(context, strokeSize); | |
CGContextAddPath(context, path); | |
CGContextClip(context); | |
CGContextDrawLinearGradient(context, titleBackgroundColor, CGPointZero, CGPointMake(0.0, titleHeight), 0); | |
} | |
if(bottomMask){ | |
CGContextDrawImage(context, CGRectMake(0.0, bodyRect.size.height - bottomMaskHeight, bodyRect.size.width, bottomMaskHeight), [bottomMask CGImage]); | |
} | |
if(topMask){ | |
CGContextDrawImage(context, CGRectMake(0.0, 0.0, bodyRect.size.width, topMaskHeight), [topMask CGImage]); | |
} | |
CGPathRelease(path); | |
// CGContextSetAllowsAntialiasing(context, true); | |
} | |
-(CGRect) contentRect { | |
CGRect f = [self frame]; | |
return CGRectMake(strokeSize - 1.0, titleHeight, (f.size.width - (strokeSize * 2.0)) , f.size.height - titleHeight); | |
} | |
- (void)dealloc { | |
CGGradientRelease(titleBackgroundColor); | |
[topMask release]; | |
[bottomMask release]; | |
[title release]; | |
[titleColor release]; | |
[backgroundFillColor release]; | |
[fillColor release]; | |
[strokeColor release]; | |
[super dealloc]; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment