Initial commit
This commit is contained in:
+178
@@ -0,0 +1,178 @@
|
||||
//
|
||||
// MMProgressHUDOverlayView.m
|
||||
// MMProgressHUDDemo
|
||||
//
|
||||
// Created by Lars Anderson on 7/5/12.
|
||||
// Copyright (c) 2012 Mutual Mobile. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MMProgressHUDOverlayView.h"
|
||||
|
||||
@interface MMProgressHUDOverlayView()
|
||||
|
||||
@property (nonatomic) CGGradientRef gradientRef;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MMProgressHUDOverlayView
|
||||
|
||||
- (instancetype)init {
|
||||
self = [self initWithFrame:CGRectZero];
|
||||
if (self) {
|
||||
//do more stuff
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame {
|
||||
self = [self initWithFrame:frame overlayMode:MMProgressHUDWindowOverlayModeGradient];
|
||||
if (self) {
|
||||
//do stuff
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame overlayMode:(MMProgressHUDWindowOverlayMode)overlayMode {
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
_overlayMode = overlayMode;
|
||||
|
||||
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
||||
CGFloat r = 0/255.0;
|
||||
CGFloat g = 0/255.0;
|
||||
CGFloat b = 0/255.0;
|
||||
CGFloat a = 0/255.0;
|
||||
CGFloat components[4] = {r,g,b,a};
|
||||
|
||||
_overlayColor = CGColorCreate(colorSpace, components);
|
||||
CGColorSpaceRelease(colorSpace);
|
||||
|
||||
self.opaque = NO;
|
||||
|
||||
[self _buildGradient];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)drawRect:(CGRect)rect {
|
||||
[super drawRect:rect];
|
||||
|
||||
switch (self.overlayMode) {
|
||||
case MMProgressHUDWindowOverlayModeGradient:
|
||||
[self _drawRadialGradientInRect:rect];
|
||||
break;
|
||||
/*case MMProgressHUDWindowOverlayModeBlur:
|
||||
// NSAssert(NO, @"Blur overlay not yet implemented!");
|
||||
break;*/
|
||||
case MMProgressHUDWindowOverlayModeNone:
|
||||
//draw nothing
|
||||
break;
|
||||
case MMProgressHUDWindowOverlayModeLinear:{
|
||||
[self _drawLinearOverlayInRect:rect];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_buildGradient {
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
|
||||
if (_gradientRef) {
|
||||
CGGradientRelease(_gradientRef);
|
||||
}
|
||||
|
||||
NSAssert(self.overlayColor, @"Overlay color is nil!");
|
||||
|
||||
CGColorRef firstColor = CGColorCreateCopyWithAlpha(self.overlayColor, 0.f);
|
||||
CGColorRef secondColor = CGColorCreateCopyWithAlpha(self.overlayColor, 0.8f);
|
||||
CGColorRef thirdColor = CGColorCreateCopyWithAlpha(self.overlayColor, 0.8f);
|
||||
|
||||
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
|
||||
CGColorRef colorsArray[] = {
|
||||
firstColor,
|
||||
secondColor,
|
||||
thirdColor
|
||||
};
|
||||
|
||||
CFArrayRef colors = CFArrayCreate(NULL,
|
||||
(const void**)colorsArray,
|
||||
sizeof(colorsArray)/sizeof(CGColorRef),
|
||||
&kCFTypeArrayCallBacks);
|
||||
|
||||
CGFloat locationList[] = {0.0,0.5,0.5};
|
||||
|
||||
_gradientRef = CGGradientCreateWithColors(rgb, colors, locationList);
|
||||
|
||||
CGColorRelease(firstColor);
|
||||
CGColorRelease(secondColor);
|
||||
CGColorRelease(thirdColor);
|
||||
|
||||
CFRelease(colors);
|
||||
|
||||
CGColorSpaceRelease(rgb);
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
|
||||
- (void)_drawRadialGradientInRect:(CGRect)rect {
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
|
||||
CGContextSaveGState(context);
|
||||
CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
|
||||
|
||||
float startRadius = 0.005f;
|
||||
|
||||
float endRadius = rect.size.height*0.0066f;
|
||||
|
||||
NSAssert(self.gradientRef != nil, @"Gradient is nil!");
|
||||
|
||||
CGContextDrawRadialGradient(context,
|
||||
self.gradientRef,
|
||||
center,
|
||||
startRadius,
|
||||
center,
|
||||
endRadius,
|
||||
kCGGradientDrawsBeforeStartLocation |
|
||||
kCGGradientDrawsAfterEndLocation);
|
||||
|
||||
CGContextRestoreGState(context);
|
||||
}
|
||||
|
||||
- (void)_drawLinearOverlayInRect:(CGRect)rect {
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
|
||||
CGContextSaveGState(context);
|
||||
|
||||
//create copy of overlay color
|
||||
CGColorRef linearColor = CGColorCreateCopyWithAlpha(self.overlayColor, 0.3f);
|
||||
|
||||
CGContextSetFillColorWithColor(context, linearColor);
|
||||
CGContextFillRect(context, rect);
|
||||
|
||||
CGColorRelease(linearColor);
|
||||
|
||||
CGContextRestoreGState(context);
|
||||
}
|
||||
|
||||
- (void)setOverlayMode:(MMProgressHUDWindowOverlayMode)overlayMode {
|
||||
if (_overlayMode != overlayMode) {
|
||||
_overlayMode = overlayMode;
|
||||
}
|
||||
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
|
||||
- (void)setOverlayColor:(CGColorRef)overlayColor {
|
||||
CGColorRelease(_overlayColor);
|
||||
_overlayColor = CGColorCreateCopy(overlayColor);
|
||||
|
||||
[self _buildGradient];
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
CGGradientRelease(_gradientRef);
|
||||
CGColorRelease(_overlayColor);
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user