11
votes

Comment positionner la vue ci-dessous Barre verte pendant un appel téléphonique?

Comment faire mon avis apparaît sous la barre verte pendant un appel téléphonique? À l'heure actuelle, mon application est partiellement couverte par la barre verte lors d'un appel téléphonique.


0 commentaires

4 Réponses :


24
votes

Vous pouvez savoir quand cela est sur le point de se produire en utilisant les méthodes UIAPPlicationDelegate suivantes:

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


2 commentaires

Vous pouvez même utiliser les extensions Uikit comme: CGRRect Newframe = [rectvalue cgrecturevalue]; - dans les deux cas!


Je veux juste ajouter, la convention NSLOG et la dénomination est légèrement fausse. StatutBarFramewillChange est appelé avant que StatutBarFramEchangé, de sorte que la notification de StatutBarFramewillhange sera effectivement l'ancienne valeur et non la nouvelle valeur. Vice versa avec l'autre méthode.



7
votes

Si vous utilisez l'interface Builder, assurez-vous que vos masques automobiliaires sont définis de manière à redimensionner les vues au lieu de simplement les avoir assis dans la même position. Vous pouvez utiliser l'option de barre d'état à bascule en appel sous le matériel dans le simulateur pour le tester.

Si vous n'utilisez pas IB, vous pouvez configurer les masques automobiliaires dans le code.

Si vous n'utilisez pas de vues, vous devez redimensionner vos graphiques lorsque vous obtenez les notifications appropriées.


0 commentaires

6
votes

Notez que les suggestions ci-dessus incendient également lorsque l'appareil est tourné. Si vous souhaitez simplement trouver lorsque la barre d'état a augmenté de hauteur en raison d'un appel téléphonique entrant / continu. J'ai trouvé le code suivant pour fonctionner:

Appdelegate.m P>

- (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 commentaires

0
votes

Idem avec une touche de tabulation et iOS6 / 7, grâce à user1208489 's answer .

Les valeurs sont complètement différentes et étranges pour chaque iOS. ; op

mainappdelegate.m xxx

testé sur iPhone 4S 7.0.4 (11B554A) avec Xcode 4.6.3 (4H1503) et XCode 5.0.2 (5A3005).


0 commentaires