|
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
|