Blame client/iOS/Views/BlockBackground.m

Packit Service fa4841
//
Packit Service fa4841
//  BlockBackground.m
Packit Service fa4841
//  arrived
Packit Service fa4841
//
Packit Service fa4841
//  Created by Gustavo Ambrozio on 29/11/11.
Packit Service fa4841
//  Copyright (c) 2011 N/A. All rights reserved.
Packit Service fa4841
//
Packit Service fa4841
Packit Service fa4841
#import "BlockBackground.h"
Packit Service fa4841
Packit Service fa4841
@implementation BlockBackground
Packit Service fa4841
Packit Service fa4841
@synthesize backgroundImage = _backgroundImage;
Packit Service fa4841
@synthesize vignetteBackground = _vignetteBackground;
Packit Service fa4841
Packit Service fa4841
static BlockBackground *_sharedInstance = nil;
Packit Service fa4841
Packit Service fa4841
+ (BlockBackground *)sharedInstance
Packit Service fa4841
{
Packit Service fa4841
	if (_sharedInstance != nil)
Packit Service fa4841
	{
Packit Service fa4841
		return _sharedInstance;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	@synchronized(self)
Packit Service fa4841
	{
Packit Service fa4841
		if (_sharedInstance == nil)
Packit Service fa4841
		{
Packit Service fa4841
			[[[self alloc] init] autorelease];
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return _sharedInstance;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
+ (id)allocWithZone:(NSZone *)zone
Packit Service fa4841
{
Packit Service fa4841
	@synchronized(self)
Packit Service fa4841
	{
Packit Service fa4841
		if (_sharedInstance == nil)
Packit Service fa4841
		{
Packit Service fa4841
			_sharedInstance = [super allocWithZone:zone];
Packit Service fa4841
			return _sharedInstance;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	NSAssert(NO, @ "[BlockBackground alloc] explicitly called on singleton class.");
Packit Service fa4841
	return nil;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (id)copyWithZone:(NSZone *)zone
Packit Service fa4841
{
Packit Service fa4841
	return self;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (id)retain
Packit Service fa4841
{
Packit Service fa4841
	return self;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (unsigned)retainCount
Packit Service fa4841
{
Packit Service fa4841
	return UINT_MAX;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (oneway void)release
Packit Service fa4841
{
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (id)autorelease
Packit Service fa4841
{
Packit Service fa4841
	return self;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (void)setRotation:(NSNotification *)notification
Packit Service fa4841
{
Packit Service fa4841
	UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
Packit Service fa4841
Packit Service fa4841
	CGRect orientationFrame = [UIScreen mainScreen].bounds;
Packit Service fa4841
Packit Service fa4841
	if ((UIInterfaceOrientationIsLandscape(orientation) &&
Packit Service fa4841
	     orientationFrame.size.height > orientationFrame.size.width) ||
Packit Service fa4841
	    (UIInterfaceOrientationIsPortrait(orientation) &&
Packit Service fa4841
	     orientationFrame.size.width > orientationFrame.size.height))
Packit Service fa4841
	{
Packit Service fa4841
		float temp = orientationFrame.size.width;
Packit Service fa4841
		orientationFrame.size.width = orientationFrame.size.height;
Packit Service fa4841
		orientationFrame.size.height = temp;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	self.transform = CGAffineTransformIdentity;
Packit Service fa4841
	self.frame = orientationFrame;
Packit Service fa4841
Packit Service fa4841
	CGFloat posY = orientationFrame.size.height / 2;
Packit Service fa4841
	CGFloat posX = orientationFrame.size.width / 2;
Packit Service fa4841
Packit Service fa4841
	CGPoint newCenter;
Packit Service fa4841
	CGFloat rotateAngle;
Packit Service fa4841
Packit Service fa4841
	switch (orientation)
Packit Service fa4841
	{
Packit Service fa4841
		case UIInterfaceOrientationPortraitUpsideDown:
Packit Service fa4841
			rotateAngle = M_PI;
Packit Service fa4841
			newCenter = CGPointMake(posX, orientationFrame.size.height - posY);
Packit Service fa4841
			break;
Packit Service fa4841
		case UIInterfaceOrientationLandscapeLeft:
Packit Service fa4841
			rotateAngle = -M_PI / 2.0f;
Packit Service fa4841
			newCenter = CGPointMake(posY, posX);
Packit Service fa4841
			break;
Packit Service fa4841
		case UIInterfaceOrientationLandscapeRight:
Packit Service fa4841
			rotateAngle = M_PI / 2.0f;
Packit Service fa4841
			newCenter = CGPointMake(orientationFrame.size.height - posY, posX);
Packit Service fa4841
			break;
Packit Service fa4841
		default: // UIInterfaceOrientationPortrait
Packit Service fa4841
			rotateAngle = 0.0;
Packit Service fa4841
			newCenter = CGPointMake(posX, posY);
Packit Service fa4841
			break;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	self.transform = CGAffineTransformMakeRotation(rotateAngle);
Packit Service fa4841
	self.center = newCenter;
Packit Service fa4841
Packit Service fa4841
	[self setNeedsLayout];
Packit Service fa4841
	[self layoutSubviews];
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (id)init
Packit Service fa4841
{
Packit Service fa4841
	self = [super initWithFrame:[[UIScreen mainScreen] bounds]];
Packit Service fa4841
	if (self)
Packit Service fa4841
	{
Packit Service fa4841
		self.windowLevel = UIWindowLevelStatusBar;
Packit Service fa4841
		self.hidden = YES;
Packit Service fa4841
		self.userInteractionEnabled = NO;
Packit Service fa4841
		self.backgroundColor = [UIColor colorWithWhite:0.4 alpha:0.5f];
Packit Service fa4841
		self.vignetteBackground = NO;
Packit Service fa4841
Packit Service fa4841
		[[NSNotificationCenter defaultCenter]
Packit Service fa4841
		    addObserver:self
Packit Service fa4841
		       selector:@selector(setRotation:)
Packit Service fa4841
		           name:UIApplicationDidChangeStatusBarOrientationNotification
Packit Service fa4841
		         object:nil];
Packit Service fa4841
		[self setRotation:nil];
Packit Service fa4841
	}
Packit Service fa4841
	return self;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (void)addToMainWindow:(UIView *)view
Packit Service fa4841
{
Packit Service fa4841
	[self setRotation:nil];
Packit Service fa4841
Packit Service fa4841
	if ([self.subviews containsObject:view])
Packit Service fa4841
		return;
Packit Service fa4841
Packit Service fa4841
	if (self.hidden)
Packit Service fa4841
	{
Packit Service fa4841
		_previousKeyWindow = [[[UIApplication sharedApplication] keyWindow] retain];
Packit Service fa4841
		self.alpha = 0.0f;
Packit Service fa4841
		self.hidden = NO;
Packit Service fa4841
		self.userInteractionEnabled = YES;
Packit Service fa4841
		[self makeKeyWindow];
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (self.subviews.count > 0)
Packit Service fa4841
	{
Packit Service fa4841
		((UIView *)[self.subviews lastObject]).userInteractionEnabled = NO;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (_backgroundImage)
Packit Service fa4841
	{
Packit Service fa4841
		UIImageView *backgroundView = [[UIImageView alloc] initWithImage:_backgroundImage];
Packit Service fa4841
		backgroundView.frame = self.bounds;
Packit Service fa4841
		backgroundView.contentMode = UIViewContentModeScaleToFill;
Packit Service fa4841
		[self addSubview:backgroundView];
Packit Service fa4841
		[backgroundView release];
Packit Service fa4841
		[_backgroundImage release];
Packit Service fa4841
		_backgroundImage = nil;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	[self addSubview:view];
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (void)reduceAlphaIfEmpty
Packit Service fa4841
{
Packit Service fa4841
	if (self.subviews.count == 1 ||
Packit Service fa4841
	    (self.subviews.count == 2 &&
Packit Service fa4841
	     [[self.subviews objectAtIndex:0] isKindOfClass:[UIImageView class]]))
Packit Service fa4841
	{
Packit Service fa4841
		self.alpha = 0.0f;
Packit Service fa4841
		self.userInteractionEnabled = NO;
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (void)removeView:(UIView *)view
Packit Service fa4841
{
Packit Service fa4841
	[view removeFromSuperview];
Packit Service fa4841
Packit Service fa4841
	UIView *topView = [self.subviews lastObject];
Packit Service fa4841
	if ([topView isKindOfClass:[UIImageView class]])
Packit Service fa4841
	{
Packit Service fa4841
		// It's a background. Remove it too
Packit Service fa4841
		[topView removeFromSuperview];
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (self.subviews.count == 0)
Packit Service fa4841
	{
Packit Service fa4841
		self.hidden = YES;
Packit Service fa4841
		[_previousKeyWindow makeKeyWindow];
Packit Service fa4841
		[_previousKeyWindow release];
Packit Service fa4841
		_previousKeyWindow = nil;
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		((UIView *)[self.subviews lastObject]).userInteractionEnabled = YES;
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
- (void)drawRect:(CGRect)rect
Packit Service fa4841
{
Packit Service fa4841
	if (_backgroundImage || !_vignetteBackground)
Packit Service fa4841
		return;
Packit Service fa4841
	CGContextRef context = UIGraphicsGetCurrentContext();
Packit Service fa4841
Packit Service fa4841
	size_t locationsCount = 2;
Packit Service fa4841
	CGFloat locations[2] = { 0.0f, 1.0f };
Packit Service fa4841
	CGFloat colors[8] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f };
Packit Service fa4841
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
Packit Service fa4841
	CGGradientRef gradient =
Packit Service fa4841
	    CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount);
Packit Service fa4841
	CGColorSpaceRelease(colorSpace);
Packit Service fa4841
Packit Service fa4841
	CGPoint center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);
Packit Service fa4841
	float radius = MIN(self.bounds.size.width, self.bounds.size.height);
Packit Service fa4841
	CGContextDrawRadialGradient(context, gradient, center, 0, center, radius,
Packit Service fa4841
	                            kCGGradientDrawsAfterEndLocation);
Packit Service fa4841
	CGGradientRelease(gradient);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
@end