Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 804 → Rev 805

/iKopter/trunk/Classes/GradientButton.m
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