179 lines
4.8 KiB
Objective-C
Executable File
179 lines
4.8 KiB
Objective-C
Executable File
//
|
|
// 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
|