国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

iOS自定義狀態欄代碼解析

移動開發 iOS
默認我們的UIView layer都是在UIWindowLevelNormal上,這也就是為什么系統彈出來的對話框在我們的視圖之上,因為它的Window Level級別更高。

公司的開發的項目要求在狀態欄上邊加入程序下載的進度條,之前寫的程序,由于是根據ipad的朝向來設置自定義的狀態欄的frame,以及子視圖的 frame和transform,出現一些不太容易解決的bug。這兩天正好項目不太緊,就好好學習一下這方面的知識,以下是我所總結的一點經驗:

這里說明一下,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 <Foundation/Foundation.h>
 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中。

責任編輯:冰凝兒
相關推薦

2013-07-18 16:09:10

自定義iOS狀態欄iOS開發iOS學習

2014-06-06 14:03:13

iOS狀態欄提示控件原理

2017-10-25 14:07:54

APPiOSxcode

2021-08-24 15:25:59

鴻蒙HarmonyOS應用

2013-11-20 15:08:32

iOS開發狀態欄

2017-02-17 11:00:57

狀態欄Android

2013-06-27 11:10:01

iOS開發自定義UISlider

2014-12-10 10:37:45

Android自定義布局

2013-05-30 15:53:17

iOS開發iOS SDKPopver

2021-01-20 08:58:39

iOS 14桌面圖標快捷指令

2011-08-02 11:17:13

iOS開發 View

2015-02-12 14:49:36

CGToast狀態欄提示Status

2016-11-29 11:20:08

Android

2012-06-01 11:02:33

2012-04-16 14:32:31

iOS選擇器代碼

2011-05-04 10:40:02

網頁加載進度標題欄lephone

2022-02-21 15:16:30

HarmonyOS鴻蒙操作系統

2015-02-12 15:33:43

微信SDK

2011-04-27 10:31:38

Java

2022-07-15 16:39:46

ETS導航欄組件
點贊
收藏

51CTO技術棧公眾號

