共享一個右側滑出的自動消失的提示框

這個控件是三年前我在亞信集團工作的時候開發,今天趴出來,順便修改一下支持最新的版本的iOS。

這是一個從屏幕的右側中間滑出來自動提示框,同時還支持網路請求的時候等待提示框。

//
//  SlidingPromptView.h
//  ChannelMgr
//
//  Created by wuyj on 5/27/13.
//  Copyright (c) 2013 asiainfo-linkage. All rights reserved.
//

#import <UIKit/UIKit.h>

@protocol SlidingPromptViewDelegate <NSObject>

@optional
-(void)dismissComplete;

@end


@interface SlidingPromptView : UIView{
}

+(void)setDismissCompleteDelegate:(id<SlidingPromptViewDelegate>)dd;

//顯示提示框
+(void)showLoadingStatus:(NSString*)status;
+(void)showStatus:(NSString*)status withFlagImage:(NSString*)flagImage;
+(void)showLoadingStatus:(NSString*)status duration:(NSTimeInterval)seconds;
+(void)showStatus:(NSString*)status withFlagImage:(NSString*)flagImage duration:(NSTimeInterval)seconds;

//在提示框中,修改顯示內容
+(void)setStatus:(NSString*)status;
+(void)setStatus:(NSString*)status withFlagImage:(NSString*)flagImage;

//隱藏提示框
+(void)dismiss;
+(void)dismiss:(NSString*)status withFlagImage:(NSString*)flagImage duration:(NSTimeInterval)seconds;
+(void)dismiss:(NSString*)status duration:(NSTimeInterval)seconds;

@end
//
//  SlidingPromptView.m
//  ChannelMgr
//
//  Created by wuyj on 5/27/13.
//  Copyright (c) 2013 asiainfo-linkage. All rights reserved.
//

#import "SlidingPromptView.h"


#define screenHeight [UIScreen mainScreen].bounds.size.height
#define screenWidth [UIScreen mainScreen].bounds.size.width

#define slidingPromptViewHeight 91
#define slidingPromptViewWidth 165

#define flagImageViewTag    200
#define indicatorViewTag    201
#define prompteViewTag      202

@interface SlidingPromptView()

@property(nonatomic,assign)BOOL loadingType;
@property(nonatomic,retain,readonly)NSTimer* fadeOutTimer;
@property(nonatomic,assign)id<SlidingPromptViewDelegate> delegate;

@end


@implementation SlidingPromptView
@synthesize loadingType;
@synthesize fadeOutTimer;
@synthesize delegate;


+ (SlidingPromptView*)sharedView {
    static dispatch_once_t once;
    static SlidingPromptView *sharedView;
    dispatch_once(&once, ^ { sharedView = [[SlidingPromptView alloc] initWithFrame:CGRectMake(screenWidth, (screenHeight-slidingPromptViewHeight)/2.0,slidingPromptViewWidth,slidingPromptViewHeight)];
        [[[UIApplication sharedApplication] keyWindow] addSubview:sharedView];

    });
    return sharedView;
}

+(void)setDismissCompleteDelegate:(id<SlidingPromptViewDelegate>)dd{
    [SlidingPromptView sharedView].delegate = dd;
}

- (void)setFadeOutTimer:(NSTimer *)newTimer {
    if(fadeOutTimer){
        //[fadeOutTimer invalidate];//因爲不是一個重複性的NSTimer所以不需要invalidate
        fadeOutTimer = nil;
    }

    if(newTimer)
        fadeOutTimer = newTimer;
}

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.7]];
        [self setClipsToBounds:YES];
    }
    return self;
}

#pragma mark - Show Methods
+(void)showLoadingStatus:(NSString*)status{
    [[SlidingPromptView sharedView] setLoadingType:YES];
    [[SlidingPromptView sharedView] showStatus:status withFlagImage:nil isLoading:YES];
}

+(void)showStatus:(NSString*)status withFlagImage:(NSString*)flagImage{
    [[SlidingPromptView sharedView] setLoadingType:NO];
    [[SlidingPromptView sharedView] showStatus:status withFlagImage:flagImage isLoading:NO];
}

+(void)showLoadingStatus:(NSString*)status duration:(NSTimeInterval)seconds{
    [[SlidingPromptView sharedView] setLoadingType:YES];
    [[SlidingPromptView sharedView] showStatus:status withFlagImage:nil isLoading:YES];
    [[SlidingPromptView sharedView] dismiss:seconds];

}

