[iphone] UIStatusBarStyle PreferredStatusBarStyle은 iOS 7에서 작동하지 않습니다.

아이폰 OS 7 I 세트의 엑스 코드 5와 내장 내 아이폰 응용 프로그램에서 UIViewControllerBasedStatusBarAppearance=YES에서 info.plist, 그리고 내에서 ViewController이 코드를 가지고 :

-(UIStatusBarStyle) preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

그러나 상태 표시 줄은 검은 색 배경에 대해 여전히 검은 색입니다.

UIViewControllerBasedStatusBarAppearance=NO에서 설정하여이 앱 전체를 변경할 수 있다는 것을 알고 info.plist있지만 실제로 런타임 viewControllerviewController이를 기준으로 변경해야 합니다.



답변

ViewController가 navigationController 안에 있으면 navigationController가 navigationBar.barStylestatusBarStyle을 결정 한다는 것을 발견했습니다 .

당신의 내비게이션 바의 설정 barStyle하려면 UIBarStyleBlackTranslucent(예. 흰색 상태 표시 줄의 텍스트를 줄 것이다 UIStatusBarStyleLightContent), 그리고 UIBarStyleDefault검은 상태 표시 줄의 텍스트를 줄 것이다 (예. UIStatusBarStyleDefault).

참고 이것은 당신이 완전히의를 통해 내비게이션 바의 색상을 변경하는 경우에도 적용 barTintColor.


답변

좋아요, 여기에 트릭이 있습니다. “컨트롤러 기반 상태 표시 줄보기”키를 추가하고 값을 아니요로 설정해야합니다.

이것은이 키의 의미와 반대이지만 값을로 설정하더라도 No상태 표시 줄의 모양과보기 컨트롤러에 표시되는지 여부를 변경할 수 있습니다. 따라서 “예”처럼 작동하지만 “아니오”로 설정합니다!

이제 상태 표시 줄을 흰색 또는 어둡게 표시 할 수 있습니다.


답변

들어 preferredStatusBarStyle()내에서 작동하도록 UINavigationController하고 UITabBarController나는 현재 보이는 뷰 컨트롤러에서 선호하는 상태 표시 줄 스타일을 얻을 것이다 다음 코드를 추가합니다.

extension UITabBarController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return visibleViewController
    }
}

들어 스위프트 3 사람들은 방법이 있지만, 속성은 없습니다 :

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

스위프트 4.2 속성은 이름이 변경되었습니다 :

extension UITabBarController {
   open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
   open override var childForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

용법

class ViewController: UIViewController {

    // This will be called every time the ViewController appears
    // Works great for pushing & popping
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}


답변

나는 이것에 조금 늦게 올 수 있지만 다른 누군가가 작동하고 검증 된 앱 전체 솔루션을 찾고있는 경우를 대비하십시오.

@mxcl은 이것이 왜 발생하는지 설명하는 데 정확합니다. 이를 수정하기 위해 UINavigationController의 preferredSatusBarStyle () 메서드를 재정의하는 확장 (또는 obj-c의 범주)을 만듭니다. 다음은 Swift의 예입니다.

extension UINavigationController {
    public override func preferredStatusBarStyle() -> UIStatusBarStyle {
        if let rootViewController = self.viewControllers.first {
            return rootViewController.preferredStatusBarStyle()
        }
        return super.preferredStatusBarStyle()
    }
}

이 코드는 단순히 첫 번째 뷰 컨트롤러 (루트 뷰 컨트롤러)를 추출하고 래핑을 해제합니다 (obj-c에서 nil이 아닌지 확인). unwrap이 성공하면 (nil이 아님) rootViewControllers preferredStatusBarStyle을 가져옵니다. 그렇지 않으면 기본값을 반환합니다.

이것이 필요한 사람에게 도움이되기를 바랍니다.


답변

허용되는 답변에 대한 자세한 내용을 제공하려면 앱 델리게이트의 didFinishLaunchingWithOptions:메서드 에 다음 줄을 입력하세요 .

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

그런 다음 Info.plist에서 추가 View controller-based status bar appearance하고 NO.

전체 앱에 대해 동일한 상태 표시 줄 색상을 원하면 탐색 컨트롤러가 아닌 그렇게해야한다고 생각합니다. 에 반드시 포함되지 않은 화면 UINavigationController이나 다른 UINavigationController하위 클래스 및 기타 항목이있을 수 있습니다.

편집 : 코드를 입력하지 않고도 할 수 있습니다 : https://stackoverflow.com/a/18732865/855680


답변

viewDidLoad에서 이것을 작성하십시오.

[self setNeedsStatusBarAppearanceUpdate];

그냥 그렇게하면 작동합니다

이거 먹어봐

Set UIViewControllerBasedStatusBarAppearance to NO.
Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

당신이 이와 같은 방법을 썼다는 당신의 질문에서 내가 본 또 하나

 -(void)UIStatusBarStyle PreferredStatusBarStyle ()
        {
            return UIStatusBarStyle.LightContent;
        }

근데 이럴거야

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
} 


답변

여기에 내가 해결 한 방법이 있습니다. 일반적으로 navigationController 또는 tabBarController는 상태 표시 줄의 모양 (숨김, 색상 등)을 결정합니다.

그래서 결국 네비게이션 컨트롤러를 서브 클래 싱하고 preferredStatusBarStyle을 재정의했습니다. 현재 보이는 ViewContorller가 StatusBarStyleHandler를 구현하면 스타일로 사용할 값을 요청합니다. 그렇지 않으면 기본값을 반환합니다.

상태 표시 줄 모양의 업데이트를 트리거하는 방법은 메서드가 반환하는 내용에 따라 다시 setNeedsStatusBarAppearanceUpdate트리거 preferredStatusBarStyle하고 UI를 업데이트 하는 호출 을 호출 하는 것입니다.

public protocol StatusBarStyleHandler {
    var preferredStatusBarStyle: UIStatusBarStyle { get }
}

public class CustomNavigationCotnroller: UINavigationController {

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        if let statusBarHandler = visibleViewController as? StatusBarStyleHandler {
            return statusBarHandler.preferredStatusBarStyle
        }

        return .default
    }
}

그런 다음 사용법

public class SomeController: UIViewController, StatusBarStyleHandler {

    private var statusBarToggle = true

    // just a sample for toggling the status bar style each time method is called
    private func toggleStatusBarColor() {
        statusBarToggle = !statusBarToggle
        setNeedsStatusBarAppearanceUpdate()
    }

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarToggle ? .lightContent : .default
    }
}