2010-10-16 6 views
14

Ich erstelle eine iPhone App mit wenigen Elementen im Controller (z. B. Tab-Leiste, uiview, uitoolbar, etc ..). Alles funktioniert gut, bis ich auf dieses Problem gestoßen bin. Während meine Anwendung gestartet wurde, erhielt ich einen Anruf und es zeigt die "Call Status Bar" an, die die UI ruinierte. Einige Elemente werden heruntergedrückt, weil die "Anrufstatusleiste" oben Platz beansprucht.Iphone- Wie Größe ändern, wenn Anruf Statusleiste umgeschaltet wird?

Jeder hier haben eine Idee, wie Sie dieses Problem beheben können? Ich bin neu in der iPhone App Entwicklung.

Ihre Antwort wird sehr geschätzt ...

Mit besten Grüßen,

Antwort

12

Sie diese Funktion auf AppDelegate setzen sollte, dies wird ausgelöst, wenn die Statusleiste ändern

- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setObject:@"trigger" forKey:@"frame"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict]; 
} 

Dieser Kodex wird Benachrichtigung mit dem Namen „Trigger“

Platz ein Code in Ihre View-Controller senden (zB: viewDidLoad, etc ..) diese hören, wenn es abschicken mit einem Namen "Trigger"

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(dataReceived:) 
              name:@"trigger" 
              object:nil]; 

sind und eine Funktion erstellen DataReceived:

- (void)dataReceivedNotification:(NSNotification *)notification { 
    NSDictionary *data = [notification userInfo]; 
    // do something with data 
} 

auf diesem Teil des Codes etwas tun, werden Sie vielleicht den Rahmen Ihres Tab-Leiste ändern, uiview Rahmen, Symbolleiste Rahmen

Und in dealloc, diesen Code setzen den Betrachter

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
zu entfernen
+0

Das funktioniert für mich ... Danke –

+0

Siehe @ process255 für eine genauere Antwort. Auch das Verwenden von Zeichenfolgenliteralen zum Veröffentlichen/Abonnieren von Benachrichtigungen ist eine schlechte Übung (anfällig für Fehler und Tippfehler, Sie sollten Ihre 'NSString * const'-Benachrichtigungsnamen vorher definieren). –

+0

@dianz Sie haben Schlüssel und Wert in dict umgeschaltet. "Trigger" sollte der Schlüssel sein. – Kof

3

Im Grunde, was Sie normalerweise tun, ist zu versuchen, die Autoresize Flaggen aller Ihre UI-Elemente in Interface Builder einzurichten, so dass, wenn der Hauptansicht Wird durch die Anrufstatusleiste "gequetscht", wird alles noch vernünftig aussehen. Es ist ein wenig schwierig zu erklären, wie all dies in einer Nachricht zu tun ist, aber ich empfehle, eine Ansicht in IB zu erstellen, einige Unteransichten darin zu platzieren und dann die Hauptansicht zu verändern, während man mit den Autoresize-Flags spielt, um ein Gefühl für die Flags zu bekommen Arbeit. Die Autoresize-Flags befinden sich in Command-3 (Größeninspektor).

Sie können auch wantsFullScreenLayout im Hauptansicht-Controller auf YES setzen, damit die Ansicht den gesamten Bildschirm einnimmt, einschließlich des Bereichs unter der Statusleiste, aber dann müssen Sie darauf achten, dass Sie nichts unter den Die Statusleiste und die Anrufstatusleiste überlappen natürlich alles, was zu nah ist.

+0

Wie sieht es mit der Umgebung für iOS7/AutoLayout-Constraints aus? –

21

Die Lösung von dianz funktioniert gut, ist aber ein wenig überflüssig, wenn Sie nur die Benachrichtigung in einem bestimmten View-Controller kennen.

Nachdem die Delegiertenmethode application:didChangeStatusBarFrame: im Anwendungsdelegaten UIApplicationDidChangeStatusBarFrameNotification aufgerufen wurde, wird diese über [NSNotificationCenter defaultCenter] gesendet.

Anstatt die Delegate-Methode application:didChangeStatusBarFrame: zu verwenden, um einfach eine benutzerdefinierte Benachrichtigung erneut zu senden, können Sie einen Beobachter UIApplicationDidChangeStatusBarFrameNotification direkt von Ihrem View-Controller hinzufügen.

In MyCustomViewController Sie etwas Ähnliches wie diese hinzufügen würde:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doSomething:) 
              UIApplicationDidChangeStatusBarFrameNotification 
              object:nil]; 

Sie jetzt nicht mehr benötigen, die application:didChangeStatusBarFrame: Delegatmethode in AppDelegate zu definieren (wenn Sie etwas in der AppDelegate, wenn die Statusleiste Größe tun Planänderungen).

Wie bei dianz Vorbild Sie den Betrachter in dealloc

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+5

Große Antwort, außer dass Sie versehentlich (basierend auf der ursprünglichen Frage) "UIApplicationWillChangeStatusBarOrientationNotification" anstelle von "UIApplicationWillChangeStatusBarFrameNotification" verwendet haben. Wenn Sie herausfinden möchten, wann die grüne Statusleiste für eingehende Anrufe angezeigt wird oder verschwindet, möchten Sie die letzte: 'UIApplicationWillChangeStatusBarFrameNotification'. –

+0

Sehr wahr, danke für das Update! –

1

für mich entfernen müssen, sobald die Statusleiste vergrößert wird, die - (void) viewWillLayoutSubviews wird immer dann aufgerufen. Dies ist perfekt für mich, da alle meine Subview SetFrame-Code in dieser Funktion ist.