2010-07-21 4 views

Répondre

7

Si vous Si vous utilisez Interface Builder, assurez-vous que vos masques autoresize sont définis de manière à redimensionner les vues au lieu de simplement les placer dans la même position. Vous pouvez utiliser l'option Basculer la barre d'état en cours d'appel sous Matériel dans le simulateur pour le tester.

Si vous n'utilisez pas IB, vous pouvez configurer les masques d'autoresize en code.

Si vous n'utilisez pas de vues, vous devez redimensionner vos graphiques lorsque vous recevez les notifications appropriées.

23

Vous pouvez savoir quand cela va se passer en utilisant les méthodes UIApplicationDelegate suivantes:

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame { 
    NSLog(@"willChangeStatusBarFrame : newSize %f, %f", newStatusBarFrame.size.width, newStatusBarFrame.size.height); 
} 

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)newStatusBarFrame { 
    NSLog(@"didChangeStatusBarFrame : newSize %f, %f", newStatusBarFrame.size.width, newStatusBarFrame.size.height); 
} 

Alternativement, vous pouvez vous inscrire à une notification dans votre sous-classe UIViewController:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; 
} 

- (void)statusBarFrameWillChange:(NSNotification*)notification { 
    NSValue* rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey]; 
    CGRect newFrame; 
    [rectValue getValue:&newFrame]; 
    NSLog(@"statusBarFrameWillChange: newSize %f, %f", newFrame.size.width, newFrame.size.height); 
    // Move your view here ... 
} 

- (void)statusBarFrameChanged:(NSNotification*)notification { 
    NSValue* rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey]; 
    CGRect oldFrame; 
    [rectValue getValue:&oldFrame]; 
    NSLog(@"statusBarFrameChanged: oldSize %f, %f", oldFrame.size.width, oldFrame.size.height); 
    // ... or here, whichever makes the most sense for your app. 
} 
+2

Vous pouvez même utiliser les extensions UIKit comme ceci: CGRect newFrame = [rectValue CGRectValue]; - d'une manière ou d'une autre! –

+0

Je veux juste ajouter, la convention NSLog et de dénomination est légèrement fausse. statusBarFrameWillChange est appelé avant statusBarFrameChanged afin que la notification de statusBarFrameWillChange soit en fait la valeur OLD et non la nouvelle valeur. Vice versa avec l'autre méthode. – micnguyen

5

Notez que les suggestions ci-dessus se déclenchent également lorsque l'appareil est pivoté. Si vous voulez juste savoir quand la barre d'état a grandi en raison d'un appel entrant/en cours. J'ai trouvé le code suivant au travail:

AppDelegate.m

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 
{ 
    float adjustment = 0; 

    if ([UIApplication sharedApplication].statusBarFrame.size.height == 40) 
    { 
     adjustment = -20; 
    } 
    else if ([UIApplication sharedApplication].statusBarFrame.size.height == 20 && oldStatusBarFrame.size.height == 40) 
    { 
     adjustment = 20; 
    } 
    else 
    { 
     return; 
    } 

    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:duration]; 

    {YOUR VIEW Controller - remove .view if a view}.view.frame = CGRectMake({YOUR VIEW Controller}.view.frame.origin.x, {YOUR VIEW Controller}.view.frame.origin.y + adjustment, {YOUR VIEW Controller}.view.frame.size.width, {YOUR VIEW Controller}.view.frame.size.height); 

    [UIView commitAnimations]; 
} 
0

Idem avec une application barre d'onglets et iOS6/7, grâce à l » answeruser1208489.

Les valeurs sont complètement différentes et bizarres pour chaque iOS. ; OP

mainAppDelegate.m

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 
{ 
float vue = 0; 
float barre = 0; 
float hauteur = 0; 

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // pour Xcode5/SDK7 

if ([UIApplication sharedApplication].statusBarFrame.size.height == 40) 
{ 
    vue = -20; 
    barre = +20; 
} 
else 
    if ([UIApplication sharedApplication].statusBarFrame.size.height == 20 && oldStatusBarFrame.size.height == 40) 
    { 
     vue = 0; 
     barre = -20; 
    } 
    else return; 

#else // pour Xcode4/SDK6 

if ([UIApplication sharedApplication].statusBarFrame.size.height == 40) 
{ 
    vue = +20; 
    hauteur = 1; 
    barre = -1-20; 
} 
else 
    if ([UIApplication sharedApplication].statusBarFrame.size.height == 20 && oldStatusBarFrame.size.height == 40) 
    { 
     vue = -20; 
     hauteur = -1; 
     barre = +1+20; 
    } 
    else return; 

#endif 

CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration; 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:duration]; 

self.tabBarController.view.frame = CGRectMake(self.tabBarController.view.frame.origin.x, self.tabBarController.view.frame.origin.y + vue, self.tabBarController.view.frame.size.width, self.tabBarController.view.frame.size.height+hauteur); 
self.tabBarController.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, self.tabBarController.tabBar.frame.origin.y + barre, self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.size.height); 

[UIView commitAnimations]; 
} 

Testé sur 4S 7.0.4 (11B554a) avec Xcode 4.6.3 (4H1503) et Xcode 5.0.2 (5A3005).

Questions connexes