//
|
// DCRoundSwitchKnobLayer.m
|
//
|
// Created by Patrick Richards on 29/06/11.
|
// MIT License.
|
//
|
// http://twitter.com/patr
|
// http://domesticcat.com.au/projects
|
// http://github.com/domesticcatsoftware/DCRoundSwitch
|
//
|
|
#import "DCRoundSwitchKnobLayer.h"
|
|
CGGradientRef CreateGradientRefWithColors(CGColorSpaceRef colorSpace, CGColorRef startColor, CGColorRef endColor);
|
|
@implementation DCRoundSwitchKnobLayer
|
@synthesize gripped;
|
|
- (void)drawInContext:(CGContextRef)context
|
{
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
|
CGRect knobRect = CGRectInset(self.bounds, 2, 2);
|
CGFloat knobRadius = self.bounds.size.height - 2;
|
|
// knob outline (shadow is drawn in the toggle layer)
|
CGContextSetStrokeColorWithColor(context, [UIColor colorWithWhite:0.62 alpha:1.0].CGColor);
|
CGContextSetLineWidth(context, 1.5);
|
CGContextStrokeEllipseInRect(context, knobRect);
|
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 0, NULL);
|
|
// knob inner gradient
|
CGContextAddEllipseInRect(context, knobRect);
|
CGContextClip(context);
|
CGColorRef knobStartColor = [UIColor colorWithWhite:0.82 alpha:1.0].CGColor;
|
CGColorRef knobEndColor = (self.gripped) ? [UIColor colorWithWhite:0.894 alpha:1.0].CGColor : [UIColor colorWithWhite:0.996 alpha:1.0].CGColor;
|
CGPoint topPoint = CGPointMake(0, 0);
|
CGPoint bottomPoint = CGPointMake(0, knobRadius + 2);
|
CGGradientRef knobGradient = CreateGradientRefWithColors(colorSpace, knobStartColor, knobEndColor);
|
CGContextDrawLinearGradient(context, knobGradient, topPoint, bottomPoint, 0);
|
CGGradientRelease(knobGradient);
|
|
// knob inner highlight
|
CGContextAddEllipseInRect(context, CGRectInset(knobRect, 0.5, 0.5));
|
CGContextAddEllipseInRect(context, CGRectInset(knobRect, 1.5, 1.5));
|
CGContextEOClip(context);
|
CGGradientRef knobHighlightGradient = CreateGradientRefWithColors(colorSpace, [UIColor whiteColor].CGColor, [UIColor colorWithWhite:1.0 alpha:0.5].CGColor);
|
CGContextDrawLinearGradient(context, knobHighlightGradient, topPoint, bottomPoint, 0);
|
CGGradientRelease(knobHighlightGradient);
|
|
CGColorSpaceRelease(colorSpace);
|
}
|
|
CGGradientRef CreateGradientRefWithColors(CGColorSpaceRef colorSpace, CGColorRef startColor, CGColorRef endColor)
|
{
|
CGFloat colorStops[2] = {0.0, 1.0};
|
CGColorRef colors[] = {startColor, endColor};
|
CFArrayRef colorsArray = CFArrayCreate(NULL, (const void**)colors, sizeof(colors) / sizeof(CGColorRef), &kCFTypeArrayCallBacks);
|
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorsArray, colorStops);
|
CFRelease(colorsArray);
|
return gradient;
|
}
|
|
- (void)setGripped:(BOOL)newGripped
|
{
|
gripped = newGripped;
|
[self setNeedsDisplay];
|
}
|
|
@end
|