ios - significado - registro llamadas icloud
Detectando si el usuario tiene en la barra de estado de llamadas. (2)
¿Cómo detecto si el usuario está en llamada o atado? Tengo una subvista para iAd así:
_UIiAD = [[self appdelegate] UIiAD];
_UIiAD.delegate = self;
[_UIiAD setFrame:CGRectMake(0,470,320,50)];
[self.view addSubview:_UIiAD];/
¿Y se equivoca cuando el usuario está en llamada? ¿Cómo detecto esto?
Creo que tienes un problema en la barra de estado que te hace ver el desplazamiento hacia abajo. Puedes usar el código de abajo para resolver eso
En veloz
self.tabBarController?.tabBar.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue)))
Solucionó mi problema causado por la barra de estado cuando el usuario está en una llamada. para referencia del objetivo C haga clic aquí
UIApplicationDelegate
tiene estos dos métodos.
// 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)
Y hay Notifications
también.
//ObjC
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification
// Swift
Notification.Name.UIApplicationWillChangeStatusBarFrame
Notification.Name.UIApplicationDidChangeStatusBarFrame
pero no se publicaron en el lanzamiento de la aplicación, así que no lo recomendaría.
El simulador tiene una herramienta útil para probar eso.
Hardware-> Alternar barra de estado durante la llamada (Y)
Le sugiero que implemente esos métodos en su archivo AppDelegate
. Se llamarán cuando la barra de estado cambie su altura. Uno de ellos se llama antes y el otro después del cambio.
Suponiendo que desea que su ViewController
sea notificado cuando ocurra el cambio, una opción es enviar notificaciones. Me gusta esto
Primero, agregue esta propiedad / variable en AppDelegate
// ObjC
@property (assign, nonatomic) CGRect currentStatusBarFrame;
// Swift
var currentStatusBarFrame: CGRect = .zero
entonces, implementa 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])
}
Y hemos terminado con la base de nuestro Status Bar Frame Checker
. La siguiente parte que implementa en cualquier ViewController
que necesite conocer el marco de la barra de estado.
Cuando quieras obtener el marco de la barra de estado, te gusta
// ObjC
[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame]
// Swift
(UIApplication.shared.delegate as! AppDelegate).currentStatusBarFrame
Y para recibir una notificación cuando cambie, agregue esto al método ViewDidLoad
.
En objc
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameChanged:)
name:@"Status Bar Frame Change"
object:[[UIApplication sharedApplication] delegate]];
Y poner en práctica este método.
- (void) statusBarFrameChanged:(NSNotification*)notification
{
CGRect newFrame = [[notification.userInfo objectForKey:@"current status bar frame"] CGRectValue];
NSLog(@"new height %f", CGRectGetHeight(newFrame));
}
En Swift
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)
}