123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //
- // MJPhotoProgressView.m
- //
- // Created by mj on 13-3-4.
- // Copyright (c) 2013年 itcast. All rights reserved.
- //
- #import "MJPhotoProgressView.h"
- #define kDegreeToRadian(x) (M_PI/180.0 * (x))
- @implementation MJPhotoProgressView
- - (id)initWithFrame:(CGRect)frame
- {
- if (self = [super initWithFrame:frame]) {
- self.backgroundColor = [UIColor clearColor];
- }
- return self;
- }
- - (void)drawRect:(CGRect)rect
- {
- CGPoint centerPoint = CGPointMake(rect.size.height / 2, rect.size.width / 2);
- CGFloat radius = MIN(rect.size.height, rect.size.width) / 2;
-
- CGFloat pathWidth = radius * 0.3f;
-
- CGFloat radians = kDegreeToRadian((_progress*359.9)-90);
- CGFloat xOffset = radius*(1 + 0.85*cosf(radians));
- CGFloat yOffset = radius*(1 + 0.85*sinf(radians));
- CGPoint endPoint = CGPointMake(xOffset, yOffset);
-
- CGContextRef context = UIGraphicsGetCurrentContext();
-
- [self.trackTintColor setFill];
- CGMutablePathRef trackPath = CGPathCreateMutable();
- CGPathMoveToPoint(trackPath, NULL, centerPoint.x, centerPoint.y);
- CGPathAddArc(trackPath, NULL, centerPoint.x, centerPoint.y, radius, kDegreeToRadian(270), kDegreeToRadian(-90), NO);
- CGPathCloseSubpath(trackPath);
- CGContextAddPath(context, trackPath);
- CGContextFillPath(context);
- CGPathRelease(trackPath);
-
- [self.progressTintColor setFill];
- CGMutablePathRef progressPath = CGPathCreateMutable();
- CGPathMoveToPoint(progressPath, NULL, centerPoint.x, centerPoint.y);
- CGPathAddArc(progressPath, NULL, centerPoint.x, centerPoint.y, radius, kDegreeToRadian(270), radians, NO);
- CGPathCloseSubpath(progressPath);
- CGContextAddPath(context, progressPath);
- CGContextFillPath(context);
- CGPathRelease(progressPath);
-
- CGContextAddEllipseInRect(context, CGRectMake(centerPoint.x - pathWidth/2, 0, pathWidth, pathWidth));
- CGContextFillPath(context);
-
- CGContextAddEllipseInRect(context, CGRectMake(endPoint.x - pathWidth/2, endPoint.y - pathWidth/2, pathWidth, pathWidth));
- CGContextFillPath(context);
-
- CGContextSetBlendMode(context, kCGBlendModeClear);;
- CGFloat innerRadius = radius * 0.7;
- CGPoint newCenterPoint = CGPointMake(centerPoint.x - innerRadius, centerPoint.y - innerRadius);
- CGContextAddEllipseInRect(context, CGRectMake(newCenterPoint.x, newCenterPoint.y, innerRadius*2, innerRadius*2));
- CGContextFillPath(context);
- }
- #pragma mark - Property Methods
- - (UIColor *)trackTintColor
- {
- if (!_trackTintColor)
- {
- _trackTintColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.7f];
- }
- return _trackTintColor;
- }
- - (UIColor *)progressTintColor
- {
- if (!_progressTintColor)
- {
- _progressTintColor = [UIColor whiteColor];
- }
- return _progressTintColor;
- }
- - (void)setProgress:(float)progress
- {
- _progress = progress;
- [self setNeedsDisplay];
- }
- @end
|