iOS下的类似Android的toast提示
一般人会说,就是用那个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*)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环境下使用