您現在的位置是:電腦技術吧?>? 組裝維修 ??>??自定義狀態欄怎么設置,自定義狀態欄不見了??>??正文詳情

自定義狀態欄怎么設置,自定義狀態欄不見了

水覓柔2019-12-19 17:42:59 人圍觀
簡介華為自定義狀態欄公司的開發項目需要在狀態欄上增加程序下載的進度條。對于之前編寫的程序,由于自定義狀態欄的邊框和子視圖的邊框和變換都是根據iPad的方向設置的,所以有些

公司的開發的項目要求在狀態欄上邊加入程序下載的進度條,之前寫的程序,由于是根據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  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中。

版權聲明:本文由 水覓柔 整理編輯。

原標題:狀態欄自定義軟件,自定義手機狀態欄

轉載注明出處:http://www.dn9ww09s.icu/assemble/15572.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 復雜的事情簡單做例子,簡單生活的例子

    復雜的事情簡單做例子,簡單生活的例子 相關圖片堅持的例子一個比較簡單的asp.net文件上傳程序代碼,可以上傳rar、zip、TXT、JPG、GIF、DOC等格式的文件。您可以直接復制代碼并將其保存為ASPX文件進行偽代碼的簡單例子...

  • aspjs格式化,asp格式化2百位

    aspjs格式化,asp格式化2百位 相關圖片asp文件轉換格式本文主要介紹了asp.net頁面中時間格式的例子。您可以參考asp.net頁面以Eval格式顯示時間,格式代碼如下:table trtd style=widthasp時間格式...

  • 動態生成,動態表情生成器

    動態生成,動態表情生成器 相關圖片q動態頭像生成器在web應用中,經常需要動態生成圖片,如實時股市行情、各種統計圖表等。在這種情況下,圖片只能在服務器內存中動態生成并發送給用戶,然后在瀏覽器中顯示。實際...

  • php類的方法,php教程

    php類的方法,php教程 相關圖片php入門在PHP5之前,如果每個PHP框架都想實現類的自動加載,通常會根據某個約定自己實現一個遍歷目錄,并自動加載所有符合約定規則的類或函數。當然,在PHP 5之前,面php是什么...

  • 異步獲取無阻,echarts異步獲取數據

    異步獲取無阻,echarts異步獲取數據 相關圖片js異步請求1) 要從指定的URL獲取相應的流,因為要獲取網絡資源,必須首先擁有URL。在這里,我首先封裝了通過打開URL連接獲得的InputStream,這樣interf真正的異步...

  • 明日之后水紋特效,視頻局部水紋特效

    明日之后水紋特效,視頻局部水紋特效 相關圖片pr水波紋特效在哪/*腳本:zhfi特別感謝:restools,x-star*/!Addplugindir。!添加目錄。!包括mui2.nsh------------------ae波浪特效...

  • 項目管理器的功能,文件管理器哪個好用

    項目管理器的功能,文件管理器哪個好用 相關圖片安卓文件管理器特定的SQL企業管理器。(請注意:只有您擁有Microsoft office2000或XP許可證,這些軟件才是免費的。)許多使用SQL server的公司也使用服務器管理器怎么打開...

  • 刪除分區會刪除數據嗎,數據庫分區

    刪除分區會刪除數據嗎,數據庫分區 相關圖片分區損壞恢復數據創建分區表后,可以直接將數據插入分區表,而不管數據放在哪個物理數據表中。在上一篇文章的后面,我們將幾個數據插入到創建的分區表中:50行=15名稱=code類=c移...

  • 什么是數據庫,數據庫有什么用

    什么是數據庫,數據庫有什么用 相關圖片數據庫類型對于SQL新手來說,空值的概念常常會引起混淆。他們經常認為null與空字符串“”是同一回事。事實并非如此。例如,以下語句完全不同:MySQL insert in數據庫有哪些類型...

  • fplot用法示例,vbarray的用法

    fplot用法示例,vbarray的用法 相關圖片groupbyhiving用法本文主要介紹Oracle merge into的使用。您可以參考以下情況。如果表中已經存在一段數據,請更新它。如果不存在,插入新數據。如果不使用Oracle提供說的用法...

熱評文章

  • 數據庫分區表有必要嗎,數據庫分區表類型

    數據庫分區表有必要嗎,數據庫分區表類型 相關圖片sql數據庫分區Oracle數據庫如何查看分區表信息?我想知道你是否總結了這些知識。接下來,我們創建兩個表test和GPRS?細胞體積?努力做實驗。腳本如下:create tadb2分區表創建...

  • html字符串轉化為,讓字符串轉成html

    html字符串轉化為,讓字符串轉成html 相關圖片js解析html字符串本文主要介紹了JavaScript檢測字符串中是否包含HTML標記的實現方法。本文直接給出了實現代碼。對于您的朋友,請參考下面的函數代碼:/**HTML標記是否js字符串轉html標簽...

  • 如何建立空數據庫,怎么創建空數據庫

    如何建立空數據庫,怎么創建空數據庫 相關圖片建立空數據庫的快捷鍵怎么新建空數據庫...

  • 如何建立空數據庫,怎么創建空數據庫

    如何建立空數據庫,怎么創建空數據庫 相關圖片建立空數據庫的快捷鍵現在我們知道了在構建數據庫之前應該注意的問題,讓我們從最基本的新空數據庫開始了解access數據庫的結構。在access 2000中,單擊access窗口左上角怎么新建空數據...

  • navicat怎么連接mysql,navicat連接不上mysql

    navicat怎么連接mysql,navicat連接不上mysql 相關圖片mysql navicat最新版本的Navicat for MySQL有自己的注冊代碼。它已經被綠化了。您可以通過將其解壓縮到任何目錄來運行它。Navicat premium是一個多連接navicat連接mysql...

  • 安裝軟件說端口號被占用解決方法,解決端口占用

    安裝軟件說端口號被占用解決方法,解決端口占用 相關圖片8080端口號被占用本文主要介紹Android開發中端口號占用問題的解決方案。本文給出了一種簡單實用的方法來解決這個煩人的問題。你可以參考Android開發中的端口號占用問題,這個查看8...

  • 安全隱患措施有哪些,身邊的安全隱患及措施

    安全隱患措施有哪些,身邊的安全隱患及措施 相關圖片避免安全隱患隨著Internet的發展,web技術日新月異。ASP(active server pages)作為繼通用網關接口(CGI)之后的一種典型的服務器端Web設計技我身邊的安全隱患及改正措施...

  • 自定義標簽在哪,自定義標簽是什么意思

    自定義標簽在哪,自定義標簽是什么意思 相關圖片自定義個性標簽大全一般來說,要開發JSP自定義標記,我們需要參考以下兩個包:import javax。Servlet。JSP。標簽文本。*. 首先,我們需要對開發自定義標記所涉及qq自定義標簽高冷...

  • 用戶IP地址,IP地址范圍

    用戶IP地址,IP地址范圍 相關圖片IP地址的分類在asp.net環境中獲取用戶IP的公共類。在許多情況下,我們需要記錄訪問者的IP地址。此類可以使用system.web.httpcontext.currentIP地址格式...

  • hello the world,helloworld是什么

    hello the world,helloworld是什么 相關圖片hello world是什么意思本文主要介紹react JS的HelloWorld編程及其相關知識。React是一個由Facebook開發的開源JS框架。它的受歡迎程度目前正在飆升。您可以參考hello world是什么意...

關注微信

变脸官网查询