2016-01-31 422 views
0

我用它來獲取狀態欄的框架嘗試:如何更改狀態欄的框架?

var statusBarWindow = UIApplication.sharedApplication().valueForKey("statusBarWindow") 

然而,當我試圖改變框架,它說的價值是不變的:

statusBarWindow?.frame = CGRect(x: -oldViewFrame, y: statusBarWindow.frame.origin.y, width: statusBarWindow.frame.size.width, height: statusBarWindow.frame.size.height) 
+0

我需要更改狀態欄的框架和[這](https://github.com/ndesai/InstagramStatusBarTest/blob/master/InstagramStatusBarTest/ViewController.m)是我唯一的出路在網上找到,它給了我一個不變的對象。我在哪裏可以訪問可變狀態欄框? – Jay

+0

框架矩形定義狀態欄的區域。 (只讀)https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instp/UIApplication/statusBarFrame –

+0

@LeoDabus,這意味着狀態酒吧幀不能在迅速操縱,但他們可以在Obj-c? – Jay

回答

2

我我會根據你寫的關於你對這個問題的意圖的評論給你一個答案。


解決方案

你可以得到的狀態欄由UIViewController覆蓋方法prefersStatusBarHidden側邊欄打開側邊欄(類似於鬆弛的應用程序)時消失。它應該是這樣的:

override func prefersStatusBarHidden() -> Bool { 
    return true 
} 

您還可以修改這個外觀與兩種方法:preferredStatusBarStylepreferredStatusBarUpdateAnimation


我做了一個簡單的項目來說明這一點。有可能以許多不同的方式實現一個側邊欄,所以我將這個例子基於popover。您的實施將取決於您如何實施側邊欄。

我做了一個簡單的故事板,每個都有兩個UIViewController和一個UIButton。當點擊第一個UIButton時,它將觸發一個類型爲Present As Popover的繼續,它將顯示第二個控制器。

第一個UIViewController沒有代碼(一切都在故事板中完成),但第二個UIViewController有隱藏狀態欄的代碼。

我附上了故事板的截屏以及下面第二個UIViewController的代碼。

// 
// PopController.swift 
// SidebarHideStatus 
// 
// Created by Stefan Veis Pennerup on 31/01/16. 
// Copyright © 2016 Kumuluzz. All rights reserved. 
// 

import UIKit 

class PopController: UIViewController { 

    // MARK: - Storyboard actions 

    @IBAction func backButtonPressed(sender: UIButton) { 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    // MARK: - Status bar 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 
} 

Storyboard of the example project, highlighting the segue attached to the <code>UIButton</code>


UPDATE 1:OP使用UIView而不是爲邊欄一個UIViewController

首先,我建議您將側欄分解爲單獨的UIViewController,因爲它將使它在未來更加可重用,但這是一個完全不同的討論,可能會持續數日!

爲了隱藏狀態欄,您仍然需要使用之前突出顯示的回調方法,但您只需調用方法setNeedsStatusBarAppearanceUpdate即可手動更新它。

我已經用下面的代碼更新了最初的UIViewController,並刪除了segue以演示這種方法。

// 
// ViewController.swift 
// SidebarHideStatus 
// 
// Created by Stefan Veis Pennerup on 31/01/16. 
// Copyright © 2016 Kumuluzz. All rights reserved. 
// 

import UIKit 

class ViewController: UIViewController { 

    // MARK: - Properties 

    private var isSidebarShown = false 

    // MARK: - Storyboard outlets 

    @IBAction func buttonPressed(sender: UIButton) { 
     isSidebarShown = !isSidebarShown 
     setNeedsStatusBarAppearanceUpdate() 
    } 

    // MARK: - Status bar 

    override func prefersStatusBarHidden() -> Bool { 
     return isSidebarShown 
    } 

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
     // NOTE: This method has no effect now when 
     // using the method setNeedsStatusBarAppearanceUpdate() 
     return .Slide 
    } 

} 
+0

謝謝,但是,我不認爲我可以在我的項目中實現這一點,因爲我用UIView來持有側欄。我使用UIViewAnimation來移動與當前VC相關的視圖,並將邊欄移動了我設置原始視圖的量。所以從本質上講,我不會冒犯任何其他VC。因此,如果使用一個VC,如何刷新視圖以重新觸發prefersstatusbarhidden函數? – Jay

+0

我已經更新了我的回答 – Kumuluzz

+0

謝謝@Kumuluzz!這解決了這個問題。儘管我有一個問題:爲了創建側邊欄,我劃分了UIView子類,所以它仍然可以重用,並不是因爲它是最好的,但它是我能想出的唯一解決方案。通過創建一個UIVC,我可以獲得什麼優勢?我絕對想成爲一名更好的程序員,所以如果你能儘可能詳細地闡述它,我會非常感激! – Jay