Skip to content

Instantly share code, notes, and snippets.

@netshade
Created May 17, 2011 13:33
Show Gist options
  • Save netshade/976469 to your computer and use it in GitHub Desktop.
Save netshade/976469 to your computer and use it in GitHub Desktop.
Rounded Rect View
//
// 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