一般人会说,就是用那个MBProgressHUD不就行了吗?
的确是,MBProgressHUD能为我们做了好多loading指示器,但是toast不一样,它是在屏幕某个地方出现一行小提示,例如网络状态,出现的时候不会妨碍用户其他点击操作,只是MBProgressHUD它本身设计出发点并不如此,所以我介绍一个比较独特的开源文件。
先看头文件
#import <Foundation/Foundation.h>#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*)infobgColor:(CGColorRef)colorinView:(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 *)infobgColor:(CGColorRef)colorinView:(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环境下使用