ios疯狂详解之自定义状态栏代码解析
来源: 阅读:695 次 日期:2015-01-26 15:21:09
温馨提示: 小编为您整理了“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:rotation_animation_duration animations:^{

128: self.alpha = 0;

129: } completion:^(bool finished) {

130: [self rotatestatusbarwithframe:framevalue];

131: [uiview animatewithduration:rotation_animation_duration animations:^{

132: self.alpha = 1;

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中。

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map