Как скрыть строку состояния в 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
?
14 ответов
У меня была проблема, когда в iOS7 моя строка состояния не скрывалась. Я скрыл это программно, и он все еще отображался в iOS7, но при запуске в iOS6 строка состояния скрывалась соответствующим образом. Вы должны перейти к списку и добавить следующее:
'просмотреть внешний вид строки состояния на основе контроллера' и установить значение NO.
Если вы хотите, чтобы строка состояния снова появлялась в других контроллерах представления и была скрыта только в определенном VC, тогда вы устанавливаете строку состояния на скрытое YES при загрузке VC. Когда VC исчезнет, вы установите скрытую строку состояния обратно в NO.
- (void)viewDidLoad
{
[super viewDidLoad];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
и когда контроллер исчезнет, вы добавите следующее, чтобы установить строку состояния, чтобы она больше не скрывалась и будет отображаться в следующем представлении:
-(void)viewWillDisappear:(BOOL)animated{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
setStatusBarHidden:withAnimation:
если вы хотите плавную анимацию
Это работало нормально для меня:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
Изменить: На сегодняшний день я только что обнаружил, что в вашем info.plist, если вы просто скопировать и вставить вид строки состояния на основе контроллера там не будет работать... вам нужно нажать Enter на свойстве, и прокрутите до последний из них, так что у вас будет автозаполнение для: просмотра внешнего вида строки состояния на основе контроллера и логического значения, без. Я пытался несколько раз, но это не работает только копирование. Хорошего дня.
Решение, которое я нашел для приложений, основано на: "Просмотр внешнего вида строки состояния на основе контроллера", установленной на ДА
Я добавил категорию:
//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, основываясь на его свойстве. Затем ваш контроллер View реализует childViewControllerForStatusBarHidden, возвращая вышеуказанный синглтон. Изменение одноэлементного свойства автоматически меняет статусбар в приложении. Там также есть метод-близнец childViewControllerForStatusBarStyle
Однако для 2014 года, iOS8, см. Этот /questions/24014225/uiimagepickercontroller-lomaet-vneshnij-vid-stroki-sostoyaniya/24014229#24014229
Подкласс UIImagePickerController ... мой 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 является ключом!
Если вы хотите отключить строку состояния в plist, попробуйте это:
- Строка состояния изначально скрыта: ДА
- Просмотреть внешний вид строки состояния на основе контроллера: НЕТ
это необходимо для iOS 7, у меня работает. Я не знаю, есть ли другие методы для этого в iOS7. Установите эти два тега в вашем info.plist.
Каждый раз, когда ваш viewcontroller появляется, в viewDidLoad или когда завершает работу контроллер выбора изображений, используйте это:
- (void) imagePickerController:(UIImagePickerController *)picker1 didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
.
.
.
.
}
Я использовал ответ 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
Это сохраняет строку состояния для средства выбора изображений, когда камера не отображается.
Пожалуйста, попробуйте это.
• Назначение делегата для UIImagePickerController
• скрыть строку состояния в навигационном контроллере делегата:didShowViewController:animated: function.
НАПРИМЕР:
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
Вы можете сделать это с категорией:
@interface UIImagePickerController (HideStatusBar)
@end
@implementation UIImagePickerController (HideStatusBar)
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (UIViewController *)childViewControllerForStatusBarHidden
{
return nil;
}
@end
Источник: https://gist.github.com/psobko/9493473
Попробуй это
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
Также проверьте это обсуждение.
Я хотел все время скрывать строку состояния, открывая окно выбора изображений. Чтобы скрыть это снова, у меня работало с 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
Попробуйте мой ответ, опубликованный здесь, если вы хотите продолжать использовать ViewController-Based Status Bar Appearance
,
-(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];
}
это может помочь вам достичь того, что вы хотите.
В моем случае мне пришлось использовать 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;
}
Я надеюсь, это поможет.
Я думаю, что я решил это довольно простым способом без подклассов и использования plist. он скрывается только для UIImagePickerController.
этот пример предназначен только для вызова фотогалереи, но я думаю, что вы можете применить его таким же образом в любом месте с помощью uiimagepickercontroller
- (void)showGallary
{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}];
imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[CATransaction commit];
}