這里說明一下,apple沒有開放的狀態(tài)欄的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上,這也就是為什么系統(tǒng)彈出來的對話框在我們的視圖之上,因為它的window level級別更高。
根據(jù)windowlevel的原理我們也就知道,如果想在系統(tǒng)的狀態(tài)欄上,添加自定義的狀態(tài)欄,就需要比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: //內(nèi)容視圖
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:@自定義的狀態(tài)欄 author by jordy];
55: [self.contentview addsubview:self.textlabel];
56: [_textlabel release];
57:
58: //注冊監(jiān)聽---當(dāng)屏幕將要轉(zhuǎn)動時,所出發(fā)的事件(用于操作本視圖改變其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: //初始化為默認狀態(tài)
71: - (void)initializetodefaultstate
72: {
73: //獲取當(dāng)前的狀態(tài)欄位置
74: cgrect statusbarframe = [uiapplication sharedapplication].statusbarframe;
75: //設(shè)置當(dāng)前視圖的旋轉(zhuǎn), 根據(jù)當(dāng)前設(shè)備的朝向
76: [self rotatestatusbarwithframe:[nsvalue valuewithcgrect:statusbarframe]];
77:
78:
79:
80: }
81:
82:
83: //旋轉(zhuǎn)屏幕
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; //屏幕不旋轉(zhuǎn)
91: [self setsubviewvframe];
92: }else if (orientation == uideviceorientationportraitupsidedown) {
93: self.transform = cgaffinetransformmakerotation(m_pi); //屏幕旋轉(zhuǎn)180度
94: [self setsubviewvframe];
95: }else if (orientation == uideviceorientationlandscaperight) {
96: self.transform = cgaffinetransformmakerotation((m_pi * (-90.0f) / 180.0f)); //屏幕旋轉(zhuǎn)-90度
97: [self setsubviewhframe];
98: }else if (orientation == uideviceorientationlandscapeleft){
99: self.transform = cgaffinetransformmakerotation(m_pi * 90.0f / 180.0f); //屏幕旋轉(zhuǎn)90度
100: [self setsubviewhframe];
101: }
102:
103: self.frame = frame;
104: [self.contentview setframe:self.bounds];
105: }
106:
107: //設(shè)置橫屏的子視圖的frame
108: - (void)setsubviewhframe
109: {
110: self.textlabel.frame = cgrectmake(30, 0, 1024-60, 20);
111: }
112: //設(shè)置豎屏的子視圖的frame
113: - (void)setsubviewvframe
114: {
115: self.textlabel.frame = cgrectmake(30, 0, 748-60, 20);
116: }
117:
118: #pragma mark -
119: #pragma mark 響應(yīng)屏幕即將旋轉(zhuǎn)時的事件響應(yīng)
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
由于代碼比較簡單,并且我在上述代碼里有相應(yīng)的注釋,這里需要說明一點的是,默認我們繼承自uiwindow的statusbaroverlay類是hidden狀態(tài),需要在初始化的時候設(shè)置它的hidden屬性為no,
在屏幕旋轉(zhuǎn)過程中,自定義的狀態(tài)欄與uiviewcontroller之間的旋轉(zhuǎn)是分離的,所以我們需要做一個隱藏的動畫,在旋轉(zhuǎn)過程前先隱藏自定義的狀態(tài)欄,旋轉(zhuǎn)結(jié)果后設(shè)置顯示狀態(tài)。
如果需要做一種動畫,比方從底部下移顯示一條信息,隔n秒后又自動收回的動畫,直接設(shè)置自定義的視圖的y坐標(biāo)就可以了,默認y坐標(biāo)設(shè)置是0。
最后, 使用它的方式也比較簡單,只需要初始化,代碼:
statusbaroverlay *statusbaroverlay = [[statusbaroverlay alloc] init];
由于我公司的需求是開機自動下載的功能,所以我在初始化的時候,是放在了appdelegate中。
更多信息請查看IT技術(shù)專欄