Определение наличия пользователя в строке состояния звонка

Как я могу определить, находится ли пользователь в режиме разговора или в режиме модема? У меня есть подпредставление для iAd, как это:

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

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

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

2 ответа

Решение

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

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

// Swift
func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect)
func application(_ application: UIApplication, didChangeStatusBarFrame oldStatusBarFrame: CGRect)

И здесь Notifications тоже.

//ObjC
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification

// Swift
Notification.Name.UIApplicationWillChangeStatusBarFrame
Notification.Name.UIApplicationDidChangeStatusBarFrame

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

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

Аппаратное обеспечение-> Строка состояния переключения вызовов (⌘Y)

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

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

Сначала добавьте это свойство / переменную на AppDelegate

// ObjC
@property (assign, nonatomic) CGRect currentStatusBarFrame;

// Swift
var currentStatusBarFrame: CGRect = .zero

затем реализовать willChangeStatusBarFrame

// ObjC
- (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]}];

}

// Swift
func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect) {
    currentStatusBarFrame = newStatusBarFrame
    NotificationCenter.default.post(
        name: NSNotification.Name(rawValue: "Status Bar Frame Change"),
        object: self,
        userInfo: ["current status bar frame": newStatusBarFrame])
}

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

Каждый раз, когда вы хотите получить рамку строки состояния, вам это нравится

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

// Swift
(UIApplication.shared.delegate as! AppDelegate).currentStatusBarFrame

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

В ObjC

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

В Свифте

    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "Status Bar Frame Change"),
                                           object: nil,
                                           queue: nil) { (note) in
                                            guard let currentStatusBarFrame = note.userInfo?["current status bar frame"] as? CGRect else {return}
                                            print("New Height", currentStatusBarFrame.height)
    }

Я полагаю, у вас есть проблема в строке состояния, из-за которой вы видите смещение вниз. Вы можете использовать приведенный ниже код, чтобы решить эту проблему

В быстром

self.tabBarController?.tabBar.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue)))

Это решило мою проблему, вызванную строкой состояния, когда пользователь находится в состоянии вызова. для объективной ссылки C нажмите здесь

Другие вопросы по тегам