在實際開發中消息提示時很常見的需求,為了個性化和擁有簡潔的UI狀態欄提示是比較好的方案,好處很多如:不遮擋主UI,新意,下面貼出實現代碼。
WHC_StatusBarMessage.h頭文件如下:
//
// WHCStatusBarMessage.m
// WHCStatusBarMessage
//
// Created by apple on 14-3-28.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import "WHC_StatusBarMessage.h"
#define kPading (5.0) //邊距
#define kLogoWidth (15.0) //圖標logo寬度
@interface WHC_StatusBarMessage(){
UILabel * msgLab; //消息標簽
UIImageView * logoImgV; //logo圖標對象
UIImage * logoImg; //logo圖標
CGFloat height; //高度
CGFloat screenWidth; //屏幕寬度
CGFloat screenHeight; //屏幕高度
}
@property(nonatomic,retain)UILabel * statusLab;
@property(nonatomic,retain)UIImageView * logImgView;
@property(nonatomic,retain)NSTimer * runTimer; //停留時鐘
@end
@implementation WHC_StatusBarMessage
static WHC_StatusBarMessage * msb;
//構建單例
+(WHC_StatusBarMessage *)shareStatusBar{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
msb = [[WHC_StatusBarMessage alloc]init];
});
return msb;
}
//初始化UI
-(id)init
{
CGRect statusFrame = [UIApplication sharedApplication].statusBarFrame;
height = statusFrame.size.height;
screenWidth = [UIScreen mainScreen].bounds.size.width;
screenHeight = [UIScreen mainScreen].bounds.size.height;
self = [super initWithFrame:statusFrame];
if(self){
self.frame = statusFrame;
self.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.windowLevel = UIWindowLevelStatusBar + 1.0;
self.backgroundColor = kWHC_StatusBarMessageBack_Color;
logoImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"29x29" ofType:@"png"]];
logoImgV = [[UIImageView alloc]initWithFrame:CGRectMake(kPading, kPading / 2.0, kLogoWidth, kLogoWidth)];
logoImgV.backgroundColor = [UIColor clearColor];
[self addSubview:logoImgV];
msgLab = [[UILabel alloc]initWithFrame:CGRectMake(logoImgV.frame.origin.x + kPading + logoImgV.frame.size.width, 0.0, screenWidth - (logoImgV.frame.origin.x + kPading + logoImgV.frame.size.width), statusFrame.size.height)];
msgLab.backgroundColor = [UIColor clearColor];
msgLab.font = [UIFont systemFontOfSize:14.0];
msgLab.textColor = [UIColor whiteColor];
[self addSubview:msgLab];
//注冊單擊事件
UITapGestureRecognizer * tapStatusBar = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapTopBar:)];
[self addGestureRecognizer:tapStatusBar];
//注冊狀態欄方向監聽事件
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenOrientationChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
}
return self;
}
//處理單擊狀態欄消息
- (void)tapTopBar:(UITapGestureRecognizer *)tapGesture{
if(_whcStatusBardelegate && [_whcStatusBardelegate respondsToSelector:@selector(didTapTouchWHCStatusBarMessageDoSomething)]){
[_whcStatusBardelegate didTapTouchWHCStatusBarMessageDoSomething];
}
}
//顯示狀態欄消息
-(void)showTextMessage:(NSString*)strMessage delayTime:(NSInteger)delay
{
[self.runTimer invalidate];
self.runTimer = nil;
if(logoImg == nil){
logoImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"29x29" ofType:@"png"]];
}
if(delay == -1) delay = 3;
logoImgV.image = logoImg;
msgLab.text = strMessage;
__block CGRect stateFrame = self.frame;
stateFrame.origin.y = -20.0;
self.frame = stateFrame;
[UIView animateWithDuration:0.2 animations:^{
stateFrame.origin.y = 0.0;
self.frame = stateFrame;
}];
[self makeKeyAndVisible];
self.runTimer = [NSTimer scheduledTimerWithTimeInterval:delay target:self selector:@selector(dismissTimer) userInfo:nil repeats:NO];
}
-(void)showMessage:(NSString*)strMessage logImage:(UIImage *)logImage delayTime:(NSInteger)delay{
logoImg = logImage;
[self showTextMessage:strMessage delayTime:delay];
}
-(void)dismissTimer{
double delayInSeconds = 0.3;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
msb.hidden = YES;
});
}
#pragma mark - screenChange
-(void)screenOrientationChange:(NSNotification*)notif
{
UIInterfaceOrientation orientation = [[[notif userInfo] objectForKey:UIApplicationStatusBarOrientationUserInfoKey] integerValue];
switch (orientation) {
case UIInterfaceOrientationPortrait:
self.transform = CGAffineTransformIdentity;
self.frame = CGRectMake(0.0, 0.0, screenWidth, height);
break;
case UIInterfaceOrientationPortraitUpsideDown:
self.transform = CGAffineTransformMakeRotation(M_PI);
self.center = CGPointMake(screenWidth / 2.0, screenHeight - height / 2.0);
self.bounds = CGRectMake(0.0, 0.0, screenWidth, height);
break;
case UIInterfaceOrientationLandscapeLeft:
self.transform = CGAffineTransformMakeRotation(-M_PI_2);
self.center = CGPointMake(height / 2.0, screenHeight / 2.0);
self.bounds = CGRectMake(0.0, 0.0, screenHeight, height);
break;
case UIInterfaceOrientationLandscapeRight:
self.transform = CGAffineTransformMakeRotation(M_PI_2);
self.center = CGPointMake(screenWidth - height / 2.0, screenHeight / 2.0);
self.bounds = CGRectMake(0.0, 0.0, screenHeight, height);
break;
default:
break;
}
}
@end