+(void)showStatus:(NSString*)status withFlagImage:(NSString*)flagImage duration:(NSTimeInterval)seconds{
    [[SlidingPromptView sharedView] setLoadingType:NO];
    [[SlidingPromptView sharedView] showStatus:status withFlagImage:flagImage isLoading:NO];
    [[SlidingPromptView sharedView] dismiss:seconds];
}

#pragma mark - Dismiss Methods
+(void)dismiss{
    [[SlidingPromptView sharedView] dismiss];
}

+(void)dismiss:(NSString*)status withFlagImage:(NSString*)flagImage duration:(NSTimeInterval)seconds{
    [[SlidingPromptView sharedView] setStatus:status withFlagImage:flagImage isLoading:NO isShow:NO];
    [[SlidingPromptView sharedView] dismiss:seconds];
}

+(void)dismiss:(NSString*)status duration:(NSTimeInterval)seconds{
    [[SlidingPromptView sharedView] setStatus:status withFlagImage:nil isLoading:NO isShow:NO];
    [[SlidingPromptView sharedView] dismiss:seconds];
}


#pragma mark - Set Status Methods
+(void)setStatus:(NSString*)status{
    [[SlidingPromptView sharedView] setStatus:status];
}

+(void)setStatus:(NSString*)status withFlagImage:(NSString*)flagImage{
    [[SlidingPromptView sharedView] setStatus:status withFlagImage:flagImage isLoading:NO isShow:NO];
}


#pragma mark - Private Methods
-(void)setStatus:(NSString*)status{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIImageView* flag = (UIImageView*)[self viewWithTag:flagImageViewTag];
        UILabel* prompt =(UILabel*)[self viewWithTag:prompteViewTag];
        UIActivityIndicatorView* indicatorView = (UIActivityIndicatorView*)[self viewWithTag:indicatorViewTag];

        BOOL type = [[SlidingPromptView sharedView] loadingType];
        if (type) {
            flag.hidden = YES;
            indicatorView.hidden = NO;
            UIFont* font = prompt.font;

            NSDictionary *dictionaryAttributes = @{NSFontAttributeName:font,};
            CGRect stringRect = [status boundingRectWithSize:CGSizeMake(self.frame.size.width-40-5,slidingPromptViewHeight) options:NSStringDrawingUsesLineFragmentOrigin  attributes:dictionaryAttributes context:nil];

            [prompt setFrame:CGRectMake(40, (self.frame.size.height-stringRect.size.height)/2.0, stringRect.size.width, stringRect.size.height)];
            [prompt setText:status];
        }else{
            flag.hidden = NO;
            indicatorView.hidden = YES;
            UIImage* image = flag.image;
            UIFont* font = prompt.font;

            NSDictionary *dictionaryAttributes = @{NSFontAttributeName:font,};
            CGRect stringRect = [status boundingRectWithSize:CGSizeMake(self.frame.size.width-12*2-image.size.width-5, slidingPromptViewHeight) options:NSStringDrawingUsesLineFragmentOrigin  attributes:dictionaryAttributes context:nil];

            [prompt setText:status];
            [prompt setFrame:CGRectMake(12*2+image.size.width, (self.frame.size.height-stringRect.size.height)/2.0, stringRect.size.width, stringRect.size.height)];
        }
    });
}

