569 lines
28 KiB
Objective-C
569 lines
28 KiB
Objective-C
//
|
|
// 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 strokeWeight, strokeColor;
|
|
@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, (__bridge_retained 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, (__bridge_retained 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 clearColor];
|
|
}
|
|
return self;
|
|
}
|
|
#pragma mark -
|
|
#pragma mark Appearances
|
|
- (void)useAlertStyle
|
|
{
|
|
// Oddly enough, if I create the color array using arrayWithObjects:, it
|
|
// doesn't work - the gradient comes back NULL
|
|
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 = [NSArray 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 = [NSArray 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 = [NSArray 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 redColor] forState:UIControlStateNormal];
|
|
}
|
|
- (void)useWhiteActionSheetStyle
|
|
{
|
|
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:7];
|
|
color = [UIColor colorWithRed:0.033 green:0.251 blue:0.673 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.66 green:0.701 blue:0.88 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.222 green:0.308 blue:0.709 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.145 green:0.231 blue:0.683 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.0 green:0.124 blue:0.621 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.011 green:0.181 blue:0.647 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.311 green:0.383 blue:0.748 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.957f],
|
|
[NSNumber numberWithFloat:0.574f],
|
|
[NSNumber numberWithFloat:0.541],
|
|
[NSNumber numberWithFloat:0.185f],
|
|
[NSNumber numberWithFloat:0.812f],
|
|
nil];
|
|
|
|
self.cornerRadius = 9.f;
|
|
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
|
|
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
|
|
}
|
|
- (void)useBlackActionSheetStyle
|
|
{
|
|
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:7];
|
|
color = [UIColor colorWithRed:0.033 green:0.251 blue:0.673 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.66 green:0.701 blue:0.88 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.222 green:0.308 blue:0.709 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.145 green:0.231 blue:0.683 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.0 green:0.124 blue:0.621 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.011 green:0.181 blue:0.647 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.311 green:0.383 blue:0.748 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.957f],
|
|
[NSNumber numberWithFloat:0.574f],
|
|
[NSNumber numberWithFloat:0.541],
|
|
[NSNumber numberWithFloat:0.185],
|
|
[NSNumber numberWithFloat:0.812f],
|
|
nil];
|
|
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
|
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
|
|
}
|
|
- (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];
|
|
}
|
|
- (void)useGreenConfirmStyle
|
|
{
|
|
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:5];
|
|
UIColor *color = [UIColor colorWithRed:0.15 green:0.667 blue:0.152 alpha:1.0];
|
|
[colors addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.566 green:0.841 blue:0.566 alpha:1.0];
|
|
[colors addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.341 green:0.75 blue:0.345 alpha:1.0];
|
|
[colors addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.0 green:0.592 blue:0.0 alpha:1.0];
|
|
[colors addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.0 green:0.592 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.009 green:0.467 blue:0.005 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.562 green:0.754 blue:0.562 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.212 green:0.543 blue:0.212 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.153 green:0.5 blue:0.152 alpha:1.0];
|
|
[colors2 addObject:(id)[color CGColor]];
|
|
color = [UIColor colorWithRed:0.004 green:0.388 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];
|
|
|
|
}
|
|
#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);
|
|
|
|
|
|
CGGradientRef gradient;
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
CGPoint point2;
|
|
|
|
CGFloat resolution = 0.5 * (self.bounds.size.width / imageBounds.size.width + self.bounds.size.height / imageBounds.size.height);
|
|
|
|
CGFloat stroke = strokeWeight * resolution;
|
|
if (stroke < 1.0)
|
|
stroke = ceil(stroke);
|
|
else
|
|
stroke = round(stroke);
|
|
stroke /= resolution;
|
|
CGFloat alignStroke = fmod(0.5 * stroke * resolution, 1.0);
|
|
CGMutablePathRef path = CGPathCreateMutable();
|
|
CGPoint 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;
|
|
CGPoint 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;
|
|
CGPoint 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);
|
|
[strokeColor setStroke];
|
|
CGContextSetLineWidth(context, stroke);
|
|
CGContextSetLineCap(context, kCGLineCapSquare);
|
|
CGContextAddPath(context, path);
|
|
CGContextStrokePath(context);
|
|
CGPathRelease(path);
|
|
|
|
}
|
|
#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"]];
|
|
self.strokeColor = [UIColor colorWithRed:0.076 green:0.103 blue:0.195 alpha:1.0];
|
|
self.strokeWeight = 1.0;
|
|
|
|
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 -
|
|
|
|
|
|
@end
|