Je suis nouveau dans le développement iOS. J'essaie de masquer la barre d'état dans UIImagePickerController
. Chaque fois que je clique sur "Prendre une photo", la barre d'état apparaît. Ça ne se cache pas. Je souhaite que la barre d'état soit masquée uniquement dans UIImagePickerController
.
Voici mon code,
- (IBAction)takePhoto:(UIButton *)sender
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:picker animated:YES completion:NULL];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self statusBar:YES];
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imageView.image = chosenImage;
[picker dismissViewControllerAnimated:YES completion:NULL];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:NULL];
}
-(void)statusBar:(BOOL)status
{
[[UIApplication sharedApplication] setStatusBarHidden:status];
}
Comment masquer la barre d'état sur UIImagePickerController
?
J'ai eu un problème où dans iOS7 ma barre d'état n'était pas cachée. Je l'ai caché par programme et il s'affiche toujours dans iOS7, mais lorsqu'il est exécuté dans iOS6, la barre d'état se cache correctement. Vous devez aller dans le plist et ajouter ce qui suit:
'afficher l'apparence de la barre d'état basée sur le contrôleur' et régler sur NON.
Si vous souhaitez que la barre d'état réapparaisse dans d'autres contrôleurs de vue et ne soit masquée que sur un VC particulier, vous définissez la barre d'état sur OUI masqué lorsque VC se charge. Lorsque VC disparaît, vous remettez la barre d'état masquée sur NO.
- (void)viewDidLoad
{
[super viewDidLoad];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
et lorsque le contrôleur disparaît, vous ajoutez ce qui suit pour définir la barre d'état afin qu'elle ne soit plus masquée et s'affiche sur la vue suivante:
-(void)viewWillDisappear:(BOOL)animated{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
setStatusBarHidden:withAnimation:
Si vous voulez une animation fluide
CA marchait bien pour moi:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
Edit: À partir d'aujourd'hui, je viens de découvrir que dans votre info.plist, si vous copiez-collez simplement l'apparence de la barre d'état basée sur le contrôleur, cela ne fonctionnera pas ... vous devez appuyer sur Entrée sur une propriété et faire défiler jusqu'à le dernier d'entre eux, vous aurez donc la saisie semi-automatique pour: afficher l'apparence de la barre d'état basée sur le contrôleur et un booléen, sans. J'ai essayé plusieurs fois mais cela ne fonctionne pas simplement en copiant. Bonne journée.
La solution que j'ai trouvée pour les applications se construit autour de: "Afficher l'apparence de la barre d'état basée sur le contrôleur" définie sur OUI
J'ai ajouté une catégorie:
//UIImagePickerController+StatusBarHidden.h
#import <UIKit/UIKit.h>
@interface UIImagePickerController (StatusBarHidden)
@end
//UIImagePickerController+StatusBarHidden.h
#import "UIImagePickerController+StatusBarHidden.h"
@implementation UIImagePickerController (StatusBarHidden)
-(BOOL) prefersStatusBarHidden {
return YES;
}
-(UIViewController *) childViewControllerForStatusBarHidden {
return nil;
}
@end
La méthode childViewControllerForStatusBarHidden est rarement utilisée, mais le sélecteur d'images l'utilise, c'est pourquoi cela pourrait causer des problèmes
Vous pouvez également implémenter UIViewController singleton, avec une méthode qui renvoie OUI ou NON, en fonction de sa propriété. Ensuite, votre contrôleur de vue implémente childViewControllerForStatusBarHidden renvoyant le singleton ci-dessus. La modification de la propriété singleton change automatiquement la barre d'état dans l'application. Il existe également une méthode double childViewControllerForStatusBarStyle
Cependant pour 2014, iOS8, voyez ceci https://stackoverflow.com/a/18960308/294884
sous-classe UIImagePickerController ... le mien est V1ImagePickerController ...
Le fichier .m ressemble à ceci:
#import "V1ImagePickerController.h"
@interface V1ImagePickerController ()
@end
@implementation V1ImagePickerController
- (void)viewDidLoad
{
[super viewDidLoad];
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) // iOS7+ only
{
self.edgesForExtendedLayout = UIRectEdgeNone;
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (UIViewController *)childViewControllerForStatusBarHidden
{
return nil;
}
@end
childViewControllerForStatusBarHidden est la clé!
Si vous souhaitez désactiver la barre d'état de plist, essayez ceci:
cela est nécessaire pour iOS 7, fonctionne pour moi. Je ne sais pas s'il existe d'autres techniques pour le faire dans iOS7. Définissez ces deux balises dans votre info.plist.
Chaque fois que votre viewcontroller apparaît, dans viewDidLoad ou lorsque le contrôleur du sélecteur d'images se termine, utilisez ceci:
- (void) imagePickerController:(UIImagePickerController *)picker1 didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
.
.
.
.
}
J'ai utilisé la réponse de Silvertaurus ci-dessus, mais avec une petite modification de la méthode prefersStatusBarHidden
qui m'a semblé très utile:
//UIImagePickerController+StatusBarHidden.h
#import <UIKit/UIKit.h>
@interface UIImagePickerController (StatusBarHidden)
@end
//UIImagePickerController+StatusBarHidden.h
#import "UIImagePickerController+StatusBarHidden.h"
@implementation UIImagePickerController (StatusBarHidden)
-(BOOL) prefersStatusBarHidden {
if (self.sourceType==UIImagePickerControllerSourceTypeCamera) {
return YES;
} else {
return NO;
}
}
-(UIViewController *) childViewControllerForStatusBarHidden {
return nil;
}
@end
Cela maintient la barre d'état pour le sélecteur d'image lorsque la caméra n'est pas affichée.
Essaye ça
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
Vérifiez également cela discussion .
Veuillez essayer ceci.
• Définition d'un délégué pour le UIImagePickerController
• masquer la barre d'état dans la navigation du déléguéController: didShowViewController: animated: fonction.
PAR EXEMPLE:
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
Vous pouvez le faire avec une catégorie:
@interface UIImagePickerController (HideStatusBar)
@end
@implementation UIImagePickerController (HideStatusBar)
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (UIViewController *)childViewControllerForStatusBarHidden
{
return nil;
}
@end
Essayez ma réponse publiée ici si vous souhaitez continuer à utiliser ViewController-Based Status Bar Appearance
.
Dans mon cas, j'ai dû utiliser presentViewController pour afficher UIImagePickerViewController (iOS7).
1- Définissez l'apparence de la barre d'état basée sur le contrôleur View sur NO dans .plist 2- Créez une catégorie pour UIImagePickerController et dans viewDidLayoutSubviews:
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
3- Ajout des deux méthodes suivantes à la catégorie:
- (BOOL)prefersStatusBarHidden{
return YES;
}
- (UIViewController *)childViewControllerForStatusBarHidden{
return nil;
}
J'espère que cela vous aidera.
-(IBAction)takePhoto:(UIButton *)sender
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self statusBar:TRUE];
[self presentViewController:picker animated:YES completion:NULL];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imageView.image = chosenImage;
[self statusBar:FALSE];
[picker dismissViewControllerAnimated:YES completion:NULL];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self statusBar:FALSE];
[picker dismissViewControllerAnimated:YES completion:NULL];
}
-(void)statusBar:(BOOL)status
{
[[UIApplication sharedApplication] setStatusBarHidden:status];
}
cela pourrait vous aider à réaliser ce que vous voulez.
Je voulais que la barre d'état soit cachée tout le temps, l'ouverture du sélecteur d'images le montre. Pour le masquer à nouveau, ce qui suit a fonctionné pour moi à partir d'iOS 8:
-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:^{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self dismissViewControllerAnimated:YES completion:^{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}];
// do stuff with photo
}
J'ai View controller-based status bar appearance
défini sur NO
je pense que j'ai résolu cela d'une manière assez simple sans sous-classer et utiliser plist. il ne se cache que pour UIImagePickerController.
cet exemple sert uniquement à afficher la galerie de photos, mais j'imagine que vous pouvez l'appliquer de la même manière n'importe où avec dans uiimagepickercontroller
- (void)showGallary
{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}];
imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[CATransaction commit];
}