为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ios疯狂详解之自定义状态栏代码解析

2017-11-22 8页 doc 25KB 22阅读

用户头像

is_471618

暂无简介

举报
ios疯狂详解之自定义状态栏代码解析ios疯狂详解之自定义状态栏代码解析 这里说明一下,apple没有开放的状态栏的api,在ios 的官方文档没有提到修改window level的方式; 先看一下window level的可用的值包括: 1: typedef cgfloat uiwindowlevel; 2: const uiwindowlevel uiwindowlevelnormal; // 0.0 3: const uiwindowlevel uiwindowlevelalert; // 2000.0 4: const uiwindowlevel...
ios疯狂详解之自定义状态栏代码解析
ios疯狂详解之自定义状态栏代码解析 这里说明一下,apple没有开放的状态栏的api,在ios 的官方文档没有提到修改window level的方式; 先看一下window level的可用的值包括: 1: typedef cgfloat uiwindowlevel; 2: const uiwindowlevel uiwindowlevelnormal; // 0.0 3: const uiwindowlevel uiwindowlevelalert; // 2000.0 4: const uiwindowlevel uiwindowlevelstatusbar; // 1000.0 默认我们的uiview layer都是在uiwindowlevelnormal上,这也就是为什么系统弹出来的对话 框在我们的视图之上,因为它的window level级别更高。 根据windowlevel的原理我们也就知道,如果想在系统的状态栏上,添加自定义的状态栏, 就需要比uiwindowlevelstatusbar的级别更高,接下来,用代码说明一下: 首先,先建一个single view application,名字自定义就可以了, 然后,新建一个类命名为: statusbaroverlay 继承自uiwindow类,代码: statusbaroverlay.h文件 1: #import 2: 3: @interface statusbaroverlay : uiwindow{ 4: uiview *contentview; 5: uilabel *textlabel; 6: } 7: 8: @property (nonatomic, retain) uiview *contentview; 9: 10: @property (nonatomic, retain) uilabel *textlabel; 11: 12: @end statusbaroverlay.m文件 1: // 2: // statusbaroverlay.m 3: // statusbardemo 4: // 5: // created by jordy wang on 12-8-7. 6: // copyright (c) 2012年 __mycompanyname__. all rights reserved. 7: // 8: 9: #import statusbaroverlay.h 10: 11: #define status_bar_orientation [uiapplication sharedapplication].statusbarorientation 12: #define rotation_animation_duration [uiapplication sharedapplication].statusbarorientationanimationduration 13: 14: 15: @interface statusbaroverlay() 16: 17: - (void)initializetodefaultstate; 18: - (void)rotatestatusbarwithframe:(nsvalue *)framevalue; 19: - (void)setsubviewhframe; 20: - (void)setsubviewvframe; 21: @end 22: 23: 24: @implementation statusbaroverlay 25: @synthesize contentview; 26: @synthesize textlabel; 27: 28: //重写init方法 29: - (id)init 30: { 31: self = [super initwithframe:cgrectzero]; 32: if (self) { 33: self.windowlevel = uiwindowlevelstatusbar + 1; 34: self.frame = [uiapplication sharedapplication].statusbarframe; 35: [self setbackgroundcolor:[uicolor orangecolor]]; 36: [self sethidden:no]; 37: 38: //内容视图 39: uiview *_contentview = [[uiview alloc] initwithframe:self.bounds]; 40: self.contentview = _contentview; 41: [self.contentview setautoresizingmask:uiviewautoresizingflexiblewidth]; 42: [self.contentview setbackgroundcolor:[uicolor cyancolor]]; 43: [self addsubview:self.contentview]; 44: [_contentview release]; 45: 46: 47: //添加textlabel 48: uilabel *_textlabel = [[uilabel alloc] initwithframe:cgrectmake(30, 0, cgrectgetwidth(self.frame)-60, cgrectgetheight(self.frame))]; 49: self.textlabel = _textlabel; 50: [self.textlabel setbackgroundcolor:[uicolor bluecolor]]; 51: [self.textlabel setfont:[uifont systemfontofsize:12]]; 52: [self.textlabel settextalignment:uitextalignmentcenter]; 53: [self.textlabel settextcolor:[uicolor blackcolor]]; 54: [self.textlabel settext:@自定义的状态栏 author by jordy]; 55: [self.contentview addsubview:self.textlabel]; 56: [_textlabel release]; 57: 58: //注册监听---当屏幕将要转动时,所出发的事件(用于操作本视图改变其frame) 59: [[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(willrotatescreenevent:) name:uiapplicationwillchangestatusbarframenotification object:nil]; 60: //初始化 61: [self initializetodefaultstate]; 62: } 63: 64: return self; 65: } 66: 67: 68: 69: 70: //初始化为默认状态 71: - (void)initializetodefaultstate 72: { 73: //获取当前的状态栏位置 74: cgrect statusbarframe = [uiapplication sharedapplication].statusbarframe; 75: //设置当前视图的旋转, 根据当前设备的朝向 76: [self rotatestatusbarwithframe:[nsvalue valuewithcgrect:statusbarframe]]; 77: 78: 79: 80: } 81: 82: 83: //旋转屏幕 84: - (void)rotatestatusbarwithframe:(nsvalue *)framevalue 85: { 86: cgrect frame = [framevalue cgrectvalue]; 87: uiinterfaceorientation orientation = status_bar_orientation; 88: 89: if (orientation == uideviceorientationportrait) { 90: self.transform = cgaffinetransformidentity; //屏幕不旋转 91: [self setsubviewvframe]; 92: }else if (orientation == uideviceorientationportraitupsidedown) { 93: self.transform = cgaffinetransformmakerotation(m_pi); //屏幕旋转180度 94: [self setsubviewvframe]; 95: }else if (orientation == uideviceorientationlandscaperight) { 96: self.transform = cgaffinetransformmakerotation((m_pi * (-90.0f) / 180.0f)); //屏幕旋转-90度 97: [self setsubviewhframe]; 98: }else if (orientation == uideviceorientationlandscapeleft){ 99: self.transform = cgaffinetransformmakerotation(m_pi * 90.0f / 180.0f); //屏幕旋转90度 100: [self setsubviewhframe]; 101: } 102: 103: self.frame = frame; 104: [self.contentview setframe:self.bounds]; 105: } 106: 107: //设置横屏的子视图的frame 108: - (void)setsubviewhframe 109: { 110: self.textlabel.frame = cgrectmake(30, 0, 1024-60, 20); 111: } 112: //设置竖屏的子视图的frame 113: - (void)setsubviewvframe 114: { 115: self.textlabel.frame = cgrectmake(30, 0, 748-60, 20); 116: } 117: 118: #pragma mark - 119: #pragma mark 响应屏幕即将旋转时的事件响应 120: - (void)willrotatescreenevent:(nsnotification *)notification 121: { 122: nsvalue *framevalue = [notification.userinfo valueforkey:uiapplicationstatusbarframeuserinfokey]; 123: [self rotatestatusbaranimatedwithframe:framevalue]; 124: } 125: 126: - (void)rotatestatusbaranimatedwithframe:(nsvalue *)framevalue { 127: [uiview animatewithduration:rota1; 133: }]; 134: }]; 135: } 136: 137: - (void)dealloc 138: { 139: [[nsnotificationcenter defaultcenter] removeobserver:self]; 140: [textlabel release]; 141: textlabel = nil; 142: 143: [contentview release]; 144: contentview = nil; 145: 146: [super dealloc]; 147: } 148: 149: @end 由于代码比较简单,并且我在上述代码里有相应的注释,这里需要说明一点的是,默认我们继承自uiwindow的statusbaroverlay类是hidden状态,需要在初始化的时候设置它的hidden属性为no, 在屏幕旋转过程中,自定义的状态栏与uiviewcontroller之间的旋转是分离的,所以我们需要做一个隐藏的动画,在旋转过程前先隐藏自定义的状态栏,旋转结果后设置显示状态。 如果需要做一种动画,比方从底部下移显示一条信息,隔n秒后又自动收回的动画,直接设置自定义的视图的y坐标就可以了,默认y坐标设置是0。 最后, 使用它的方式也比较简单,只需要初始化,代码: statusbaroverlay *statusbaroverlay = [[statusbaroverlay alloc] init]; 由于我公司的需求是开机自动下载的功能,所以我在初始化的时候,是放在了appdelegate中。
/
本文档为【ios疯狂详解之自定义状态栏代码解析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索