2014-05-24 16 views
15

Jak wykryć, czy użytkownik jest w trakcie połączenia lub tetheringu? Mam subview dla iAd w ten sposób:Wykrywanie, czy użytkownik ma na pasku stanu połączenia

_UIiAD = [[self appdelegate] UIiAD]; 
    _UIiAD.delegate = self; 

    [_UIiAD setFrame:CGRectMake(0,470,320,50)]; 
    [self.view addSubview:_UIiAD];\ 

I ustawia to źle, gdy użytkownik jest w trakcie rozmowy? Jak to wykryć?

Odpowiedz

28

UIApplicationDelegate ma te dwie metody.

Są też Notifications.

UIApplicationWillChangeStatusBarFrameNotification 
UIApplicationDidChangeStatusBarFrameNotification 

, ale nie zostały one opublikowane podczas uruchamiania aplikacji, więc nie polecam go.

Symulator ma przydatne narzędzie do testowania tego.

Hardware->Toggle In-Call Status Bar 

Aby zaimplementować, musisz wdrożyć te metody na swoim pliku AppDelegate.m. Będą wywoływane, gdy pasek stanu zmieni jego wysokość. Jeden z nich został wywołany wcześniej, a drugi po zmianie.

Zakładając, że chcesz, aby Twój ViewController był powiadamiany o zmianie, jedną z opcji jest wysyłanie powiadomień. Podoba Ci się to

Najpierw dodaj tę właściwość na AppDelegate.h

@property (assign, nonatomic) CGRect currentStatusBarFrame; 

następnie wdrożyć willChangeStatusBarFrame na AppDelegate.m

- (void) application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame 
{ 
    self.currentStatusBarFrame = newStatusBarFrame; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Status Bar Frame Change" 
                 object:self 
                 userInfo:@{@"current status bar frame": [NSValue valueWithCGRect:newStatusBarFrame]}]; 

} 

I skończymy z podstawą naszego Status Bar Frame Checker. Następna część implementujesz na dowolnym ViewController, który musi znać ramkę paska stanu.

każdym razem, gdy chcesz uzyskać ramkę paska stanu, jak to zrobić tak

[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame] 

i być powiadomiony, gdy to się nie zmieni, to dodać do ViewDidLoad metody.

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(statusBarFrameChanged:) 
              name:@"Status Bar Frame Change" 
              object:[[UIApplication sharedApplication] delegate]]; 

i wdrożenie tej metody

- (void) statusBarFrameChanged:(NSNotification*)notification 
{ 
    CGRect newFrame = [[notification.userInfo objectForKey:@"current status bar frame"] CGRectValue]; 
    NSLog(@"new height %f", CGRectGetHeight(newFrame)); 
    // Here you do whatever you wanna do with the new height 
} 
+0

Prawidłowa odpowiedź nie jest do zrobienia układ z numerami zakodowane w pierwszej kolejności i korzystania układ Auto, Auto rozmiaru maski, lub regulacji na podstawie bieżącej wielkości w layoutSubviews zamiast w rzeczywistości monitorować stan paska stanu. (Na przykład kod OP nie będzie działać na ekranach 3,5 "z tego samego powodu.) –

+0

Wszelkie przemyślenia na temat tego, jak to zrobić w krajobrazie. W krajobrazie pasek stanu nie zmienia wysokości w połączeniu, więc ramka zmieniła się Powiadomienia nigdy nie są wywoływane – MusiGenesis

+1

Myślę, że chcesz zmienić "Zmiana stanu paska stanu" za pomocą UIApplicationWillChangeStatusBarFrameNotification – kevinl

Powiązane problemy