Как мне показать мой вид под зеленой полосой во время телефонного звонка? прямо сейчас мое приложение частично закрывается зеленой полосой во время телефонного разговора.
Как установить вид под зеленой полосой во время телефонного звонка?
Ответ 1
Если вы используете Interface Builder, убедитесь, что ваши маски autoresize установлены так, что они изменяют размеры представлений вместо того, чтобы просто сидеть там в одной и той же позиции. Вы можете использовать опцию Toggle In-Call Status Bar в разделе Hardware in the Simulator для ее проверки.
Если вы не используете IB, вы можете настроить маски автосохранения в коде.
Если вы не используете представления, вам необходимо изменить размер графики при получении соответствующих уведомлений.
Ответ 2
Вы можете узнать, когда это произойдет, используя следующие методы UIApplicationDelegate:
- (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);
}
Кроме того, вы можете зарегистрироваться для уведомления в вашем подклассе UIViewController:
- (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
Обратите внимание, что приведенные выше предложения также срабатывают при повороте устройства. Если вы просто хотите найти, когда строка состояния выросла в высоту из-за входящего/текущего телефонного звонка. Я нашел следующий код для работы:
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
То же самое с приложением Tab Bar и iOS6/7, благодаря user1208489 answer.
Значения совершенно разные и странные для каждого iOS., ОЦ
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];
}
Протестировано на iPhone 4S 7.0.4 (11B554a) с Xcode 4.6.3 (4H1503) и Xcode 5.0.2 (5A3005).