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