這個控件是三年前我在亞信集團工作的時候開發,今天趴出來,順便修改一下支持最新的版本的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