UIImagePickerController가 상태 표시 줄 모양을 끊습니다.


137

.plist 파일에서 " View controller-based status bar appearance " 가로 설정되어 NO있습니다. 그러나 후에 UIImagePickerController는 옵션이로 설정된 것처럼 앱이 작동합니다 YES.

내 응용 프로그램에서을 나타내는 VC를 제시합니다 UIImagePickerController.

문제는 다음과 같이 발생합니다.

  • 사진 선택기가 표시된 후 사진 라이브러리를 선택하면 상태 표시 줄 텍스트의 색상이 변경됩니다.
  • 그런 다음 일단 UIImagePickerController닫히면 나머지 앱의 상태 표시 줄 간격이 변경되고 다른 컨트롤러의 모든 탐색 표시 줄이 상태 표시 줄 아래에 표시됩니다.

뷰 컨트롤러에서 상태 표시 줄을 관리하지 않고이를 해결할 수있는 방법이 있습니까?


필자의 경우 대답은 childviewcontrollers와 관련이 있습니다. 재사용하지 않고 다시 만들어야했습니다.
Alex L

7
이것은 실제로 iOS 7 버그처럼 보입니다 .Apple에 보고서를 제출 한 사람이 있습니까?
Dan F

stackoverflow.com/questions/21225978/… 간단한 솔루션과 비슷한 질문
Ting Wu

안녕하세요 @AlexL, 왜 그런지 아십니까?
Shabarinath Pabba

답변:


192

위의 솔루션 중 어느 것도 나를 위해 효과가 없었지만 Rich86man과 iOS_DEV_09의 답변을 결합하여 일관되게 작동하는 솔루션을 얻었습니다.

UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

이 멋진 솔루션과 관련하여. 2014 / iOS8의 경우 경우에 따라 포함 prefersStatusBarHidden하고 아마도 childViewControllerForStatusBarHidden...

-(void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated
    {
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }

-(BOOL)prefersStatusBarHidden   // iOS8 definitely needs this one. checked.
    {
    return YES;
    }

-(UIViewController *)childViewControllerForStatusBarHidden
    {
    return nil;
    }

-(void)showCamera
    {
    self.cameraController = [[UIImagePickerController alloc] init];
    self.cameraController.delegate = (id)self; // dpjanes solution!
    etc...

누군가에게 도움이되기를 바랍니다.


3
"UIImagePickerController는 내비게이션 컨트롤러의 한 유형이므로 UINavigationController 대리자로 설정하고 있습니다."
Beto

2
UIImaegPicker ..를 해제 한 후에는 어떻습니까? 상태 표시 줄 숨기기를 false로 설정하면 배경이 검은 색으로 바뀝니다.
Nitin Gohel

위의 질문에 따라 plist를 설정 했습니까?
dpjanes

UIImagePickerControllerSourceTypePhotoLibrary를 사용할 때 일부 앨범을 연 다음 약간 뒤로 이동하고 제스처를 취소 할 때 문제가 발생 했습니까?
Kukosk

3
상태 표시 줄이 매우 급격하게 들어오고 나오지만 작동합니다. Apple에 버그를 신고했습니다.
jjxtra

84

나는 오늘이 같은 문제에 직면했다. 여기 내 해결책이 있습니다.

이미지 선택기를 호출하는 뷰 컨트롤러에서 자신을 이미지 선택기의 대리자로 설정합니다. (아마도 이미하고 있습니다)

UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;

UIImagePickerController는 내비게이션 컨트롤러의 유형이므로 자신을 UINavigationController 대리자로 설정하고 있습니다. 그런 다음 :

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

UIStatusBarStyleLightContent를 원하는 스타일로 바꿉니다.


10

.plist 파일에서 '컨트롤러 기반 상태 표시 줄보기'를 NO로 설정 한 경우 허용되는 답변이 작동합니다. 실제로 다른 뷰 컨트롤러에서 상태 표시 줄을 제어 하고이 옵션을 YES로 설정 해야하는 경우 UIImagePickerController가 올바르게 작동하도록하는 다른 방법은 하위 클래스를 만드는 것입니다

// .h
@interface MYImagePickerController : UIImagePickerController
@end

// .m
@implementation MYImagePickerController
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent; // change this to match your style
}
@end

6

나는 같은 문제에 직면했다.

여기 내 해결책이 있습니다. 이것을 이미지 선택기 뷰를 여는 뷰 컨트롤러의 viewWillAppear에 넣습니다.

-(void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}

4

당신이 이것을 시도 할 수 있습니다. needsStatusBarApperanceUpdate가 작동한다고 생각합니다.

1 -Set UIViewControllerBasedStatusBarAppearance to NO.
2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3- [self setNeedsStatusBarAppearanceUpdate];

4

나는 이것이 적절한 취급을 제공한다는 것을 알았습니다. 두 부분이 있습니다.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
}


- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
...

UIImagePickerController 자체는 뷰 컨트롤러를 제공하므로이 대리자는 스택의 모든 발표자에게 작동합니다.

