2010-07-21 4 views

ответ

7

Если вы» re, используя Interface Builder, убедитесь, что ваши маски авторезистировки установлены так, что они изменяют размеры представлений вместо того, чтобы просто сидеть там в одной и той же позиции. Вы можете использовать опцию Toggle In-Call Status Bar в разделе Hardware in the Simulator для ее проверки.

Если вы не используете IB, вы можете настроить маски автосохранения в коде.

Если вы не используете представления, вам необходимо изменить размер графики, когда вы получите соответствующие уведомления.

23

Вы можете узнать, когда это должно произойти, используя следующие UIApplicationDelegate методы:

- (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); 
} 

В качестве альтернативы, вы можете зарегистрироваться для получения уведомления в вашем 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

Вы даже можете использовать расширения UIKit следующим образом: CGRect newFrame = [rectValue CGRectValue]; - так или иначе! –

+0

Я просто хочу добавить, что соглашение NSLog и именование несколько неправильно. statusBarFrameWillChange вызывается перед statusBarFrameChanged, поэтому уведомление из statusBarFrameWillChange будет фактически значением OLD, а не новым значением. И наоборот, с другим методом. – micnguyen

5

Обратите внимание, что приведенные выше предложения также срабатывают при повороте устройства. Если вы просто хотите найти, когда строка состояния выросла в высоту из-за входящего/текущего телефонного звонка. Я нашел следующий код для работы:

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 с Tab Bar App и iOS6/7, благодаря user1208489 «s answer.

Значения совершенно разные и странные для каждого iOS. , ОЦ

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]; 
} 

Проверено на iPhone 4S 7.0.4 (11B554a) с Xcode 4.6.3 (4H1503) и Xcode 5.0.2 (5A3005).

Смежные вопросы