Как расположить вид под зеленой полосой во время звонка? - PullRequest
11 голосов
/ 22 июля 2010

Как сделать так, чтобы мой вид отображался под зеленой полосой во время телефонного звонка? сейчас мое приложение частично закрывается зеленой полосой во время телефонного звонка.

Ответы [ 4 ]

24 голосов
/ 22 июля 2010

Вы можете узнать, когда это произойдет, используя следующие методы 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.
}
7 голосов
/ 22 июля 2010

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

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

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

6 голосов
/ 17 марта 2012

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

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 голосов
/ 27 мая 2014

То же самое с приложением панели вкладок и 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...