0,0 → 1,446 |
// |
// ButtonGradientView.m |
// Custom Alert View |
// |
// Created by jeff on 5/17/10. |
// Copyright 2010 __MyCompanyName__. All rights reserved. |
// |
|
#import "GradientButton.h" |
|
@interface GradientButton() |
@property (nonatomic, readonly) CGGradientRef normalGradient; |
@property (nonatomic, readonly) CGGradientRef highlightGradient; |
- (void)hesitateUpdate; // Used to catch and fix problem where quick taps don't get updated back to normal state |
@end |
#pragma mark - |
|
@implementation GradientButton |
@synthesize normalGradientColors; |
@synthesize normalGradientLocations; |
@synthesize highlightGradientColors; |
@synthesize highlightGradientLocations; |
@synthesize cornerRadius; |
@synthesize normalGradient, highlightGradient; |
#pragma mark - |
- (CGGradientRef)normalGradient |
{ |
if (normalGradient == NULL) |
{ |
int locCount = [normalGradientLocations count]; |
CGFloat locations[locCount]; |
for (int i = 0; i < [normalGradientLocations count]; i++) |
{ |
NSNumber *location = [normalGradientLocations objectAtIndex:i]; |
locations[i] = [location floatValue]; |
} |
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); |
|
normalGradient = CGGradientCreateWithColors(space, (CFArrayRef)normalGradientColors, locations); |
CGColorSpaceRelease(space); |
} |
return normalGradient; |
} |
- (CGGradientRef)highlightGradient |
{ |
|
if (highlightGradient == NULL) |
{ |
CGFloat locations[[highlightGradientLocations count]]; |
for (int i = 0; i < [highlightGradientLocations count]; i++) |
{ |
NSNumber *location = [highlightGradientLocations objectAtIndex:i]; |
locations[i] = [location floatValue]; |
} |
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); |
|
highlightGradient = CGGradientCreateWithColors(space, (CFArrayRef)highlightGradientColors, locations); |
CGColorSpaceRelease(space); |
} |
return highlightGradient; |
} |
#pragma mark - |
- (id)initWithFrame:(CGRect)frame |
{ |
self = [super initWithFrame:frame]; |
if (self) |
{ |
[self setOpaque:NO]; |
self.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.0]; |
} |
return self; |
} |
#pragma mark - |
#pragma mark Appearances |
- (void)useAlertStyle |
{ |
|
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:3]; |
UIColor *color = [UIColor colorWithRed:0.283 green:0.32 blue:0.414 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.82 green:0.834 blue:0.87 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.186 green:0.223 blue:0.326 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
self.normalGradientColors = colors; |
self.normalGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.483f], |
nil]; |
|
NSMutableArray *colors2 = [NSMutableArray arrayWithCapacity:4]; |
color = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.656 green:0.683 blue:0.713 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.137 green:0.155 blue:0.208 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.237 green:0.257 blue:0.305 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
self.highlightGradientColors = colors2; |
self.highlightGradientLocations = [NSArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.51f], |
[NSNumber numberWithFloat:0.654f], |
nil]; |
self.cornerRadius = 7.0f; |
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; |
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; |
|
} |
- (void)useRedDeleteStyle |
{ |
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:5]; |
UIColor *color = [UIColor colorWithRed:0.667 green:0.15 blue:0.152 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.841 green:0.566 blue:0.566 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.75 green:0.341 blue:0.345 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.592 green:0.0 blue:0.0 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.592 green:0.0 blue:0.0 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
self.normalGradientColors = colors; |
self.normalGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.582f], |
[NSNumber numberWithFloat:0.418f], |
[NSNumber numberWithFloat:0.346], |
nil]; |
|
NSMutableArray *colors2 = [NSMutableArray arrayWithCapacity:5]; |
color = [UIColor colorWithRed:0.467 green:0.009 blue:0.005 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.754 green:0.562 blue:0.562 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.543 green:0.212 blue:0.212 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.5 green:0.153 blue:0.152 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.388 green:0.004 blue:0.0 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
|
self.highlightGradientColors = colors; |
self.highlightGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.715f], |
[NSNumber numberWithFloat:0.513f], |
[NSNumber numberWithFloat:0.445f], |
nil]; |
self.cornerRadius = 9.f; |
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; |
|
} |
- (void)useWhiteStyle |
{ |
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:3]; |
UIColor *color = [UIColor colorWithRed:0.864 green:0.864 blue:0.864 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.995 green:0.995 blue:0.995 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.956 green:0.956 blue:0.955 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
self.normalGradientColors = colors; |
self.normalGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.601f], |
nil]; |
|
NSMutableArray *colors2 = [NSMutableArray arrayWithCapacity:3]; |
color = [UIColor colorWithRed:0.692 green:0.692 blue:0.691 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.995 green:0.995 blue:0.995 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.83 green:0.83 blue:0.83 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
self.highlightGradientColors = colors2; |
self.highlightGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.601f], |
nil]; |
|
self.cornerRadius = 9.f; |
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; |
[self setTitleColor:[UIColor darkGrayColor] forState:UIControlStateHighlighted]; |
} |
- (void)useBlackStyle |
{ |
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:4]; |
UIColor *color = [UIColor colorWithRed:0.154 green:0.154 blue:0.154 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.307 green:0.307 blue:0.307 alpha:1.0]; |
[colors addObject:(id)[color CGColor]];; |
color = [UIColor colorWithRed:0.166 green:0.166 blue:0.166 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.118 green:0.118 blue:0.118 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
self.normalGradientColors = colors; |
self.normalGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.548f], |
[NSNumber numberWithFloat:0.462f], |
nil]; |
self.cornerRadius = 9.0f; |
|
NSMutableArray *colors2 = [NSMutableArray arrayWithCapacity:4]; |
color = [UIColor colorWithRed:0.199 green:0.199 blue:0.199 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.04 green:0.04 blue:0.04 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.074 green:0.074 blue:0.074 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.112 green:0.112 blue:0.112 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
|
self.highlightGradientColors = colors2; |
self.highlightGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.548f], |
[NSNumber numberWithFloat:0.462f], |
nil]; |
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; |
} |
- (void)useSimpleOrangeStyle |
{ |
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:2]; |
UIColor *color = [UIColor colorWithRed:0.935 green:0.403 blue:0.02 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.97 green:0.582 blue:0.0 alpha:1.0]; |
[colors addObject:(id)[color CGColor]]; |
self.normalGradientColors = colors; |
self.normalGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
nil]; |
|
NSMutableArray *colors2 = [NSMutableArray arrayWithCapacity:3]; |
color = [UIColor colorWithRed:0.914 green:0.309 blue:0.0 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.935 green:0.4 blue:0.0 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
color = [UIColor colorWithRed:0.946 green:0.441 blue:0.01 alpha:1.0]; |
[colors2 addObject:(id)[color CGColor]]; |
self.highlightGradientColors = colors2; |
self.highlightGradientLocations = [NSMutableArray arrayWithObjects: |
[NSNumber numberWithFloat:0.0f], |
[NSNumber numberWithFloat:1.0f], |
[NSNumber numberWithFloat:0.498f], |
nil]; |
|
self.cornerRadius = 9.f; |
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; |
} |
#pragma mark - |
- (void)drawRect:(CGRect)rect |
{ |
self.backgroundColor = [UIColor clearColor]; |
CGRect imageBounds = CGRectMake(0.0, 0.0, self.bounds.size.width - 0.5, self.bounds.size.height); |
CGFloat alignStroke; |
CGFloat resolution; |
CGFloat stroke; |
CGMutablePathRef path; |
CGPoint point; |
CGPoint controlPoint1; |
CGPoint controlPoint2; |
CGGradientRef gradient; |
UIColor *color; |
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); |
CGContextRef context = UIGraphicsGetCurrentContext(); |
CGPoint point2; |
|
resolution = 0.5 * (self.bounds.size.width / imageBounds.size.width + self.bounds.size.height / imageBounds.size.height); |
|
stroke = 1.0; |
stroke *= resolution; |
if (stroke < 1.0) |
stroke = ceil(stroke); |
else |
stroke = round(stroke); |
stroke /= resolution; |
alignStroke = fmod(0.5 * stroke * resolution, 1.0); |
path = CGPathCreateMutable(); |
point = CGPointMake((self.bounds.size.width - [self cornerRadius]), self.bounds.size.height - 0.5f); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
CGPathMoveToPoint(path, NULL, point.x, point.y); |
point = CGPointMake(self.bounds.size.width - 0.5f, (self.bounds.size.height - [self cornerRadius])); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
controlPoint1 = CGPointMake((self.bounds.size.width - ([self cornerRadius] / 2.f)), self.bounds.size.height - 0.5f); |
controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution; |
controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution; |
controlPoint2 = CGPointMake(self.bounds.size.width - 0.5f, (self.bounds.size.height - ([self cornerRadius] / 2.f))); |
controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution; |
controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution; |
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y); |
point = CGPointMake(self.bounds.size.width - 0.5f, [self cornerRadius]); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
CGPathAddLineToPoint(path, NULL, point.x, point.y); |
point = CGPointMake((self.bounds.size.width - [self cornerRadius]), 0.0); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
controlPoint1 = CGPointMake(self.bounds.size.width - 0.5f, ([self cornerRadius] / 2.f)); |
controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution; |
controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution; |
controlPoint2 = CGPointMake((self.bounds.size.width - ([self cornerRadius] / 2.f)), 0.0); |
controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution; |
controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution; |
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y); |
point = CGPointMake([self cornerRadius], 0.0); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
CGPathAddLineToPoint(path, NULL, point.x, point.y); |
point = CGPointMake(0.0, [self cornerRadius]); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
controlPoint1 = CGPointMake(([self cornerRadius] / 2.f), 0.0); |
controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution; |
controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution; |
controlPoint2 = CGPointMake(0.0, ([self cornerRadius] / 2.f)); |
controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution; |
controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution; |
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y); |
point = CGPointMake(0.0, (self.bounds.size.height - [self cornerRadius])); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
CGPathAddLineToPoint(path, NULL, point.x, point.y); |
point = CGPointMake([self cornerRadius], self.bounds.size.height - 0.5f); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
controlPoint1 = CGPointMake(0.0, (self.bounds.size.height - ([self cornerRadius] / 2.f))); |
controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution; |
controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution; |
controlPoint2 = CGPointMake(([self cornerRadius] / 2.f), self.bounds.size.height - 0.5f); |
controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution; |
controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution; |
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y); |
point = CGPointMake((self.bounds.size.width - [self cornerRadius]), self.bounds.size.height - 0.5f); |
point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution; |
point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution; |
CGPathAddLineToPoint(path, NULL, point.x, point.y); |
CGPathCloseSubpath(path); |
if (self.state == UIControlStateHighlighted) |
gradient = self.highlightGradient; |
else |
gradient = self.normalGradient; |
|
CGContextAddPath(context, path); |
CGContextSaveGState(context); |
CGContextEOClip(context); |
point = CGPointMake((self.bounds.size.width / 2.0), self.bounds.size.height - 0.5f); |
point2 = CGPointMake((self.bounds.size.width / 2.0), 0.0); |
CGContextDrawLinearGradient(context, gradient, point, point2, (kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation)); |
CGContextRestoreGState(context); |
color = [UIColor colorWithRed:0.076 green:0.103 blue:0.195 alpha:1.0]; |
[color setStroke]; |
CGContextSetLineWidth(context, stroke); |
CGContextSetLineCap(context, kCGLineCapSquare); |
CGContextAddPath(context, path); |
CGContextStrokePath(context); |
CGPathRelease(path); |
|
CGColorSpaceRelease(space); |
} |
#pragma mark - |
#pragma mark Touch Handling |
- (void)hesitateUpdate |
{ |
[self setNeedsDisplay]; |
} |
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
[super touchesBegan:touches withEvent:event]; |
[self setNeedsDisplay]; |
} |
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
[super touchesCancelled:touches withEvent:event]; |
[self setNeedsDisplay]; |
[self performSelector:@selector(hesitateUpdate) withObject:nil afterDelay:0.1]; |
} |
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
[super touchesMoved:touches withEvent:event]; |
[self setNeedsDisplay]; |
|
} |
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event |
{ |
[super touchesEnded:touches withEvent:event]; |
[self setNeedsDisplay]; |
[self performSelector:@selector(hesitateUpdate) withObject:nil afterDelay:0.1]; |
} |
#pragma mark - |
#pragma mark NSCoding |
- (void)encodeWithCoder:(NSCoder *)encoder |
{ |
[super encodeWithCoder:encoder]; |
[encoder encodeObject:[self normalGradientColors] forKey:@"normalGradientColors"]; |
[encoder encodeObject:[self normalGradientLocations] forKey:@"normalGradientLocations"]; |
[encoder encodeObject:[self highlightGradientColors] forKey:@"highlightGradientColors"]; |
[encoder encodeObject:[self highlightGradientLocations] forKey:@"highlightGradientLocations"]; |
} |
|
- (id)initWithCoder:(NSCoder *)decoder |
{ |
if (self = [super initWithCoder:decoder]) |
{ |
[self setNormalGradientColors:[decoder decodeObjectForKey:@"normalGradientColors"]]; |
[self setNormalGradientLocations:[decoder decodeObjectForKey:@"normalGradientLocations"]]; |
[self setHighlightGradientColors:[decoder decodeObjectForKey:@"highlightGradientColors"]]; |
[self setHighlightGradientLocations:[decoder decodeObjectForKey:@"highlightGradientLocations"]]; |
|
if (self.normalGradientColors == nil) |
[self useWhiteStyle]; |
|
[self setOpaque:NO]; |
self.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.0]; |
} |
return self; |
} |
#pragma mark - |
- (void)dealloc |
{ |
[normalGradientColors release]; |
[normalGradientLocations release]; |
[highlightGradientColors release]; |
[highlightGradientLocations release]; |
|
if (normalGradient != NULL) |
CGGradientRelease(normalGradient); |
if (highlightGradient != NULL) |
CGGradientRelease(highlightGradient); |
[super dealloc]; |
} |
|
@end |