Blame client/iOS/Views/BlockBackground.m

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