您的位置:首页 > 移动开发 > IOS开发

共享一个右侧滑出的自动消失的提示框

2016-07-03 11:16 423 查看
这个控件是三年前我在亚信集团工作的时候开发,今天趴出来,顺便修改一下支持最新的版本的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息