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?
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)
}
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