Обнаружение, если пользователь имеет в строке состояния вызова

Как определить, является ли пользователь во время вызова или привязкой? У меня есть subview для iAd, как это:

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

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

И это неправильно, когда пользователь в вызове? Как это обнаружить?

Ответ 1

UIApplicationDelegate имеет эти два метода.

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame;   // in screen coordinates
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;

И есть Notifications тоже.

UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification

но они не опубликованы при запуске приложения, поэтому я бы не рекомендовал его.

У симулятора есть полезный инструмент для проверки этого.

Hardware->Toggle In-Call Status Bar

Чтобы реализовать, вы должны реализовать эти методы в своем файле AppDelegate.m. Они будут вызываться, когда строка состояния изменит ее высоту. Один из них он назвал раньше, а другой после изменения.

Предполагая, что вы хотите, чтобы ваш ViewController был уведомлен о произошедшем изменении, один из вариантов - отправка уведомлений. Как этот

Сначала добавьте это свойство на AppDelegate.h

@property (assign, nonatomic) CGRect currentStatusBarFrame;

тогда реализуем willChangeStatusBarFrame на 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]}];

}

И мы закончили с базой нашего Status Bar Frame Checker. Следующая часть, которую вы реализуете на любом ViewController, который должен знать рамку строки состояния.

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

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

И чтобы получить уведомление, когда он изменится, добавьте это в метод ViewDidLoad.

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

И реализовать этот метод

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