viewWillAppear는이 뷰 컨트롤러 자체가 항상 제시된 뷰 컨트롤러가 사라질 때마다 항상 재설정되도록합니다.



2

이것은 아마도 버그 일 것입니다. "뷰 컨트롤러 기반 상태 표시 줄 모양"을 YES로 설정하고 모든 뷰 컨트롤러에서 다음 코드를 붙여 넣어 문제를 해결했습니다.

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

그런 다음 내 앱이 예상대로 작동합니다.


2

UIImagePicker에서 상태 표시 줄을 숨기려면 :

-

 (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

UIImagePicker가 해제되어 View 컨트롤러에서 상태 표시 줄을 숨기면 다음 코드를 사용하십시오.

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

2

이 시도 ....

이것은 두 경우 모두에서 작동합니다. 즉 presentModalViewController와 pushViewController를 사용하는지 여부

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;

위임 방법

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:^{}];
}


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}

2

위의 모든 것이 나를 위해 작동하지 않았습니다. 프레젠테이션 스타일을 다음과 같이 변경하여 문제를 해결했습니다.

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;

2

위의 해결책 중 어느 것도 나를 위해 일하지 않았습니다.

UIImagePickerController를 모달 뷰 컨트롤러로 제시합니다. UIImagePickerController를 닫은 후 상태 표시 줄 상태는 다음과 같습니다.

[UIApplication sharedApplication].statusBarOrientation = 0 (UIDeviceOrientationUnknown)
[UIApplication sharedApplication].statusBarFrame = { 0, 0, 0, 0}

나를 위해 문제를 해결 한 솔루션은 UIImagePickerController를 닫은 후 statusBarOrientation을 복원하는 것입니다.

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
[self.viewController presentViewController:cameraUI animated:true completion:^(void){ }];

...

[self.viewController dismissViewControllerAnimated:animated completion:^(void){
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}];

2

이 코드는 상태 표시 줄 스타일을 사용자 정의하는 데 도움이되었습니다.

편집 :이 솔루션은 "컨트롤러 기반 상태 표시 줄보기"== 예인 경우 작동합니다.

@implementation UIImagePickerController (IOS7_StatusBarStyle)

-(UIViewController*)childViewControllerForStatusBarStyle
{
   return nil;
}

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

@end

2

위의 모든 대답은 괜찮으며 도움이 될 수 있습니다.

다른 iOS 버전 에서 실행되는 응용 프로그램을 관리해야하는 것과 동일한 문제가있었습니다 .

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

if(IS_IOS8_AND_UP) {
    imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
} else {
    imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
}

imagePickerController.delegate = self;
[self presentViewController:imagePickerController animated:YES completion:nil];

그런 다음 대리자에서 :

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    /* Cancel button color  */
    _imagePicker.navigationBar.tintColor = <custom_color>
    /* Status bar color */
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

2

일부 상황에서 작동 할 수있는 또 다른 솔루션입니다.

let imagePicker =  UIImagePickerController()
imagePicker.sourceType = .PhotoLibrary
imagePicker.navigationBar.barStyle = .Black

1

[self setNeedsStatusBarAppearanceUpdate]프리젠 테이션보기 컨트롤러가 다시 나타날 때 전화를 시도 했습니까 ?


그런 다음 아마 버그 - 나는 파일을 것 레이더 예제 프로젝트 및 상태 표시 줄 :( 관리하는 기존 시스템으로 폴백
재 밭고랑

1

iOS7의 UIImagePickerController에서 상태 표시 줄을 숨기려고하지만 여전히이 작업을 수행하는 방법을 모르겠습니다. 나는 사용한다

- (void)viewWillAppear:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationNone];
}

UIImagePickerController를 호출하는 ViewController에서 plist 파일에서 "View controller-based status bar appearance = NO"를 설정하십시오. 이것이 도움이되기를 바랍니다.


1

이 시도 :

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;

프로토콜 구현에서 다음을 사용하십시오.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

1

이것은 나를 위해 그것을 해결했습니다 ... :

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}

1

여기에 내가 가진 문제 (그리고 아마도 OP도 있었을 수도 있음)의 문제를 구체적으로 해결 한 것은 없으므로 내 대답을 공유 할 것이라고 생각했습니다. 버그가있는 솔루션이라고 생각하는 상태 표시 줄을 숨기는 대신 (때로는 상태 표시 줄이 숨겨져서는 안되는 상태로 앱을 남길 수 있음을 알았습니다). 대신에UIStatusBarStyles .

UIImagePickerController 에보 기가 표시되면 기본 배경 색상이 밝은 회색이므로 상태 표시 줄 스타일을 기본값으로 설정했습니다.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
}

그런 다음 이미지 선택기가 해제되면 다시로 설정했습니다 UIStatusBarStyleLightContent.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //work

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{ 
    //work

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    [self dismissViewControllerAnimated:YES completion:NULL];
}

1