久久在线观看免费| 中日韩午夜理伦电影免费| 天堂v在线视频| 日韩天天综合| 91最新在线免费观看| 青草久久视频| 在线免费观看羞羞视频一区二区| 成码无人av片在线观看网站| 在线观看亚洲专区| 最近中文字幕在线| 亚洲最大的成人av| 狠狠色一日本高清视频| 亚洲天堂网中文字| 性欧美18+| 天天色图综合网| 在线国产1区| 日韩欧美国产成人| 国产精品久久久久一区二区国产| 精品欧美激情精品一区| bdsm精品捆绑chinese| 一区二区三区日韩在线观看| 99爱视频在线观看| 亚洲美女区一区| 99热在线网站| 在线免费观看日本欧美| 成人资源www网在线最新版| 欧美日韩激情在线| 女同一区二区免费aⅴ| 精品乱人伦小说| 一区二区电影免费观看| 色偷偷偷综合中文字幕;dd| 成人在线视频www| 久久久人成影片一区二区三区| 国产福利一区二区精品秒拍| 欧洲精品毛片网站| 国产欧美日韩精品一区二区三区 | 欧美日韩卡一卡二| av毛片在线| 亚洲色图美腿丝袜| 99久久99九九99九九九| 97人人模人人爽人人喊中文字| 日韩欧美视频| 欧美国产二区| 不卡的av中国片| 无套内精的网站| 色婷婷精品久久二区二区蜜臂av| 中文字幕免费高清电视剧网站在线观看| 日韩精品在线免费观看| 日韩中文字幕视频网| 国产精品欧美风情| 国产日韩欧美| 91免费黄视频| 亚洲第一福利视频在线| 成人av福利| 欧美大片第1页| 91精品天堂福利在线观看| 欧美lavv| 久久夜色精品一区| 又黄又爽在线观看| 亚洲精品黄网在线观看| 成人看片黄a免费看视频| gratisvideos另类灌满| 熟女人妇 成熟妇女系列视频| 久久无码av三级| 国产女优裸体网站| 欧美精品免费视频| 精品视频一区二区三区在线观看| 成人免费观看网址| 国产精品18久久久久久久久| 色婷五月综激情亚洲综合| 欧美精三区欧美精三区| 亚洲高清国产拍精品26u| 国产成人高潮免费观看精品| 亚洲欧美bt| 男生操女生视频网站| 日韩视频一区在线观看| 国产精品毛片视频| 黑人另类av| 中文一区在线播放 | 成人综合在线视频| 领导边摸边吃奶边做爽在线观看 | 久热综合在线亚洲精品| 天天操天天爱天天爽| 欧美一区二区视频在线观看 | 成人网18免费网站在线| 日韩视频在线一区二区| 亚洲资源网站| 日本一级淫片演员| 色婷婷激情一区二区三区| 国外成人福利视频| 久草热久草热线频97精品| 亚洲欧美在线视频观看| 性国裸体高清亚洲| 91在线精品观看| 国产精品美女久久久久aⅴ| 欧亚av在线| 国产一区在线免费| 亚洲精选在线视频| 亚洲伦理网站| 黄色免费高清视频| 欧美日韩国产欧美日美国产精品| 免费萌白酱国产一区二区三区| 日韩视频一二三| 91精品国产综合久久久久久久久久| 婷婷五月色综合香五月| 国产a级一级片| 亚洲精品自在久久| 久久aⅴ国产紧身牛仔裤| 黄网站app在线观看下载视频大全官网 | 久久69av| 日本女人高潮视频| 欧美嫩在线观看| 天天揉久久久久亚洲精品| 牛夜精品久久久久久久| 一区二区亚洲欧洲国产日韩| 热久久久久久久| 二区三区在线| 国产伊人精品在线| 综合欧美一区二区三区| gogo大尺度成人免费视频| 影音欧美亚洲| 精品成人一区二区三区四区| 99在线|亚洲一区二区| 天堂影院在线| 国产精品色午夜在线观看| 亚洲免费观看高清| 久久99国产成人小视频| 高清成人av| 456亚洲影院| 亚洲人成亚洲人成在线观看图片 | 一区二区三区视频观看| 麻豆成人综合网| 毛片在线网址| 亚洲精品在线免费| 亚洲成人久久久| 国模少妇一区二区三区| 美女福利一区二区| 国产欧美日韩小视频| 在线免费看av不卡| av一区二区三区四区| 成人黄色91| 先锋在线亚洲| 国产成人亚洲综合青青| 亚洲一区二区精品久久av| 日韩精品久久| 高清av在线| 久久国产精品亚洲va麻豆| 日韩一区二区高清| 精彩视频一区二区| 久久婷婷五月综合色丁香| 日韩手机在线观看视频| 日本久久久a级免费| 色综合天天天天做夜夜夜夜做| 激情一区二区| 手机av免费在线| 成人黄色片免费| 成年无码av片在线| 亚洲另类中文字| 亚洲手机在线| 漫画在线观看av| 国产一二三四在线视频| 国产精品亚洲自拍| 日韩写真欧美这视频| av高清久久久| 99久久99热这里只有精品| 免费**毛片在线| 2019日韩中文字幕mv| 97人人爽人人喊人人模波多| 欧美日韩另类在线| 喷白浆一区二区| 欧美成人精品午夜一区二区| 色视频在线播放| 亚洲欧洲一区二区在线观看| 欧美日韩国产第一页| 欧美日韩一区免费| 久久av资源站| 国产成人高清精品免费5388| 91在线视频| 成人久久久久久久久| 91亚洲国产成人久久精品网站| 亚洲激情 国产| 自拍偷在线精品自拍偷无码专区| 欧美午夜a级限制福利片| 少妇在线看www| www 四虎| 亚洲狠狠婷婷综合久久久| 久久久女女女女999久久| 欧美在线看片a免费观看| 成人一级视频在线观看| 亚洲成人最新网站| 成人在线黄色| 欧美美女搞黄| 成人综合视频在线| 粉嫩av四季av绯色av第一区| 久久精品夜夜夜夜夜久久| 在线观看欧美日本| 成人av手机在线观看| 亚洲福利电影| 中国av一区| 日韩a**中文字幕|