2010-07-21 17 views
10

Telefon görüşmesi sırasında görüşümün yeşil çubuğun altında görünmesini nasıl sağlayabilirim? Şu anda benim app bir telefon görüşmesi sırasında yeşil çubuk tarafından kısmen kaplıdır. EğerTelefon görüşmesi sırasında yeşil çubuğun altında görünüm nasıl konumlandırılır?

- (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. 
} 

cevap

7

': Alternatif

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

Eğer UIViewController alt sınıfta bir bildirim kayıt olabilir, Bu şu UIApplicationDelegate yöntemlerle gerçekleşmesi üzereyken

23

öğrenebilirsiniz Interface Builder'ı kullanarak, otomatikleştirme maskelerinizin, yalnızca aynı konumda oturmak yerine görünümleri yeniden boyutlandıracak şekilde ayarlandığından emin olun. Test etmek için Simülatördeki Donanım altındaki Toggle-Call Durum Çubuğu seçeneğini kullanabilirsiniz.

IB kullanmıyorsanız, maskeleri otomatik olarak kod olarak kurabilirsiniz.

Görünümler kullanmıyorsanız, uygun bildirimleri aldığınızda grafiklerinizi yeniden boyutlandırmanız gerekir.

+2

UIKit uzantılarını şu şekilde kullanabilirsiniz: CGRect newFrame = [rectValue CGRectValue]; - öyle ya da böyle! –

+0

Sadece eklemek istiyorum, NSLog ve adlandırma kuralı biraz yanlış. statusBarFrameWillChange statusBarFrameChanged öğesinden önce çağrılır, böylece statusBarFrameWillChange öğesinden bildirim gerçekte OLD değeri olacak ve yeni değer olmayacaktır. Diğer yöntemle tersi. – micnguyen

5

Aygıtın döndürülmesi sırasında yukarıdaki önerilerin de tetiklendiğini unutmayın. Gelen/devam eden bir telefon görüşmesi nedeniyle durum çubuğunun ne zaman büyüdüğünü öğrenmek istiyorsanız. Aşağıdaki kod çalışmaya bulundu:

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]; 
} 
0

İdem bir Tab Bar App ve iOS6/7, user1208489 'ın answer sayesinde sahip.

Değerler her iOS için tamamen farklı ve tuhaftır. , PÇ

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]; 
} 

Xcode 4.6.3 (4H1503) ve Xcode 5.0.2 (5A3005) iPhone 4S 7.0.4 (11B554a) üzerinde test edilmiştir.

İlgili konular