이 경우 2 단계를 사용합니다

첫 번째 단계 : info.plist에 추가 : "NO"값을 가진 "컨트롤러 기반 상태 표시 줄 모양보기"

두 번째 단계 : UIImagePickerController의 대리자와 함께이 코드를 사용 / 호출

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
     if([navigationController isKindOfClass:[UIImagePickerController class]])
         [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
 }

IOS-7의 경우 하나 이상의 기능 추가

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

1

iOS 8.1부터는이 버그가 마침내 수정 된 것 같습니다! 코드에서 사용한 모든 해결 방법을 제거 할 수있었습니다.


1

기본 iOS 8 동작을 사용하여 상태 표시 줄을 숨기고 싶을 때 문제가 발생했습니다.

내가 찾은 해결책은 presentPopover뷰 컨트롤러에서 직접 호출 한 후 내가 한 것입니다.

    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil afterDelay:0.01];

또한 이것을 메인 뷰 컨트롤러에 추가해야했습니다.

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

1

그래서이 문제가 있었고 단순히 단일 대리자 기능을 구현하여 해결할 수있었습니다. 내 상태 표시 줄의 배경이 검은 색이므로 응용 프로그램의 UIStatusBarStyle은 .LightContent입니다. 장치 저장소에서 사진을 선택하기 위해 UIImagePickerController를 제시했을 때 상태 표시 줄에 문제가 없었습니다. 그러나 "카메라 롤"또는 "즐겨 찾기"와 같은 디렉토리를 클릭하면 효과적으로 탐색 스택을 밀면 상태 표시 줄이 사라집니다. 사진을 선택할 때 상태 표시 줄이 전혀 없었습니다. 다른 모달 뷰 컨트롤러를 닫을 때 배터리 만 있었으며 나머지 상태 표시 줄도 검은 색일 수 있습니다.

UIImagePickerController 확장과 같은 다른 솔루션을 시도했지만 Swift에서는 확장을 사용하여 재정의 할 수 없습니다. 그런 다음 UIImagePickerController의 서브 클래스를 작성하고 viewWillAppear ()에서 상태 표시 줄을 숨기고 viewWillDisappear에서 상태 표시 줄을 숨기려고했습니다. 슬라이드 애니메이션으로 상태 표시 줄 숨기기를 볼 수 있었지만 디렉토리를 선택할 때 상태 표시 줄이 보이지 않기 때문에 상태 표시 줄 숨기기가 해제되는 것을 볼 수 없었습니다. 다시, 녹색 배터리는 모달 뷰 컨트롤러를 닫을 때 보이지 않는 나머지 상태 표시 줄과 함께 돌아 왔습니다. 또한 prefersStatusBarHidden ()을 재정의하려고 시도했지만 해당 함수는 호출되지 않았으므로 시스템에서 prefersStatusBarHidden ()이 호출되도록 setNeedsStatusBarAppearanceUpdate ()를 호출하려고 시도했지만 여전히 호출되지 않았습니다. 또한, 델리게이트 메소드 navigationController willShowViewController에서 상태 표시 줄을 숨기도록 제안합니다. 다시 한 번,이 모든 것은 상태 표시 줄을 숨기고 문제를 해결하지 못합니다. 결과적으로 UIImagePickerController의 탐색 스택을 푸시하면 상태 표시 줄 스타일이 변경되는 것으로 보입니다. 문제를 완전히 해결하기 위해 확장 또는 하위 클래스 UIImagePickerController를 작성할 필요가 없었습니다. 델리게이트를 설정하고 상태 표시 줄 스타일을 동일하게 유지하기 만하면됩니다. 이 추가는 문제가 존재하지 않는 것처럼 만들었습니다. UIImagePickerController의 탐색 스택으로 푸시하면 상태 표시 줄 스타일이 변경되는 것 같습니다. 문제를 완전히 해결하기 위해 확장 또는 하위 클래스 UIImagePickerController를 작성할 필요가 없었습니다. 델리게이트를 설정하고 상태 표시 줄 스타일을 동일하게 유지하기 만하면됩니다. 이 추가는 문제가 존재하지 않는 것처럼 만들었습니다. UIImagePickerController의 탐색 스택으로 푸시하면 상태 표시 줄 스타일이 변경되는 것 같습니다. 문제를 완전히 해결하기 위해 확장 또는 하위 클래스 UIImagePickerController를 작성할 필요가 없었습니다. 델리게이트를 설정하고 상태 표시 줄 스타일을 동일하게 유지하기 만하면됩니다. 이 추가는 문제가 존재하지 않는 것처럼 만들었습니다.

let pickerController = UIImagePickerController()
pickerController.delegate = self

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false)
    }

-1

실제로 Image Picker에서 상태 표시 줄 배경색을 설정하는 더 좋은 방법을 찾았습니다. 기본적으로 Image Picker의 기본값에는 backgroundImage가 흰색 이미지이기 때문에 navigationBar에서 backgroundImage를 nil로 설정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.