關於UIStatusBar隱藏的小探究
最近聽說滴滴的折扣很給力,對於之前一直用微信叫車的我,就下了個客戶端,隨便玩了一下,注意到狀態列那小東西的變化,就去探究了一下,也就有了這篇文章...
本人小菜鳥一隻,文章也只是當作自己的筆記,並沒有複雜高深的內容,大神請忽略飄過~ 哈哈
UIStatusBar
對於StatusBar,由於其特殊性,蘋果對其並未像其他類一樣,暴露給我們單獨的h檔案,包含各個property以及相關API,就只是在UIApplication類提供相關幾個屬性跟API,所以我們平時對其的操作不外乎更改Style或者Hidden屬性;當然,還有橫豎屏轉換的問題,這裡我就不另作詳述了。
隱藏的方式
這裡要稍微講一下,在iOS 6的時候,我們通過修改專案plist檔案中的View controller-based status bar appearance 的布林值為No(預設為Yes),然後使用以下API來實現對statusBar的隱藏
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]")
通常我們也是這麼幹的,通過配置一個Bool值引數傳入方法,來實現在需要的時候對statusBar做隱藏或顯示,同時也可配置是否伴隨動畫,類似這樣:
- (void)configeStatusBarHidden:(BOOL)hidden {
if (hidden) {
[[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationSlide];
}else {
[[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationSlide];
}
}
這種修改plist檔案的方式在iOS7、8中也照樣可用,不過在iOS9中就報了警告,詳情可戳這裡,因此,我們應該把plist檔案中的那個value值改為Yes。並且從上面的API可以看到,iOS9之後,這個API也就DEPRECATED,官方也建議我們用-[UIViewController prefersStatusBarHidden]來代替,可能有童鞋會說,DEPRECATED也可以用呀,就像專案原先支援iOS7+ 使用UIAlertView,後來改為支援ios8+ ,無非就多個警告而已,也沒事呀. 但這裡會些許不同
當plist檔案的value值改為Yes的時候,上面使用的- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation 將不起任何作用,反之,- (BOOL)prefersStatusBarHidden也會失效;
使用新的API來實現隱藏的功能需求
- (BOOL)prefersStatusBarHidden {
UIApplication *app = [UIApplication sharedApplication];
return !app.isStatusBarHidden;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationSlide;
}
但使用兩個API雖然可以實現隱藏功能,但我們即使設定了動畫,也沒看到任何動畫效果,也只是閃的一下就沒了
那要怎樣才有動畫效果呢? 其實只要你夠細心,在看API文件的時候就會發現,在上面那兩個API的下面,有這麼個方法,
// This should be called whenever the return values for the view controller's status bar attributes have changed. If it is called from within an animation block, the changes will be animated along with the rest of the animation block.
- (void)setNeedsStatusBarAppearanceUpdate NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
相關的註釋說的非常清晰,我們可以把這個方法放在animation block裡面來達到動畫效果,事不宜遲,趕緊試試
[UIView animateWithDuration:0.33 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
</div>
這樣,滴滴的那個效果也就可以初步實現了,看下效果
- (IBAction)jump:(UIButton *)sender {
sender.tag = !sender.tag;
sender.tag ? [self showLeftView] : [self hideLeftView];
}
- (void)showLeftView {
[UIView animateWithDuration:0.33 animations:^{
self.leftView.transform = CGAffineTransformTranslate(self.leftView.transform, 200, 0);
[self setNeedsStatusBarAppearanceUpdate];
}];
}
- (void)hideLeftView {
[UIView animateWithDuration:0.33 animations:^{
self.leftView.transform = CGAffineTransformTranslate(self.leftView.transform, -200, 0);
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.33 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
}];
}
OK啦,可以收工了!!???
不不不,還沒完呢,還有話要說:
文章中所截圖的demo,最外層是有套了一個NavigationController的,然後通過在viewDidLoad設定隱藏navigationBar,因為仔細看發現滴滴應該也是隱藏了navigationBar的。其實這種需求還是比較少見的,而且也不適用於在Push介面的時候等;對了,如果你沒隱藏navigationBar,會出現這樣的情況:**
最後,感謝您的閱讀,若文章有描述錯誤,望指正,非常感謝!
相關文章
- 關於macOS 選單欄的隱藏操作技巧Mac
- 隱藏資料夾怎麼取消隱藏 關閉隱藏檔案的辦法
- 關於隱藏Selenium繞過檢測
- macOS 訪達的隱藏小技巧Mac
- 收藏 | 關於Mac Dock的10 個隱藏終端命令Mac
- 分析關於木馬隱藏一個的新方法(轉)
- 關於new Object的探究Object
- Chrome開發者工具關於網路請求的一個隱藏技能Chrome
- 關於一些類病毒隱藏技術的設想 (轉)
- MAC如何顯示隱藏檔案和隱藏隱藏檔案的命令Mac
- 關於IOS物件的小事的探究iOS物件
- 關於iPhone X下Home鍵的隱藏和延遲響應iPhone
- Finder簡單人性化的隱藏小技巧分享~
- Mac下顯示和隱藏隱藏檔案的命令Mac
- 關於一個公益專案的探究
- 關於資料庫open的深入探究資料庫
- Win10關閉隱藏並刪除小娜圖文教程詳解Win10
- Element ui的Table元件的列的顯示於隱藏UI元件
- CSS 小結筆記之元素的隱藏與顯示CSS筆記
- 隱藏ip
- 隱藏索引索引
- win10怎麼清理電腦隱藏的廣告_win10關閉隱藏內建廣告的方法Win10
- OSX中隱藏和顯示[隱藏檔案]的命令列命令列
- 小程式tabBar跳轉頁面並隱藏tabBartabBar
- formValidation.js驗證隱藏域小tipORMJS
- MacOS X隱藏和顯示隱藏檔案Mac
- Mac顯示和隱藏“隱藏檔案”命令Mac
- 關於Android中軟鍵盤顯示隱藏的監聽判斷總結Android
- 關於資料庫open的深入探究(轉)資料庫
- iOS Status Bar 的隱藏iOS
- 隱藏uitabbar的程式碼UItabBar
- Mac小技巧|Mac上如何搜尋隱藏檔案?Mac
- c++中的隱藏及過載、重寫與隱藏的區別C++
- 一個關於wait/notify與鎖關係的探究AI
- Oracle 隱藏列Oracle
- Funter for Mac(一鍵開關檔案隱藏工具)Mac
- 兩個寶藏|關於我在github上衝浪時的一個小技巧。Github
- 關閉(隱藏)控制檯上顯示的檔案路徑