web-dev-qa-db-fra.com

Détecter si l'utilisateur a dans la barre d'état d'appel

Comment détecter si un utilisateur est en appel ou en mode modem? J'ai une sous-vue pour iAd comme ceci:

_UIiAD = [[self appdelegate] UIiAD];
_UIiAD.delegate = self;

[_UIiAD setFrame:CGRectMake(0,470,320,50)];
[self.view addSubview:_UIiAD];\

Et cela le met-il mal quand l'utilisateur est en appel? Comment est-ce que je détecte ceci?

18
user3647176

UIApplicationDelegate a ces deux méthodes.

// ObjC
- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame;   // in screen coordinates
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;

// Swift
func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect)
func application(_ application: UIApplication, didChangeStatusBarFrame oldStatusBarFrame: CGRect)

Et il y a aussi Notifications.

//ObjC
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification

// Swift
Notification.Name.UIApplicationWillChangeStatusBarFrame
Notification.Name.UIApplicationDidChangeStatusBarFrame

mais ils ne sont pas postés lors du lancement de l'application, je ne le recommanderais donc pas.

Le simulateur dispose d'un outil utile pour tester cela.

Matériel-> Basculer la barre d'état en cours d'appel (Y)

Je vous suggèrerais d'implémenter ces méthodes dans votre fichier AppDelegate. Ils seront appelés lorsque la barre d'état changera de hauteur. L'un d'eux s'appelle avant et l'autre après le changement.

En supposant que vous souhaitiez que votre ViewController soit avertie lorsque le changement se produit, une option consiste à envoyer des notifications. Comme ça

Tout d'abord, ajoutez cette propriété/variable sur AppDelegate

// ObjC
@property (assign, nonatomic) CGRect currentStatusBarFrame;

// Swift
var currentStatusBarFrame: CGRect = .zero

alors, implémentez willChangeStatusBarFrame

// ObjC
- (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]}];

}

// Swift
func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect) {
    currentStatusBarFrame = newStatusBarFrame
    NotificationCenter.default.post(
        name: NSNotification.Name(rawValue: "Status Bar Frame Change"),
        object: self,
        userInfo: ["current status bar frame": newStatusBarFrame])
}

Et nous en avons terminé avec la base de notre Status Bar Frame Checker. La partie suivante que vous implémenterez sur toute variable ViewController ayant besoin de connaître le cadre de la barre d'état.

Chaque fois que vous souhaitez obtenir le cadre de la barre d'état, vous aimez

// ObjC
[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame]

// Swift
(UIApplication.shared.delegate as! AppDelegate).currentStatusBarFrame

Et pour être averti quand cela change, ajoutez ceci à la méthode ViewDidLoad.

En ObjC

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(statusBarFrameChanged:)
                                             name:@"Status Bar Frame Change"
                                           object:[[UIApplication sharedApplication] delegate]];

Et implémenter cette méthode

- (void) statusBarFrameChanged:(NSNotification*)notification
{
    CGRect newFrame = [[notification.userInfo objectForKey:@"current status bar frame"] CGRectValue];
    NSLog(@"new height %f", CGRectGetHeight(newFrame));
}

En rapide

    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "Status Bar Frame Change"),
                                           object: nil,
                                           queue: nil) { (note) in
                                            guard let currentStatusBarFrame = note.userInfo?["current status bar frame"] as? CGRect else {return}
                                            print("New Height", currentStatusBarFrame.height)
    }
31
Gonzo

Je crois que vous avez un problème de barre d’état qui vous fait voir le décalage vers le bas. Vous pouvez utiliser le code ci-dessous pour résoudre ce problème

Dans Swift

self.tabBarController?.tabBar.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue)))

Il a résolu mon problème causé par la barre d'état lorsque l'utilisateur est en appel. pour la référence Objective C cliquez ici

1
Sahil_Saini