[ios] preferredStatusBarStyle이 호출되지 않았습니다.

나는 다음에 이 스레드 오버라이드 (override)를 -preferredStatusBarStyle있지만 호출되지 않습니다. 활성화하기 위해 변경할 수있는 옵션이 있습니까? (프로젝트에서 XIB를 사용하고 있습니다.)



답변

가능한 근본 원인

나는 같은 문제가 있었고 응용 프로그램 창에서 루트보기 컨트롤러를 설정하지 않았기 때문에 문제가 발생했다는 것을 알았습니다.

UIViewController내가 구현했다있는이 preferredStatusBarStyleA의 사용 UITabBarController화면에 표시되는 뷰의 모양을 제어하는.

루트보기 컨트롤러가 this를 가리 키도록 설정하면 UITabBarController상태 표시 줄 변경이 예상대로 올바르게 작동하기 시작했습니다 ( preferredStatusBarStyle메소드가 호출되었습니다).

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ... // other view controller loading/setup code

    self.window.rootViewController = rootTabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

대체 방법 (iOS 9에서 더 이상 사용되지 않음)

또는 사용하지 않고 배경색에 따라 각 뷰 컨트롤러에서 다음 방법 중 하나를 적절하게 호출 할 수 있습니다 setNeedsStatusBarAppearanceUpdate.

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

또는

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

당신은 또한 설정해야합니다 것을 참고 UIViewControllerBasedStatusBarAppearanceNO이 방법을 사용하는 경우 PLIST 파일에.


답변

UINavigationController를 사용하는 사람 :

UINavigationController에 전달하지 않는 preferredStatusBarStyle자식보기 컨트롤러 호출. 대신 자체 상태를 관리합니다. 상태 표시 줄이있는 화면의 맨 위에 표시되므로 책임을 져야합니다. 따라서 preferredStatusBarStyle내비게이션 컨트롤러 내에서 VC를 구현할 때는 아무 것도하지 않으며 호출되지 않습니다.

트릭은 또는에 UINavigationController대해 무엇을 반환할지 결정 하는 데 사용됩니다 . 이것에 기초합니다 . 기본값 ( )은 어두운 전경 상태 표시 줄이됩니다. 그리고 상태 표시 줄 을 제공 합니다.UIStatusBarStyleDefaultUIStatusBarStyleLightContentUINavigationBar.barStyleUIBarStyleDefaultUIStatusBarStyleDefaultUIBarStyleBlackUIStatusBarStyleLightContent

TL; DR :

당신이 원하는 경우, UIStatusBarStyleLightContentA의 UINavigationController사용 :

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;


답변

그래서 실제로 UINavigationController에 카테고리를 추가했지만 메소드를 사용했습니다.

-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;

그리고 현재 보이는 UIViewController를 반환하도록했습니다. 이를 통해 현재 보이는 뷰 컨트롤러가 선호하는 스타일 / 가시성을 설정할 수 있습니다.

여기에 대한 전체 코드 스 니펫이 있습니다.

스위프트에서 :

extension UINavigationController {

    public override func childViewControllerForStatusBarHidden() -> UIViewController? {
        return self.topViewController
    }

    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return self.topViewController
    }
}

Objective-C에서 :

@interface UINavigationController (StatusBarStyle)

@end

@implementation UINavigationController (StatusBarStyle)

-(UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return self.topViewController;
}

@end

그리고 좋은 측정을 위해 UIViewController에서 구현하는 방법은 다음과 같습니다.

스위프트에서

override public func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

override func prefersStatusBarHidden() -> Bool {
    return false
}

Objective-C에서

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent; // your own style
}

- (BOOL)prefersStatusBarHidden {
    return NO; // your own visibility code
}

마지막으로, 확인하십시오 앱을 plist는 않습니다 NOT NO에 “보기 컨트롤러 기반 상태 표시 줄 모양”세트가 있습니다. 해당 줄을 삭제하거나 YES로 설정하십시오 (iOS 7의 현재 기본값이라고 생각합니까?)


답변

여전히이 문제로 어려움을 겪고있는 사람들에게는이 간단한 확장 기능이 문제를 해결해야합니다.

extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
}


답변

내 응용 프로그램은 세 가지 사용 : UINavigationController, UISplitViewController, UITabBarController,, 따라서 이러한 모든 상태 표시 줄을 통해 제어 할 것 같고 원인이됩니다 preferedStatusBarStyle자신의 아이들을 위해 호출 할 수 없습니다 수 있습니다. 이 동작을 무시하려면 나머지 답변에서 언급 한 것처럼 확장을 만들 수 있습니다. 다음은 Swift 4의 세 가지 기능 모두에 대한 확장 기능입니다.

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.childViewControllers.first
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.childViewControllers.first
    }
}

extension UISplitViewController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.childViewControllers.first
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.childViewControllers.first
    }
}

편집 : Swift 4.2 API 변경 사항 업데이트

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.children.first
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.children.first
    }
}

extension UISplitViewController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.children.first
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.children.first
    }
}


답변

Tyson의 답변은에서 상태 표시 줄 색상을 흰색으로 변경하기에 적합 UINavigationController합니다.

누구나 코드를 작성하여 동일한 결과를 얻으려면 AppDelegate아래 코드를 사용하고 AppDelegate's didFinishLaunchingWithOptions메소드 안에 작성하십시오 .

그리고 .plist 파일에서 를 설정하는 UIViewControllerBasedStatusBarAppearance것을 잊지 마십시오 YES. 그렇지 않으면 변경 사항이 반영되지 않습니다.

암호

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     // status bar appearance code
     [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

     return YES;
}


답변

UINavigationController에서이 ( preferredStatusBarStyletopViewController) 선호 되므로 호출되지 않습니다 self. 따라서 preferredStatusBarStyleUINavigationController에서 호출하려면을 변경해야합니다 childViewControllerForStatusBarStyle.

추천

클래스에서 UINavigationController를 재정의하십시오.

class MyRootNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

비 권장 대안

모든 UINavigationController에 대해이를 수행하려면 확장에서 재정의 (경고 : UIDocumentPickerViewController, UIImagePickerController 등에 영향을 미침) 할 수 있지만 Swift 설명서에 따라 수행하지 않아야합니다 .

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}