一般人会说,就是用那个MBProgressHUD不就行了吗?
的确是,MBProgressHUD能为我们做了好多loading指示器,但是toast不一样,它是在屏幕某个地方出现一行小提示,例如网络状态,出现的时候不会妨碍用户其他点击操作,只是MBProgressHUD它本身设计出发点并不如此,所以我介绍一个比较独特的开源文件。
先看头文件
#import#define kSGInfoAlert_fontSize 14#define kSGInfoAlert_width 200#define kMax_ConstrainedSize CGSizeMake(250, 150)#define kViewTag 990@interface SGInfoAlert : UIView{ CGColorRef bgcolor_; NSString *info_; CGSize fontSize_;}// info为提示信息,frame为提示框大小,view是为消息框的superView(推荐Tabbarcontroller.view)// vertical 为垂直方向上出现的位置 从 取值 0 ~ 1。+ (SGInfoAlert *)showInfo:(NSString*)info bgColor:(CGColorRef)color inView:(UIView*)view vertical:(float)height;@end
再看.m文件
#import "SGInfoAlert.h"@implementation SGInfoAlert// 画出圆角矩形背景static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth,float ovalHeight){ float fw, fh; if (ovalWidth == 0 || ovalHeight == 0) { CGContextAddRect(context, rect); return; } CGContextSaveGState(context); CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); CGContextScaleCTM (context, ovalWidth, ovalHeight); fw = CGRectGetWidth (rect) / ovalWidth; fh = CGRectGetHeight (rect) / ovalHeight; CGContextMoveToPoint(context, fw, fh/2); CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); CGContextClosePath(context); CGContextRestoreGState(context); }- (id)initWithFrame:(CGRect)frame bgColor:(CGColorRef)color info:(NSString*)info{ CGRect viewR = CGRectMake(0, 0, frame.size.width*1.2, frame.size.height*1.2); self = [super initWithFrame:viewR]; if (self) { self.backgroundColor = [UIColor clearColor]; bgcolor_ = color; info_ = [[NSString alloc] initWithString:info]; fontSize_ = frame.size; } return self;}- (void)drawRect:(CGRect)rect{ CGContextRef context = UIGraphicsGetCurrentContext(); // 背景0.8透明度 CGContextSetAlpha(context, .8); addRoundedRectToPath(context, rect, 4.0f, 4.0f); CGContextSetFillColorWithColor(context, bgcolor_); CGContextFillPath(context); // 文字1.0透明度 CGContextSetAlpha(context, 1.0);// CGContextSetShadowWithColor(context, CGSizeMake(0, -1), 1, [[UIColor whiteColor] CGColor]); CGContextSetFillColorWithColor(context, [UIColor flatPurpleColor].CGColor); float x = (rect.size.width - fontSize_.width) / 2.0; float y = (rect.size.height - fontSize_.height) / 2.0; CGRect r = CGRectMake(x, y, fontSize_.width, fontSize_.height); [info_ drawInRect:r withFont:[UIFont systemFontOfSize:kSGInfoAlert_fontSize] lineBreakMode:UILineBreakModeTailTruncation];}//- (void)dealloc{// [info_ release];// [super dealloc];//}// 从上层视图移除并释放- (void)remove{ [self removeFromSuperview];}// 渐变消失- (void)fadeAway{ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.5f]; self.alpha = .0; [UIView commitAnimations]; [self performSelector:@selector(remove) withObject:nil afterDelay:1.5f];}+ (SGInfoAlert *)showInfo:(NSString *)info bgColor:(CGColorRef)color inView:(UIView *)view vertical:(float)height{ if ([view viewWithTag:kViewTag] != nil) { SGInfoAlert *alert = (SGInfoAlert *)[view viewWithTag:kViewTag]; [alert remove]; } height = height < 0 ? 0 : height > 1 ? 1 : height; CGSize size = [info sizeWithFont:[UIFont systemFontOfSize:kSGInfoAlert_fontSize] constrainedToSize:kMax_ConstrainedSize]; CGRect frame = CGRectMake(0, 0, size.width, size.height); SGInfoAlert *alert = [[SGInfoAlert alloc] initWithFrame:frame bgColor:color info:info]; alert.center = CGPointMake(view.center.x, view.frame.size.height*height); alert.alpha = 0; [view addSubview:alert]; alert.tag = kViewTag;// [alert release]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:.3f]; alert.alpha = 1.0; [UIView commitAnimations];// [alert performSelector:@selector(fadeAway) withObject:nil afterDelay:3.5]; return alert;}
我注销了一些地方,使得它可以在ARC环境下使用