-(void)setStatus:(NSString*)status withFlagImage:(NSString*)flagImage isLoading:(BOOL)loading isShow:(BOOL)show{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIImageView* flag = (UIImageView*)[self viewWithTag:flagImageViewTag];
        UILabel* prompt =(UILabel*)[self viewWithTag:prompteViewTag];
        UIActivityIndicatorView* indicatorView = (UIActivityIndicatorView*)[self viewWithTag:indicatorViewTag];

        UIFont* font = prompt.font;
        [prompt setText:status];
        if (loading) {
            flag.hidden = YES;
            indicatorView.hidden = NO;
            CGPoint point = CGPointMake(20, self.frame.size.height/2.0);
            [indicatorView setCenter:point];
            [indicatorView startAnimating];

            NSDictionary *dictionaryAttributes = @{NSFontAttributeName:font,};
            CGRect stringRect = [status boundingRectWithSize:CGSizeMake(self.frame.size.width-40-5, slidingPromptViewHeight) options:NSStringDrawingUsesLineFragmentOrigin  attributes:dictionaryAttributes context:nil];

            [prompt setFrame:CGRectMake(40, (self.frame.size.height-stringRect.size.height)/2.0, stringRect.size.width, stringRect.size.height)];
        }else{
            flag.hidden = NO;
            indicatorView.hidden = YES;
            UIImage* image = [UIImage imageNamed:flagImage];
            [flag setImage:[UIImage imageNamed:flagImage]];
            [flag setFrame:CGRectMake(12, (self.frame.size.height-image.size.height)/2.0, image.size.width, image.size.height)];

            NSDictionary *dictionaryAttributes = @{NSFontAttributeName:font,};
            CGRect stringRect = [status boundingRectWithSize:CGSizeMake(self.frame.size.width-12*2-image.size.width-5, slidingPromptViewHeight) options:NSStringDrawingUsesLineFragmentOrigin  attributes:dictionaryAttributes context:nil];

            [prompt setFrame:CGRectMake(12*2+image.size.width, (self.frame.size.height-stringRect.size.height)/2.0, stringRect.size.width, stringRect.size.height)];
        }

        if (show) {
            [UIView animateWithDuration:0.3 animations:^{
                self.frame = CGRectMake(screenWidth-self.frame.size.width,(screenHeight-self.frame.size.height)/2.0,self.frame.size.width,self.frame.size.height);
            } completion:^(BOOL finished) {
            }];
        }else{
            self.frame = CGRectMake(screenWidth-self.frame.size.width,(screenHeight-self.frame.size.height)/2.0,self.frame.size.width,self.frame.size.height);
        }
    });
}

-(void)showStatus:(NSString*)status withFlagImage:(NSString*)flagImage isLoading:(BOOL)loading{
    //[[[UIApplication sharedApplication] keyWindow] setUserInteractionEnabled:NO];
    [self layoutContentView];
    [self setStatus:status withFlagImage:flagImage isLoading:loading isShow:YES];
}

-(void)dismiss:(NSTimeInterval)seconds{
    self.fadeOutTimer = [NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(dismiss) userInfo:nil repeats:NO];
}

-(void)dismiss{
    //[[[UIApplication sharedApplication] keyWindow] setUserInteractionEnabled:YES];
    [UIView animateWithDuration:0.3 animations:^{
        self.frame = CGRectMake(screenWidth, (screenHeight-self.frame.size.height)/2.0,self.frame.size.width,self.frame.size.height);
    } completion:^(BOOL finished) {
        UIImageView* flag = (UIImageView*)[self viewWithTag:flagImageViewTag];
        UILabel* prompt =(UILabel*)[self viewWithTag:prompteViewTag];
        UIActivityIndicatorView* indicatorView = (UIActivityIndicatorView*)[self viewWithTag:indicatorViewTag];

        [flag setImage:nil];
        [prompt setText:nil];
        [indicatorView stopAnimating];

        [flag removeFromSuperview];
        [prompt removeFromSuperview];
        [indicatorView removeFromSuperview];

        if (self.delegate && [self.delegate respondsToSelector:@selector(dismissComplete)]) {
            [self.delegate dismissComplete];
            self.delegate = nil;
        }
    }];
}

-(void)layoutContentView{
    UIImageView* flag = [[UIImageView alloc] initWithFrame:CGRectZero];
    flag.tag = flagImageViewTag;
    flag.hidden = YES;
    [self addSubview:flag];
    [flag release];

    UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    indicatorView.tag = indicatorViewTag;
    indicatorView.hidden = YES;
    [self addSubview:indicatorView];
    [indicatorView release];

    UILabel* prompt = [[UILabel alloc] initWithFrame:CGRectZero];
    [prompt setBackgroundColor:[UIColor clearColor]];
    [prompt setTextColor:[UIColor whiteColor]];
    UIFont* font = [UIFont systemFontOfSize:16];
    [prompt setFont:font];
    [prompt setNumberOfLines:0];
    [prompt setLineBreakMode:NSLineBreakByWordWrapping];
    [prompt setTag:prompteViewTag];
    [self addSubview:prompt];
    [prompt release];
}

@end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章