html5中文学习网

您的位置: 首页 > ios » 正文

iOS开发:自定义状态栏代码详解_IOS开发

[ ] 已经帮助:人解决问题

   公司的开发的项目要求在状态栏上边加入程序下载的进度条,之前写的程序,由于是根据ipad的朝向来设置自定义的状态栏的frame,以及子视图的 frame和transform,出现一些不太容易解决的bug。这两天正好项目不太紧,就好好学习一下这方面的知识,以下是我所总结的一点经验:k22HTML5中文学习网 - HTML5先行者学习网

  这里说明一下,Apple没有开放的状态栏的API,在ios 的官方文档没有提到修改Window Level的方式;k22HTML5中文学习网 - HTML5先行者学习网

  先看一下Window Level的可用的值包括:k22HTML5中文学习网 - HTML5先行者学习网

  1: typedef CGFloat UIWindowLevel;k22HTML5中文学习网 - HTML5先行者学习网

  2: const UIWindowLevel UIWindowLevelNormal; // 0.0k22HTML5中文学习网 - HTML5先行者学习网

  3: const UIWindowLevel UIWindowLevelAlert; // 2000.0k22HTML5中文学习网 - HTML5先行者学习网

  4: const UIWindowLevel UIWindowLevelStatusBar; // 1000.0k22HTML5中文学习网 - HTML5先行者学习网

  默认我们的UIView layer都是在UIWindowLevelNormal上,这也就是为什么系统弹出来的对话框在我们的视图之上,因为它的Window Level级别更高。k22HTML5中文学习网 - HTML5先行者学习网

  根据WindowLevel的原理我们也就知道,如果想在系统的状态栏上,添加自定义的状态栏,就需要比UIWindowLevelStatusBar的级别更高,接下来,用代码说明一下:k22HTML5中文学习网 - HTML5先行者学习网

  首先,先建一个Single View Application,名字自定义就可以了,k22HTML5中文学习网 - HTML5先行者学习网

  然后,新建一个类命名为: StatusBarOverlay 继承自UIWindow类,代码:k22HTML5中文学习网 - HTML5先行者学习网

  StatusBarOverlay.h文件k22HTML5中文学习网 - HTML5先行者学习网

  1: #importk22HTML5中文学习网 - HTML5先行者学习网

  2:k22HTML5中文学习网 - HTML5先行者学习网

  3: @interface StatusBarOverlay : UIWindow{k22HTML5中文学习网 - HTML5先行者学习网

  4: UIView *contentView;k22HTML5中文学习网 - HTML5先行者学习网

  5: UILabel *textLabel;k22HTML5中文学习网 - HTML5先行者学习网

  6: }k22HTML5中文学习网 - HTML5先行者学习网

  7:k22HTML5中文学习网 - HTML5先行者学习网

  8: @property (nonatomic, retain) UIView *contentView;k22HTML5中文学习网 - HTML5先行者学习网

  9:k22HTML5中文学习网 - HTML5先行者学习网

  10: @property (nonatomic, retain) UILabel *textLabel;k22HTML5中文学习网 - HTML5先行者学习网

  11:k22HTML5中文学习网 - HTML5先行者学习网

  12: @endk22HTML5中文学习网 - HTML5先行者学习网

  StatusBarOverlay.m文件k22HTML5中文学习网 - HTML5先行者学习网

  1: //k22HTML5中文学习网 - HTML5先行者学习网

  2: // StatusBarOverlay.mk22HTML5中文学习网 - HTML5先行者学习网

  3: // StatusBarDemok22HTML5中文学习网 - HTML5先行者学习网

  4: //k22HTML5中文学习网 - HTML5先行者学习网

  5: // Created by jordy wang on 12-8-7.k22HTML5中文学习网 - HTML5先行者学习网

  6: // Copyright (c) 2012年 __MyCompanyName__. All rights reserved.k22HTML5中文学习网 - HTML5先行者学习网

  7: //k22HTML5中文学习网 - HTML5先行者学习网

  8:k22HTML5中文学习网 - HTML5先行者学习网

  9: #import "StatusBarOverlay.h"k22HTML5中文学习网 - HTML5先行者学习网

  10:k22HTML5中文学习网 - HTML5先行者学习网

  11: #define STATUS_BAR_ORIENTATION [UIApplication sharedApplication].statusBarOrientationk22HTML5中文学习网 - HTML5先行者学习网

  12: #define ROTATION_ANIMATION_DURATION [UIApplication sharedApplication].statusBarOrientationAnimationDurationk22HTML5中文学习网 - HTML5先行者学习网

  13:k22HTML5中文学习网 - HTML5先行者学习网

  14:k22HTML5中文学习网 - HTML5先行者学习网

  15: @interface StatusBarOverlay()k22HTML5中文学习网 - HTML5先行者学习网

  16:k22HTML5中文学习网 - HTML5先行者学习网

  17: - (void)initializeToDefaultState;k22HTML5中文学习网 - HTML5先行者学习网

  18: - (void)rotateStatusBarWithFrame:(NSValue *)frameValue;k22HTML5中文学习网 - HTML5先行者学习网

  19: - (void)setSubViewHFrame;k22HTML5中文学习网 - HTML5先行者学习网

  20: - (void)setSubViewVFrame;k22HTML5中文学习网 - HTML5先行者学习网

  21: @endk22HTML5中文学习网 - HTML5先行者学习网

  22:k22HTML5中文学习网 - HTML5先行者学习网

  23:k22HTML5中文学习网 - HTML5先行者学习网

  24: @implementation StatusBarOverlayk22HTML5中文学习网 - HTML5先行者学习网

  25: @synthesize contentView;k22HTML5中文学习网 - HTML5先行者学习网

  26: @synthesize textLabel;k22HTML5中文学习网 - HTML5先行者学习网

  27:k22HTML5中文学习网 - HTML5先行者学习网

  28: //重写init方法k22HTML5中文学习网 - HTML5先行者学习网

  29: - (id)initk22HTML5中文学习网 - HTML5先行者学习网

  30: {k22HTML5中文学习网 - HTML5先行者学习网

  31: self = [super initWithFrame:CGRectZero];k22HTML5中文学习网 - HTML5先行者学习网

  32: if (self) {k22HTML5中文学习网 - HTML5先行者学习网

  33: self.windowLevel = UIWindowLevelStatusBar + 1;k22HTML5中文学习网 - HTML5先行者学习网

  34: self.frame = [UIApplication sharedApplication].statusBarFrame;k22HTML5中文学习网 - HTML5先行者学习网

  35: [self setBackgroundColor:[UIColor orangeColor]];k22HTML5中文学习网 - HTML5先行者学习网

  36: [self setHidden:NO];k22HTML5中文学习网 - HTML5先行者学习网

  37:k22HTML5中文学习网 - HTML5先行者学习网

  38: //内容视图k22HTML5中文学习网 - HTML5先行者学习网

  39: UIView *_contentView = [[UIView alloc] initWithFrame:self.bounds];k22HTML5中文学习网 - HTML5先行者学习网

  40: self.contentView = _contentView;k22HTML5中文学习网 - HTML5先行者学习网

  41: [self.contentView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];k22HTML5中文学习网 - HTML5先行者学习网

  42: [self.contentView setBackgroundColor:[UIColor cyanColor]];k22HTML5中文学习网 - HTML5先行者学习网

  43: [self addSubview:self.contentView];k22HTML5中文学习网 - HTML5先行者学习网

  44: [_contentView release];k22HTML5中文学习网 - HTML5先行者学习网

  45:k22HTML5中文学习网 - HTML5先行者学习网

  46:k22HTML5中文学习网 - HTML5先行者学习网

  47: //添加textLabelk22HTML5中文学习网 - HTML5先行者学习网

  48: UILabel *_textLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 0, CGRectGetWidth(self.frame)-60, CGRectGetHeight(self.frame))];k22HTML5中文学习网 - HTML5先行者学习网

  49: self.textLabel = _textLabel;k22HTML5中文学习网 - HTML5先行者学习网

  50: [self.textLabel setBackgroundColor:[UIColor blueColor]];k22HTML5中文学习网 - HTML5先行者学习网

  51: [self.textLabel setFont:[UIFont systemFontOfSize:12]];k22HTML5中文学习网 - HTML5先行者学习网

  52: [self.textLabel setTextAlignment:UITextAlignmentCenter];k22HTML5中文学习网 - HTML5先行者学习网

  53: [self.textLabel setTextColor:[UIColor blackColor]];k22HTML5中文学习网 - HTML5先行者学习网

  54: [self.textLabel setText:@"自定义的状态栏 author by jordy"];k22HTML5中文学习网 - HTML5先行者学习网

  55: [self.contentView addSubview:self.textLabel];k22HTML5中文学习网 - HTML5先行者学习网

  56: [_textLabel release];k22HTML5中文学习网 - HTML5先行者学习网

  57:k22HTML5中文学习网 - HTML5先行者学习网

  58: //注册监听---当屏幕将要转动时,所出发的事件(用于操作本视图改变其frame)k22HTML5中文学习网 - HTML5先行者学习网

  59: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willRotateScreenEvent:)k22HTML5中文学习网 - HTML5先行者学习网

  name:UIApplicationWillChangeStatusBarFrameNotification object:nil];k22HTML5中文学习网 - HTML5先行者学习网

  60: //初始化k22HTML5中文学习网 - HTML5先行者学习网

  61: [self initializeToDefaultState];k22HTML5中文学习网 - HTML5先行者学习网

  62: }k22HTML5中文学习网 - HTML5先行者学习网

  63:k22HTML5中文学习网 - HTML5先行者学习网

  64: return self;k22HTML5中文学习网 - HTML5先行者学习网

  65: }k22HTML5中文学习网 - HTML5先行者学习网

  66:k22HTML5中文学习网 - HTML5先行者学习网

  67:k22HTML5中文学习网 - HTML5先行者学习网

  68:k22HTML5中文学习网 - HTML5先行者学习网

  69:k22HTML5中文学习网 - HTML5先行者学习网

  70: //初始化为默认状态k22HTML5中文学习网 - HTML5先行者学习网

  71: - (void)initializeToDefaultStatek22HTML5中文学习网 - HTML5先行者学习网

  72: {k22HTML5中文学习网 - HTML5先行者学习网

  73: //获取当前的状态栏位置k22HTML5中文学习网 - HTML5先行者学习网

  74: CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;k22HTML5中文学习网 - HTML5先行者学习网

  75: //设置当前视图的旋转, 根据当前设备的朝向k22HTML5中文学习网 - HTML5先行者学习网

  76: [self rotateStatusBarWithFrame:[NSValue valueWithCGRect:statusBarFrame]];k22HTML5中文学习网 - HTML5先行者学习网

  77:k22HTML5中文学习网 - HTML5先行者学习网

  78:k22HTML5中文学习网 - HTML5先行者学习网

  79:k22HTML5中文学习网 - HTML5先行者学习网

  80: }k22HTML5中文学习网 - HTML5先行者学习网

  81:k22HTML5中文学习网 - HTML5先行者学习网

  82:k22HTML5中文学习网 - HTML5先行者学习网

  83: //旋转屏幕k22HTML5中文学习网 - HTML5先行者学习网

  84: - (void)rotateStatusBarWithFrame:(NSValue *)frameValuek22HTML5中文学习网 - HTML5先行者学习网

  85: {k22HTML5中文学习网 - HTML5先行者学习网

  86: CGRect frame = [frameValue CGRectValue];k22HTML5中文学习网 - HTML5先行者学习网

  87: UIInterfaceOrientation orientation = STATUS_BAR_ORIENTATION;k22HTML5中文学习网 - HTML5先行者学习网

  88:k22HTML5中文学习网 - HTML5先行者学习网

  89: if (orientation == UIDeviceOrientationPortrait) {k22HTML5中文学习网 - HTML5先行者学习网

  90: self.transform = CGAffineTransformIdentity; //屏幕不旋转k22HTML5中文学习网 - HTML5先行者学习网

  91: [self setSubViewVFrame];k22HTML5中文学习网 - HTML5先行者学习网

  92: }else if (orientation == UIDeviceOrientationPortraitUpsideDown) {k22HTML5中文学习网 - HTML5先行者学习网

  93: self.transform = CGAffineTransformMakeRotation(M_PI); //屏幕旋转180度k22HTML5中文学习网 - HTML5先行者学习网

  94: [self setSubViewVFrame];k22HTML5中文学习网 - HTML5先行者学习网

  95: }else if (orientation == UIDeviceOrientationLandscapeRight) {k22HTML5中文学习网 - HTML5先行者学习网

  96: self.transform = CGAffineTransformMakeRotation((M_PI * (-90.0f) / 180.0f)); //屏幕旋转-90度k22HTML5中文学习网 - HTML5先行者学习网

  97: [self setSubViewHFrame];k22HTML5中文学习网 - HTML5先行者学习网

  98: }else if (orientation == UIDeviceOrientationLandscapeLeft){k22HTML5中文学习网 - HTML5先行者学习网

  99: self.transform = CGAffineTransformMakeRotation(M_PI * 90.0f / 180.0f); //屏幕旋转90度k22HTML5中文学习网 - HTML5先行者学习网

  100: [self setSubViewHFrame];k22HTML5中文学习网 - HTML5先行者学习网

  101: }k22HTML5中文学习网 - HTML5先行者学习网

  102:k22HTML5中文学习网 - HTML5先行者学习网

  103: self.frame = frame;k22HTML5中文学习网 - HTML5先行者学习网

  104: [self.contentView setFrame:self.bounds];k22HTML5中文学习网 - HTML5先行者学习网

  105: }k22HTML5中文学习网 - HTML5先行者学习网

  106:k22HTML5中文学习网 - HTML5先行者学习网

  107: //设置横屏的子视图的framek22HTML5中文学习网 - HTML5先行者学习网

  108: - (void)setSubViewHFramek22HTML5中文学习网 - HTML5先行者学习网

  109: {k22HTML5中文学习网 - HTML5先行者学习网

  110: self.textLabel.frame = CGRectMake(30, 0, 1024-60, 20);k22HTML5中文学习网 - HTML5先行者学习网

  111: }k22HTML5中文学习网 - HTML5先行者学习网

  112: //设置竖屏的子视图的framek22HTML5中文学习网 - HTML5先行者学习网

  113: - (void)setSubViewVFramek22HTML5中文学习网 - HTML5先行者学习网

  114: {k22HTML5中文学习网 - HTML5先行者学习网

  115: self.textLabel.frame = CGRectMake(30, 0, 748-60, 20);k22HTML5中文学习网 - HTML5先行者学习网

  116: }k22HTML5中文学习网 - HTML5先行者学习网

  117:k22HTML5中文学习网 - HTML5先行者学习网

  118: #pragma mark -k22HTML5中文学习网 - HTML5先行者学习网

  119: #pragma mark 响应屏幕即将旋转时的事件响应k22HTML5中文学习网 - HTML5先行者学习网

  120: - (void)willRotateScreenEvent:(NSNotification *)notificationk22HTML5中文学习网 - HTML5先行者学习网

  121: {k22HTML5中文学习网 - HTML5先行者学习网

  122: NSValue *frameValue = [notification.userInfo valueForKey:UIApplicationStatusBarFrameUserInfoKey];k22HTML5中文学习网 - HTML5先行者学习网

  123: [self rotateStatusBarAnimatedWithFrame:frameValue];k22HTML5中文学习网 - HTML5先行者学习网

  124: }k22HTML5中文学习网 - HTML5先行者学习网

  125:k22HTML5中文学习网 - HTML5先行者学习网

  126: - (void)rotateStatusBarAnimatedWithFrame:(NSValue *)frameValue {k22HTML5中文学习网 - HTML5先行者学习网

  127: [UIView animateWithDuration:ROTATION_ANIMATION_DURATION animations:^{k22HTML5中文学习网 - HTML5先行者学习网

  128: self.alpha = 0;k22HTML5中文学习网 - HTML5先行者学习网

  129: } completion:^(BOOL finished) {k22HTML5中文学习网 - HTML5先行者学习网

  130: [self rotateStatusBarWithFrame:frameValue];k22HTML5中文学习网 - HTML5先行者学习网

  131: [UIView animateWithDuration:ROTATION_ANIMATION_DURATION animations:^{k22HTML5中文学习网 - HTML5先行者学习网

  132: self.alpha = 1;k22HTML5中文学习网 - HTML5先行者学习网

  133: }];k22HTML5中文学习网 - HTML5先行者学习网

  134: }];k22HTML5中文学习网 - HTML5先行者学习网

  135: }k22HTML5中文学习网 - HTML5先行者学习网

  136:k22HTML5中文学习网 - HTML5先行者学习网

  137: - (void)deallock22HTML5中文学习网 - HTML5先行者学习网

  138: {k22HTML5中文学习网 - HTML5先行者学习网

  139: [[NSNotificationCenter defaultCenter] removeObserver:self];k22HTML5中文学习网 - HTML5先行者学习网

  140: [textLabel release];k22HTML5中文学习网 - HTML5先行者学习网

  141: textLabel = nil;k22HTML5中文学习网 - HTML5先行者学习网

  142:k22HTML5中文学习网 - HTML5先行者学习网

  143: [contentView release];k22HTML5中文学习网 - HTML5先行者学习网

  144: contentView = nil;k22HTML5中文学习网 - HTML5先行者学习网

  145:k22HTML5中文学习网 - HTML5先行者学习网

  146: [super dealloc];k22HTML5中文学习网 - HTML5先行者学习网

  147: }k22HTML5中文学习网 - HTML5先行者学习网

  148:k22HTML5中文学习网 - HTML5先行者学习网

  149: @endk22HTML5中文学习网 - HTML5先行者学习网

  由于代码比较简单,并且我在上述代码里有相应的注释,这里需要说明一点的是,默认我们继承自UIWindow的StatusBarOverlay类是hidden状态,需要在初始化的时候设置它的hidden属性为NO,k22HTML5中文学习网 - HTML5先行者学习网

  在屏幕旋转过程中,自定义的状态栏与UIViewController之间的旋转是分离的,所以我们需要做一个隐藏的动画,在旋转过程前先隐藏自定义的状态栏,旋转结果后设置显示状态。k22HTML5中文学习网 - HTML5先行者学习网

  如果需要做一种动画,比方从底部下移显示一条信息,隔N秒后又自动收回的动画,直接设置自定义的视图的y坐标就可以了,默认y坐标设置是0。k22HTML5中文学习网 - HTML5先行者学习网

  最后, 使用它的方式也比较简单,只需要初始化,代码:k22HTML5中文学习网 - HTML5先行者学习网

  StatusBarOverlay *statusBarOverlay = [[StatusBarOverlay alloc] init];k22HTML5中文学习网 - HTML5先行者学习网

  由于我公司的需求是开机自动下载的功能,所以我在初始化的时候,是放在了AppDelegate中。k22HTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助