Blame client/iOS/Views/BlockAlertView.m

Packit 1fb8d4
//
Packit 1fb8d4
//  BlockAlertView.m
Packit 1fb8d4
//
Packit 1fb8d4
//
Packit 1fb8d4
Packit 1fb8d4
#import "BlockAlertView.h"
Packit 1fb8d4
#import "BlockBackground.h"
Packit 1fb8d4
#import "BlockUI.h"
Packit 1fb8d4
Packit 1fb8d4
@implementation BlockAlertView
Packit 1fb8d4
Packit 1fb8d4
@synthesize view = _view;
Packit 1fb8d4
@synthesize backgroundImage = _backgroundImage;
Packit 1fb8d4
@synthesize vignetteBackground = _vignetteBackground;
Packit 1fb8d4
Packit 1fb8d4
static UIImage *background = nil;
Packit 1fb8d4
static UIImage *backgroundlandscape = nil;
Packit 1fb8d4
static UIFont *titleFont = nil;
Packit 1fb8d4
static UIFont *messageFont = nil;
Packit 1fb8d4
static UIFont *buttonFont = nil;
Packit 1fb8d4
Packit 1fb8d4
#pragma mark - init
Packit 1fb8d4
Packit 1fb8d4
+ (void)initialize
Packit 1fb8d4
{
Packit Service 5a9772
	if (self == [BlockAlertView class])
Packit Service 5a9772
	{
Packit Service 5a9772
		background = [UIImage imageNamed:kAlertViewBackground];
Packit Service 5a9772
		background =
Packit Service 5a9772
		    [[background stretchableImageWithLeftCapWidth:0
Packit Service 5a9772
		                                     topCapHeight:kAlertViewBackgroundCapHeight] retain];
Packit Service 5a9772
Packit Service 5a9772
		backgroundlandscape = [UIImage imageNamed:kAlertViewBackgroundLandscape];
Packit Service 5a9772
		backgroundlandscape = [[backgroundlandscape
Packit Service 5a9772
		    stretchableImageWithLeftCapWidth:0
Packit Service 5a9772
		                        topCapHeight:kAlertViewBackgroundCapHeight] retain];
Packit Service 5a9772
Packit Service 5a9772
		titleFont = [kAlertViewTitleFont retain];
Packit Service 5a9772
		messageFont = [kAlertViewMessageFont retain];
Packit Service 5a9772
		buttonFont = [kAlertViewButtonFont retain];
Packit Service 5a9772
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
+ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message
Packit 1fb8d4
{
Packit Service 5a9772
	return [[[BlockAlertView alloc] initWithTitle:title message:message] autorelease];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
+ (void)showInfoAlertWithTitle:(NSString *)title message:(NSString *)message
Packit 1fb8d4
{
Packit Service 5a9772
	BlockAlertView *alert = [[BlockAlertView alloc] initWithTitle:title message:message];
Packit Service 5a9772
	[alert setCancelButtonWithTitle:NSLocalizedString(@"Dismiss", nil) block:nil];
Packit Service 5a9772
	[alert show];
Packit Service 5a9772
	[alert release];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
+ (void)showErrorAlert:(NSError *)error
Packit 1fb8d4
{
Packit Service 5a9772
	BlockAlertView *alert = [[BlockAlertView alloc]
Packit Service 5a9772
	    initWithTitle:NSLocalizedString(@"Operation Failed", nil)
Packit Service 5a9772
	          message:[NSString
Packit Service 5a9772
	                      stringWithFormat:NSLocalizedString(
Packit Service 5a9772
	                                           @"The operation did not complete successfully: %@",
Packit Service 5a9772
	                                           nil),
Packit Service 5a9772
	                                       error]];
Packit Service 5a9772
	[alert setCancelButtonWithTitle:@"Dismiss" block:nil];
Packit Service 5a9772
	[alert show];
Packit Service 5a9772
	[alert release];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
///////////////////////////////////////////////////////////////////////////////////////////////////
Packit 1fb8d4
#pragma mark - NSObject
Packit 1fb8d4
Packit Service 5a9772
- (void)addComponents:(CGRect)frame
Packit Service 5a9772
{
Packit Service 5a9772
	if (_title)
Packit Service 5a9772
	{
Packit Service 5a9772
		CGSize size = [_title sizeWithFont:titleFont
Packit Service 5a9772
		                 constrainedToSize:CGSizeMake(frame.size.width - kAlertViewBorder * 2, 1000)
Packit Service 5a9772
		                     lineBreakMode:NSLineBreakByWordWrapping];
Packit Service 5a9772
Packit Service 5a9772
		UILabel *labelView = [[UILabel alloc]
Packit Service 5a9772
		    initWithFrame:CGRectMake(kAlertViewBorder, _height,
Packit Service 5a9772
		                             frame.size.width - kAlertViewBorder * 2, size.height)];
Packit Service 5a9772
		labelView.font = titleFont;
Packit Service 5a9772
		labelView.numberOfLines = 0;
Packit Service 5a9772
		labelView.lineBreakMode = NSLineBreakByWordWrapping;
Packit Service 5a9772
		labelView.textColor = kAlertViewTitleTextColor;
Packit Service 5a9772
		labelView.backgroundColor = [UIColor clearColor];
Packit Service 5a9772
		labelView.textAlignment = NSTextAlignmentCenter;
Packit Service 5a9772
		labelView.shadowColor = kAlertViewTitleShadowColor;
Packit Service 5a9772
		labelView.shadowOffset = kAlertViewTitleShadowOffset;
Packit Service 5a9772
		labelView.text = _title;
Packit Service 5a9772
		[_view addSubview:labelView];
Packit Service 5a9772
		[labelView release];
Packit Service 5a9772
Packit Service 5a9772
		_height += size.height + kAlertViewBorder;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	if (_message)
Packit Service 5a9772
	{
Packit Service 5a9772
		CGSize size =
Packit Service 5a9772
		    [_message sizeWithFont:messageFont
Packit Service 5a9772
		         constrainedToSize:CGSizeMake(frame.size.width - kAlertViewBorder * 2, 1000)
Packit Service 5a9772
		             lineBreakMode:NSLineBreakByWordWrapping];
Packit Service 5a9772
Packit Service 5a9772
		UILabel *labelView = [[UILabel alloc]
Packit Service 5a9772
		    initWithFrame:CGRectMake(kAlertViewBorder, _height,
Packit Service 5a9772
		                             frame.size.width - kAlertViewBorder * 2, size.height)];
Packit Service 5a9772
		labelView.font = messageFont;
Packit Service 5a9772
		labelView.numberOfLines = 0;
Packit Service 5a9772
		labelView.lineBreakMode = NSLineBreakByWordWrapping;
Packit Service 5a9772
		labelView.textColor = kAlertViewMessageTextColor;
Packit Service 5a9772
		labelView.backgroundColor = [UIColor clearColor];
Packit Service 5a9772
		labelView.textAlignment = NSTextAlignmentCenter;
Packit Service 5a9772
		labelView.shadowColor = kAlertViewMessageShadowColor;
Packit Service 5a9772
		labelView.shadowOffset = kAlertViewMessageShadowOffset;
Packit Service 5a9772
		labelView.text = _message;
Packit Service 5a9772
		[_view addSubview:labelView];
Packit Service 5a9772
		[labelView release];
Packit Service 5a9772
Packit Service 5a9772
		_height += size.height + kAlertViewBorder;
Packit Service 5a9772
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)setupDisplay
Packit 1fb8d4
{
Packit Service 5a9772
	[[_view subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Packit Service 5a9772
		[obj removeFromSuperview];
Packit Service 5a9772
	}];
Packit Service 5a9772
Packit Service 5a9772
	UIWindow *parentView = [BlockBackground sharedInstance];
Packit Service 5a9772
	CGRect frame = parentView.bounds;
Packit Service 5a9772
	frame.origin.x = floorf((frame.size.width - background.size.width) * 0.5);
Packit Service 5a9772
	frame.size.width = background.size.width;
Packit Service 5a9772
Packit Service 5a9772
	UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
Packit Service 5a9772
	if (UIInterfaceOrientationIsLandscape(orientation))
Packit Service 5a9772
	{
Packit Service 5a9772
		frame.size.width += 150;
Packit Service 5a9772
		frame.origin.x -= 75;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	_view.frame = frame;
Packit Service 5a9772
Packit Service 5a9772
	_height = kAlertViewBorder + 15;
Packit Service 5a9772
Packit Service 5a9772
	if (NeedsLandscapePhoneTweaks)
Packit Service 5a9772
	{
Packit Service 5a9772
		_height -= 15; // landscape phones need to trimmed a bit
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	[self addComponents:frame];
Packit Service 5a9772
Packit Service 5a9772
	if (_shown)
Packit Service 5a9772
		[self show];
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
- (id)initWithTitle:(NSString *)title message:(NSString *)message
Packit 1fb8d4
{
Packit Service 5a9772
	self = [super init];
Packit Service 5a9772
Packit Service 5a9772
	if (self)
Packit Service 5a9772
	{
Packit Service 5a9772
		_title = [title copy];
Packit Service 5a9772
		_message = [message copy];
Packit Service 5a9772
Packit Service 5a9772
		_view = [[UIView alloc] init];
Packit Service 5a9772
Packit Service 5a9772
		_view.autoresizingMask =
Packit Service 5a9772
		    UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin |
Packit Service 5a9772
		    UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
Packit Service 5a9772
Packit Service 5a9772
		_blocks = [[NSMutableArray alloc] init];
Packit Service 5a9772
Packit Service 5a9772
		[[NSNotificationCenter defaultCenter]
Packit Service 5a9772
		    addObserver:self
Packit Service 5a9772
		       selector:@selector(setupDisplay)
Packit Service 5a9772
		           name:UIApplicationDidChangeStatusBarOrientationNotification
Packit Service 5a9772
		         object:nil];
Packit Service 5a9772
Packit Service 5a9772
		if ([self class] == [BlockAlertView class])
Packit Service 5a9772
			[self setupDisplay];
Packit Service 5a9772
Packit Service 5a9772
		_vignetteBackground = NO;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return self;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
- (void)dealloc
Packit 1fb8d4
{
Packit Service 5a9772
	[_title release];
Packit Service 5a9772
	[_message release];
Packit Service 5a9772
	[_backgroundImage release];
Packit Service 5a9772
	[_view release];
Packit Service 5a9772
	[_blocks release];
Packit Service 5a9772
	[super dealloc];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
///////////////////////////////////////////////////////////////////////////////////////////////////
Packit 1fb8d4
#pragma mark - Public
Packit 1fb8d4
Packit Service 5a9772
- (void)addButtonWithTitle:(NSString *)title color:(NSString *)color block:(void (^)())block
Packit 1fb8d4
{
Packit Service 5a9772
	[_blocks addObject:[NSArray arrayWithObjects:block ? [[block copy] autorelease] : [NSNull null],
Packit Service 5a9772
	                                             title, color, nil]];
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block
Packit 1fb8d4
{
Packit Service 5a9772
	[self addButtonWithTitle:title color:@"gray" block:block];
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block
Packit 1fb8d4
{
Packit Service 5a9772
	[self addButtonWithTitle:title color:@"black" block:block];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block
Packit 1fb8d4
{
Packit Service 5a9772
	[self addButtonWithTitle:title color:@"red" block:block];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)show
Packit 1fb8d4
{
Packit Service 5a9772
	_shown = YES;
Packit Service 5a9772
Packit Service 5a9772
	BOOL isSecondButton = NO;
Packit Service 5a9772
	NSUInteger index = 0;
Packit Service 5a9772
	for (NSUInteger i = 0; i < _blocks.count; i++)
Packit Service 5a9772
	{
Packit Service 5a9772
		NSArray *block = [_blocks objectAtIndex:i];
Packit Service 5a9772
		NSString *title = [block objectAtIndex:1];
Packit Service 5a9772
		NSString *color = [block objectAtIndex:2];
Packit Service 5a9772
Packit Service 5a9772
		UIImage *image =
Packit Service 5a9772
		    [UIImage imageNamed:[NSString stringWithFormat:@"alert-%@-button.png", color]];
Packit Service 5a9772
		image = [image stretchableImageWithLeftCapWidth:(int)(image.size.width + 1) >> 1
Packit Service 5a9772
		                                   topCapHeight:0];
Packit Service 5a9772
Packit Service 5a9772
		CGFloat maxHalfWidth = floorf((_view.bounds.size.width - kAlertViewBorder * 3) * 0.5);
Packit Service 5a9772
		CGFloat width = _view.bounds.size.width - kAlertViewBorder * 2;
Packit Service 5a9772
		CGFloat xOffset = kAlertViewBorder;
Packit Service 5a9772
		if (isSecondButton)
Packit Service 5a9772
		{
Packit Service 5a9772
			width = maxHalfWidth;
Packit Service 5a9772
			xOffset = width + kAlertViewBorder * 2;
Packit Service 5a9772
			isSecondButton = NO;
Packit Service 5a9772
		}
Packit Service 5a9772
		else if (i + 1 < _blocks.count)
Packit Service 5a9772
		{
Packit Service 5a9772
			// In this case there's another button.
Packit Service 5a9772
			// Let's check if they fit on the same line.
Packit Service 5a9772
			CGSize size = [title sizeWithFont:buttonFont
Packit Service 5a9772
			                      minFontSize:10
Packit Service 5a9772
			                   actualFontSize:nil
Packit Service 5a9772
			                         forWidth:_view.bounds.size.width - kAlertViewBorder * 2
Packit Service 5a9772
			                    lineBreakMode:NSLineBreakByClipping];
Packit Service 5a9772
Packit Service 5a9772
			if (size.width < maxHalfWidth - kAlertViewBorder)
Packit Service 5a9772
			{
Packit Service 5a9772
				// It might fit. Check the next Button
Packit Service 5a9772
				NSArray *block2 = [_blocks objectAtIndex:i + 1];
Packit Service 5a9772
				NSString *title2 = [block2 objectAtIndex:1];
Packit Service 5a9772
				size = [title2 sizeWithFont:buttonFont
Packit Service 5a9772
				                minFontSize:10
Packit Service 5a9772
				             actualFontSize:nil
Packit Service 5a9772
				                   forWidth:_view.bounds.size.width - kAlertViewBorder * 2
Packit Service 5a9772
				              lineBreakMode:NSLineBreakByClipping];
Packit Service 5a9772
Packit Service 5a9772
				if (size.width < maxHalfWidth - kAlertViewBorder)
Packit Service 5a9772
				{
Packit Service 5a9772
					// They'll fit!
Packit Service 5a9772
					isSecondButton = YES; // For the next iteration
Packit Service 5a9772
					width = maxHalfWidth;
Packit Service 5a9772
				}
Packit Service 5a9772
			}
Packit Service 5a9772
		}
Packit Service 5a9772
		else if (_blocks.count == 1)
Packit Service 5a9772
		{
Packit Service 5a9772
			// In this case this is the ony button. We'll size according to the text
Packit Service 5a9772
			CGSize size = [title sizeWithFont:buttonFont
Packit Service 5a9772
			                      minFontSize:10
Packit Service 5a9772
			                   actualFontSize:nil
Packit Service 5a9772
			                         forWidth:_view.bounds.size.width - kAlertViewBorder * 2
Packit Service 5a9772
			                    lineBreakMode:UILineBreakModeClip];
Packit Service 5a9772
Packit Service 5a9772
			size.width = MAX(size.width, 80);
Packit Service 5a9772
			if (size.width + 2 * kAlertViewBorder < width)
Packit Service 5a9772
			{
Packit Service 5a9772
				width = size.width + 2 * kAlertViewBorder;
Packit Service 5a9772
				xOffset = floorf((_view.bounds.size.width - width) * 0.5);
Packit Service 5a9772
			}
Packit Service 5a9772
		}
Packit Service 5a9772
Packit Service 5a9772
		UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
Packit Service 5a9772
		button.frame = CGRectMake(xOffset, _height, width, kAlertButtonHeight);
Packit Service 5a9772
		button.titleLabel.font = buttonFont;
Packit Service 5a9772
		if (IOS_LESS_THAN_6)
Packit Service 5a9772
		{
Packit 1fb8d4
#pragma clang diagnostic push
Packit 1fb8d4
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
Packit Service 5a9772
			button.titleLabel.minimumFontSize = 10;
Packit 1fb8d4
#pragma clang diagnostic pop
Packit Service 5a9772
		}
Packit Service 5a9772
		else
Packit Service 5a9772
		{
Packit Service 5a9772
			button.titleLabel.adjustsFontSizeToFitWidth = YES;
Packit Service 5a9772
			button.titleLabel.adjustsLetterSpacingToFitWidth = YES;
Packit Service 5a9772
			button.titleLabel.minimumScaleFactor = 0.1;
Packit Service 5a9772
		}
Packit Service 5a9772
		button.titleLabel.textAlignment = NSTextAlignmentCenter;
Packit Service 5a9772
		button.titleLabel.shadowOffset = kAlertViewButtonShadowOffset;
Packit Service 5a9772
		button.backgroundColor = [UIColor clearColor];
Packit Service 5a9772
		button.tag = i + 1;
Packit Service 5a9772
Packit Service 5a9772
		[button setBackgroundImage:image forState:UIControlStateNormal];
Packit Service 5a9772
		[button setTitleColor:kAlertViewButtonTextColor forState:UIControlStateNormal];
Packit Service 5a9772
		[button setTitleShadowColor:kAlertViewButtonShadowColor forState:UIControlStateNormal];
Packit Service 5a9772
		[button setTitle:title forState:UIControlStateNormal];
Packit Service 5a9772
		button.accessibilityLabel = title;
Packit Service 5a9772
Packit Service 5a9772
		[button addTarget:self
Packit Service 5a9772
		              action:@selector(buttonClicked:)
Packit Service 5a9772
		    forControlEvents:UIControlEventTouchUpInside];
Packit Service 5a9772
Packit Service 5a9772
		[_view addSubview:button];
Packit Service 5a9772
Packit Service 5a9772
		if (!isSecondButton)
Packit Service 5a9772
			_height += kAlertButtonHeight + kAlertViewBorder;
Packit Service 5a9772
Packit Service 5a9772
		index++;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	_height += 10; // Margin for the shadow
Packit Service 5a9772
Packit Service 5a9772
	if (_height < background.size.height)
Packit Service 5a9772
	{
Packit Service 5a9772
		CGFloat offset = background.size.height - _height;
Packit Service 5a9772
		_height = background.size.height;
Packit Service 5a9772
		CGRect frame;
Packit Service 5a9772
		for (NSUInteger i = 0; i < _blocks.count; i++)
Packit Service 5a9772
		{
Packit Service 5a9772
			UIButton *btn = (UIButton *)[_view viewWithTag:i + 1];
Packit Service 5a9772
			frame = btn.frame;
Packit Service 5a9772
			frame.origin.y += offset;
Packit Service 5a9772
			btn.frame = frame;
Packit Service 5a9772
		}
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	CGRect frame = _view.frame;
Packit Service 5a9772
	frame.origin.y = -_height;
Packit Service 5a9772
	frame.size.height = _height;
Packit Service 5a9772
	_view.frame = frame;
Packit Service 5a9772
Packit Service 5a9772
	UIImageView *modalBackground = [[UIImageView alloc] initWithFrame:_view.bounds];
Packit Service 5a9772
Packit Service 5a9772
	if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
Packit Service 5a9772
		modalBackground.image = backgroundlandscape;
Packit Service 5a9772
	else
Packit Service 5a9772
		modalBackground.image = background;
Packit Service 5a9772
Packit Service 5a9772
	modalBackground.contentMode = UIViewContentModeScaleToFill;
Packit Service 5a9772
	modalBackground.autoresizingMask =
Packit Service 5a9772
	    UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Packit Service 5a9772
	[_view insertSubview:modalBackground atIndex:0];
Packit Service 5a9772
	[modalBackground release];
Packit Service 5a9772
Packit Service 5a9772
	if (_backgroundImage)
Packit Service 5a9772
	{
Packit Service 5a9772
		[BlockBackground sharedInstance].backgroundImage = _backgroundImage;
Packit Service 5a9772
		[_backgroundImage release];
Packit Service 5a9772
		_backgroundImage = nil;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	[BlockBackground sharedInstance].vignetteBackground = _vignetteBackground;
Packit Service 5a9772
	[[BlockBackground sharedInstance] addToMainWindow:_view];
Packit Service 5a9772
Packit Service 5a9772
	__block CGPoint center = _view.center;
Packit Service 5a9772
	center.y = floorf([BlockBackground sharedInstance].bounds.size.height * 0.5) + kAlertViewBounce;
Packit Service 5a9772
Packit Service 5a9772
	_cancelBounce = NO;
Packit Service 5a9772
Packit Service 5a9772
	[UIView animateWithDuration:0.4
Packit Service 5a9772
	    delay:0.0
Packit Service 5a9772
	    options:UIViewAnimationCurveEaseOut
Packit Service 5a9772
	    animations:^{
Packit Service 5a9772
		    [BlockBackground sharedInstance].alpha = 1.0f;
Packit Service 5a9772
		    _view.center = center;
Packit Service 5a9772
	    }
Packit Service 5a9772
	    completion:^(BOOL finished) {
Packit Service 5a9772
		    if (_cancelBounce)
Packit Service 5a9772
			    return;
Packit Service 5a9772
Packit Service 5a9772
		    [UIView animateWithDuration:0.1
Packit Service 5a9772
		        delay:0.0
Packit Service 5a9772
		        options:0
Packit Service 5a9772
		        animations:^{
Packit Service 5a9772
			        center.y -= kAlertViewBounce;
Packit Service 5a9772
			        _view.center = center;
Packit Service 5a9772
		        }
Packit Service 5a9772
		        completion:^(BOOL finished) {
Packit Service 5a9772
			        [[NSNotificationCenter defaultCenter]
Packit Service 5a9772
			            postNotificationName:@"AlertViewFinishedAnimations"
Packit Service 5a9772
			                          object:nil];
Packit Service 5a9772
		        }];
Packit Service 5a9772
	    }];
Packit Service 5a9772
Packit Service 5a9772
	[self retain];
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
Packit 1fb8d4
{
Packit Service 5a9772
	_shown = NO;
Packit Service 5a9772
Packit Service 5a9772
	[[NSNotificationCenter defaultCenter] removeObserver:self];
Packit Service 5a9772
Packit Service 5a9772
	if (buttonIndex >= 0 && buttonIndex < [_blocks count])
Packit Service 5a9772
	{
Packit Service 5a9772
		id obj = [[_blocks objectAtIndex:buttonIndex] objectAtIndex:0];
Packit Service 5a9772
		if (![obj isEqual:[NSNull null]])
Packit Service 5a9772
		{
Packit Service 5a9772
			((void (^)())obj)();
Packit Service 5a9772
		}
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	if (animated)
Packit Service 5a9772
	{
Packit Service 5a9772
		[UIView animateWithDuration:0.1
Packit Service 5a9772
		    delay:0.0
Packit Service 5a9772
		    options:0
Packit Service 5a9772
		    animations:^{
Packit Service 5a9772
			    CGPoint center = _view.center;
Packit Service 5a9772
			    center.y += 20;
Packit Service 5a9772
			    _view.center = center;
Packit Service 5a9772
		    }
Packit Service 5a9772
		    completion:^(BOOL finished) {
Packit Service 5a9772
			    [UIView animateWithDuration:0.4
Packit Service 5a9772
			        delay:0.0
Packit Service 5a9772
			        options:UIViewAnimationCurveEaseIn
Packit Service 5a9772
			        animations:^{
Packit Service 5a9772
				        CGRect frame = _view.frame;
Packit Service 5a9772
				        frame.origin.y = -frame.size.height;
Packit Service 5a9772
				        _view.frame = frame;
Packit Service 5a9772
				        [[BlockBackground sharedInstance] reduceAlphaIfEmpty];
Packit Service 5a9772
			        }
Packit Service 5a9772
			        completion:^(BOOL finished) {
Packit Service 5a9772
				        [[BlockBackground sharedInstance] removeView:_view];
Packit Service 5a9772
				        [_view release];
Packit Service 5a9772
				        _view = nil;
Packit Service 5a9772
				        [self autorelease];
Packit Service 5a9772
			        }];
Packit Service 5a9772
		    }];
Packit Service 5a9772
	}
Packit Service 5a9772
	else
Packit Service 5a9772
	{
Packit Service 5a9772
		[[BlockBackground sharedInstance] removeView:_view];
Packit Service 5a9772
		[_view release];
Packit Service 5a9772
		_view = nil;
Packit Service 5a9772
		[self autorelease];
Packit Service 5a9772
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
///////////////////////////////////////////////////////////////////////////////////////////////////
Packit 1fb8d4
#pragma mark - Action
Packit 1fb8d4
Packit Service 5a9772
- (void)buttonClicked:(id)sender
Packit 1fb8d4
{
Packit Service 5a9772
	/* Run the button's block */
Packit Service 5a9772
	int buttonIndex = [sender tag] - 1;
Packit Service 5a9772
	[self dismissWithClickedButtonIndex:buttonIndex animated:YES];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
@end