2016-01-31 1 views
0

J'ai essayé d'utiliser cela pour obtenir le cadre de la barre d'état:Comment puis-je changer le cadre de la barre d'état?

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

cependant, lorsque je tente de changer le cadre, il dit la valeur est immuable:

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

Je dois changer le cadre de la barre d'état et [ce] (https://github.com/ndesai/InstagramStatusBarTest/blob/master/InstagramStatusBarTest/ViewController.m) est la seule façon que je l'ai trouvé en ligne, et il me donne un objet immuable. Où puis-je accéder au cadre de la barre d'état modifiable? – Jay

+0

Le rectangle du cadre définissant la zone de la barre d'état. (lecture seule) https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instp/UIApplication/statusBarFrame –

+0

@LeoDabus, ce qui implique que le statut les cadres de barre ne peuvent pas être manipulés dans swift, mais ils peuvent dans Obj-c? – Jay

Répondre

2

Je Je vais vous donner une réponse en fonction des commentaires que vous avez écrits sur votre intention avec cette question.


Solution

Vous pouvez obtenir la barre d'état à disparaître lors de l'ouverture de la barre latérale (similaire à l'application Slack) en remplaçant la méthode prefersStatusBarHidden de UIViewController pour la barre latérale. Il devrait être quelque chose comme ce qui suit:

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

Vous pouvez également modifier l'apparence de cela avec les deux méthodes: preferredStatusBarStyle et preferredStatusBarUpdateAnimation


Exemple

Je l'ai fait une projet simple pour illustrer cela. Il est possible d'implémenter une barre latérale de différentes manières, donc j'ai basé cet exemple sur un popover. Votre implémentation dépendra de la manière dont vous avez implémenté la barre latérale.

J'ai fait un storyboard simple avec deux UIViewController et un UIButton dans chacun. En cliquant sur le premier UIButton, il déclenchera un segment avec le type Present As Popover qui montrera le deuxième contrôleur.

Le premier UIViewController n'a aucun code (tout est fait dans le storyboard), mais le second UIViewController a le code pour cacher la barre d'état.

J'ai joint une capture d'écran du storyboard et le code pour la seconde UIViewController ci-dessous.

// 
// 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>


MISE À JOUR 1: OP utilise un UIView au lieu d'un UIViewController pour la barre latérale. Tout d'abord, je vous recommande de factoriser votre sidebar dans un UIViewController séparé car il le rendra beaucoup plus réutilisable dans le futur, mais c'est une discussion complètement différente qui pourrait durer des jours! Pour masquer la barre d'état, vous devez toujours utiliser la méthode de rappel que j'ai mise en surbrillance auparavant, mais vous devez simplement appeler la méthode setNeedsStatusBarAppearanceUpdate pour la mettre à jour manuellement.

J'ai mis à jour le UIViewController initial avec le code suivant et supprimé le segue afin de démontrer cette approche.

// 
// 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

merci mais, je ne pense pas que je puisse l'implémenter dans mon projet car j'ai utilisé un UIView pour tenir la barre latérale. J'ai utilisé UIViewAnimation pour déplacer la vue attachée au VC actuel et j'ai juste décalé la barre latérale par le montant que j'ai défini la vue originale. Donc, en substance, je ne suis pas au-dessus de tout autre VC. Donc, si avec un VC, comment puis-je actualiser la vue afin de re-déclencher la fonction prefersstatusbarhidden? – Jay

+0

J'ai mis à jour ma réponse ci-dessus – Kumuluzz

+0

Merci @Kumuluzz! Cela a résolu le problème. J'ai une question pour vous: j'ai sous-classé UIView pour créer la sidebar, donc c'est toujours réutilisable, pas parce que c'est le meilleur, mais c'était la seule solution que je pouvais trouver. Quels avantages aurais-je en créant un UIVC sur ce que j'ai fait? Je veux vraiment devenir un meilleur programmeur, donc si vous pouvez l'articuler avec autant de détails que possible, je serais très reconnaissant! – Jay