检测用户是否在通话状态栏中
如何检测用户是否在通话或共享? 我有一个像这样的iAd子视图:
_UIiAD = [[self appdelegate] UIiAD]; _UIiAD.delegate = self; [_UIiAD setFrame:CGRectMake(0,470,320,50)]; [self.view addSubview:_UIiAD];\
当用户打电话时,它设置错误? 我如何检测这个?
UIApplicationDelegate
有这两个方法。
- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame; // in screen coordinates - (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;
还有Notifications
。
UIApplicationWillChangeStatusBarFrameNotification UIApplicationDidChangeStatusBarFrameNotification
但是他们没有发布在应用程序的启动,所以我不会推荐它。
模拟器有一个有用的工具来testing。
Hardware->Toggle In-Call Status Bar
要实现,你必须在你的AppDelegate.m
文件中实现这些方法。 当状态栏改变高度时,它们将被调用。 其中之一是之前和之后的其他变化。
假设你希望你的ViewController
在更改发生时得到通知,一个选项是发送通知。 喜欢这个
首先,在AppDelegate.h
上添加这个属性
@property (assign, nonatomic) CGRect currentStatusBarFrame;
然后,在AppDelegate.m
上实现willChangeStatusBarFrame
- (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 }