Как скрыть строку состояния в UIImagepickercontroller?
Я новичок в разработке iOS. Я пытаюсь скрыть строку состояния в UIImagePickerController
. Когда я нажимаю "Сфотографировать", появляется строка состояния. Он не скрывает. Я хочу, чтобы строка состояния была скрыта только в UIImagePickerController
.
Вот мой код,
- (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];
}
Как скрыть строку состояния на UIImagePickerController
?
Ответы
Ответ 1
У меня была проблема, когда в iOS7 моя строка состояния не скрывалась. Я спрятал его программно, и он все еще отображается в iOS7, но при запуске в iOS6 строка состояния скроется соответствующим образом. Вы должны пойти в plist и добавить следующее:
'просмотреть внешний вид строки состояния на основе контроллера и установить значение NO.
Если вы хотите, чтобы строка состояния снова отображалась в других контроллерах представлений и была скрыта только на конкретном VC, тогда вы устанавливаете строку состояния скрытой YES при загрузке VC.
Когда VC исчезнет, вы установите, что строка состояния скрыта до NO.
- (void)viewDidLoad
{
[super viewDidLoad];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
и когда контроллер исчезнет, вы добавите следующее, чтобы установить строку состояния, чтобы она больше не скрывалась и отображалась на следующем представлении:
-(void)viewWillDisappear:(BOOL)animated{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
setStatusBarHidden:withAnimation:
, если вам нужна гладкая анимация
Ответ 2
Это работало отлично для меня:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
Изменить: На сегодняшний день я только что узнал, что в вашем info.plist, если вы просто скопируете-вставьте вид на панели управления на основе контроллера, там это не сработает... вам нужно нажать enter на свойство, и прокрутите до последней из них, чтобы у вас была автозаполнение: просмотр состояния панели управления на основе контроллера и логическое, без. Я много раз пробовал, но он просто не копировал. Приятного дня.
Ответ 3
Решение, которое я нашел для приложений:
"Просмотр состояния строки состояния на основе контроллера" установлен на YES
Я добавил категорию:
//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
Метод childViewControllerForStatusBarHidden используется редко, но выборщик изображений использует его, вот почему могут возникнуть некоторые проблемы
Вы также можете реализовать синглтон UIViewController с методом, который возвращает YES или NO, в зависимости от его свойства.
Затем ваш просмотр controleller реализует childViewControllerForStatusBarHidden, возвращая вышеописанный синглтон.
Изменение свойства singleton автоматически изменяет строку состояния в приложении. Существует также двойной метод childViewControllerForStatusBarStyle
Однако для 2014 года iOS8 см. это fooobar.com/questions/44120/...
Ответ 4
подкласс UIImagePickerController... mine - это V1ImagePickerController...
.m файл выглядит следующим образом:
#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 - это ключ!
Ответ 5
Если вы хотите отключить строку состояния от plist, попробуйте следующее:
- Строка состояния изначально скрыта: YES
- Просмотр состояния панели состояния контроллера: НЕТ
это необходимо для iOS 7, работает для меня. Я не знаю, есть ли другие методы для этого в iOS7. Установите эти два тега в свой info.plist.
Каждый раз, когда появляется ваш viewcontroller, в viewDidLoad или когда контроллер выбора изображения заканчивается, используйте это:
- (void) imagePickerController:(UIImagePickerController *)picker1 didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
.
.
.
.
}
Ответ 6
Я использовал Silvertaurus выше, но с небольшой модификацией метода prefersStatusBarHidden
, который я считал очень полезным:
//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
Это удерживает строку состояния для устройства выбора изображения, когда камера не отображается.
Ответ 7
Попробуйте это
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
Также проверьте этот обсуждение.
Ответ 8
Вы можете сделать это с помощью категории:
@interface UIImagePickerController (HideStatusBar)
@end
@implementation UIImagePickerController (HideStatusBar)
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (UIViewController *)childViewControllerForStatusBarHidden
{
return nil;
}
@end
Источник: https://gist.github.com/psobko/9493473
Ответ 9
-(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];
}
что может помочь вам достичь того, чего вы хотите.
Ответ 10
Пожалуйста, попробуйте это.
• Установка делегата для UIImagePickerController
• скрыть строку статуса в делегате
navigationController: didShowViewController: анимированная: функция.
например:
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
Ответ 11
Попробуйте мой ответ, размещенный здесь, если вы хотите продолжать использовать ViewController-Based Status Bar Appearance
.
Ответ 12
В моем случае мне пришлось использовать presentViewController для отображения UIImagePickerViewController (iOS7).
1- Установить вид строки состояния на основе контроллера на NO в .plist
2- Создайте категорию для UIImagePickerController и в viewDidLayoutSubviews:
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
3 Добавили в категорию следующие два метода:
- (BOOL)prefersStatusBarHidden{
return YES;
}
- (UIViewController *)childViewControllerForStatusBarHidden{
return nil;
}
Надеюсь, это поможет.
Ответ 13
Я думаю, что я решил это довольно простым способом без подкласса и использования plist.
он скрывается только для UIImagePickerController.
Этот пример предназначен только для воссоздания фотогалереи, но я думаю, вы можете применить его таким же образом в любом месте с помощью uiimagepickercontroller
- (void)showGallary
{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}];
imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[CATransaction commit];
}
Ответ 14
Я хотел, чтобы строка состояния была скрыта все время, открыв ее, отобразите ее. Чтобы скрыть его снова, работала для меня как с 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
}
У меня View controller-based status bar appearance
установлено значение NO