How do I make my view appear below the green bar during a phone call? right now my app is being partially covered by the green bar during a phone call.
问题:
回答1:
If you're using Interface Builder, make sure your autoresize masks are set so that it resizes the views instead of just having them sit there in the same position. You can use the Toggle In-Call Status Bar option under Hardware in the Simulator to test it.
If you're not using IB, you can set up the autoresize masks in code.
If you're not using views, you'll need to resize your graphics when you get the appropriate notifications.
回答2:
You can find out when this is about to happen using the following UIApplicationDelegate methods:
- (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);
}
Alternatively, you can register for a notification in your UIViewController subclass:
- (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.
}
回答3:
Note that the suggestions above also fire when the device is rotated. If you just want to find when the status bar has grown in height due to an incoming/ongoing phone call. I found the following code to work:
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];
}
回答4:
Idem with a Tab Bar App and iOS6/7, thanks to user1208489's answer.
Values are completely different and weird for each iOS. ;oP
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];
}
Tested on iPhone 4S 7.0.4 (11B554a) with Xcode 4.6.3 (4H1503) and Xcode 5.0.2 (5A3005).