你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發系列之常用自定義控件開發集—自定義狀態欄消息提示控件開發

iOS開發系列之常用自定義控件開發集—自定義狀態欄消息提示控件開發

編輯:IOS開發綜合

在實際開發中消息提示時很常見的需求,為了個性化和擁有簡潔的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

運行效果如圖

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved