检测用户是否处于通话状态栏中

19

我如何检测用户是否在通话或者共享网络?我有一个像这样的 iAd 子视图:

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

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

当用户通话时,它设置错误了吗?我该如何检测到这一点?

2个回答

34

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)

还有通知

//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])
}

我们已经完成了状态栏框架检查器的基本部分。接下来,您需要在需要了解状态栏框架的任何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));
}

在Swift中

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

正确的做法不是一开始就使用硬编码数字进行布局,而是使用自动布局、自动调整大小掩码或根据当前大小在layoutSubviews中进行调整,而不是实际监视状态栏的状态。(例如,OP的代码由于同样的原因在3.5英寸的显示屏上无法工作。) - Jesse Rusak
您对如何在横屏中实现有何想法?在横屏模式下,状态栏在通话中不会改变高度,因此框架更改的通知永远不会被调用。 - MusiGenesis
1
我认为你应该将“Status Bar Frame Change”更改为UIApplicationWillChangeStatusBarFrameNotification。 - kevinl

1
我希望您能够解决状态栏问题,该问题导致视图向下移动。您可以使用以下代码来解决此问题。
在Swift中:
self.tabBarController?.tabBar.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue)))

它解决了我的问题,该问题是由于用户通话时状态栏引起的。有关 Objective-C 参考,请单击此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接