Swift iOS 앱에서 상태 표시 줄을 숨기려면 어떻게합니까?


201

화면 상단의 상태 표시 줄을 제거하고 싶습니다.

작동하지 않습니다.

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

나는 또한 시도했다 :

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}

답변:


449

뷰 컨트롤러에서 prefersStatusBarHidden을 구현해야합니다.

스위프트 3 이상

override var prefersStatusBarHidden: Bool {
    return true
}

4
Jay의 의도는 완전한 앱을 위해 상태 표시 줄을 숨기는 것입니다. 그래서 그는 애플리케이션의 didFinishLaunchingWithOptions에 숨기기 기능을 작성했을 것입니다. 완전한 앱을 위해 상태 표시 줄을 숨기는 방법?
— 사티 암

@Satyam은 좋은 지적을 가지고 있으며 전체 응용 프로그램에서 이것을 제거하는 것이 좋습니다. 상속을 통해 이것을 구현하는 접근법이 있습니까? 아니면 프로토콜 확장을 통해?
— Dan Beaulieu

3
@ DanBeaulieu 상속을 통해 훌륭한 솔루션이 될 것이라고 생각합니다. bar hidden이 true로 설정된 UIViewController 서브 클래스를 작성하고 모든 서브 클래스가 해당 서브 클래스를 상속 받도록하십시오. 또 다른 접근법은 Swizzling을
— 위기

1
스위프트 3 코드가 작동하지 않았습니다. stackoverflow.com/a/38902285/129202
— Jonny

1
이 방법에는 오류가 있습니다. segue를 수행하려는 경우 현재 viewcontroller의 상위 뷰가 약
— 20px로 떨어집니다.

99
  1. Info.plist 파일로 이동
  2. 해당 라인 중 하나에 마우스를 대면 [+) 및 (-) 버튼이 나타납니다.
  3. 더하기 버튼을 클릭하여 대문자 V로 시작하는 새 키 유형을 추가하면 자동으로 가장 먼저 컨트롤러 기반 상태 표시 줄보기가 표시됩니다.
  4. 이것을 키로 추가하십시오.
  5. VALUE를 "NO"로 설정
  6. 당신에게 AppDelegate.swift로 이동
  7. 메소드 내부에 코드를 추가하십시오.

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }

끝난! 앱을 실행하면 더 이상 상태 표시 줄이 없습니다!


1
처음에는이 솔루션이 제대로 작동한다고 생각했지만 CG_CONTEXT_SHOW_BACKTRACE로 디버깅 해야하는 오류가 발생했습니다. "컨트롤러 기반 상태 표시 줄보기"를 추가하여 역 추적
— Sean

iOS 9 2.2에서 저를 위해 잘 작동했습니다
— uplearnedu.com

1
iOS 10.1 시뮬레이터에서 작동했습니다. 감사합니다, @nycdanie.
— Jerome

7
"컨트롤러 기반 상태 표시 줄보기"를 NO로 설정하고 "상태 표시 줄이 처음 숨겨져 있음"을 "예"로 설정하십시오. 그런 다음 뷰 컨트롤러에 코드를 추가 할 필요가 없으며 전체 애플리케이션에서 상태 표시 줄이 숨겨집니다. Xcode 8.1, Swift 3.0.1, iOS 10
— tylerSF

1
@tylerSF는 훌륭하게 작동합니다! 당신은 이것을 답변으로 추가해야합니다 :)
— Pétur Ingi Egilsson

72

스위프트 3

에서 Info.plist설정 View controller-based status bar appearance에NO

그리고 전화 UIApplication.shared.isStatusBarHidden = true


1
yes로 설정되면 이것이 작동하는 유일한 방법입니다.
— farzadshbfn

@farzadshbfn 맞지 않아요. 나에 의해 언급되고 테스트 된 것처럼 부울 NO와 함께 작동합니다.
— Codetard

43

당신은 숨길 및 상태 표시 줄을 다시 가져올 경우 버튼을 탭에 있는 동안 제시하고 해산시, 슬라이드 - 인 메뉴 , 팝업 등, 당신은이 방법을 사용할 수 있습니다 : -

상태 표시 줄을 숨기려면 :-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

상태 표시 줄을 다시 가져 오려면 :-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

이것은 더 많은 해킹입니다. 특히 솔루션이 이미있는 경우 이와 같은 창에 방해하고 싶지 않습니다. 개발자 prefersStatusBarHidden가 이미 언급 한 것과 같은 속성 을 재정의하도록 권장 합니다.
— Stephen Paul

2
내 앱에서 상태 표시 줄을 잠시 숨기고 다시 가져 오려면 사용할 수 있습니다. 내 앱에서 슬라이더 메뉴가 왼쪽에서 오면 상태 표시 줄을 숨 깁니다. 메뉴가 사라지면 Gmail의 iOS 앱에서와 같이 상태 표시 줄을 다시 가져와야합니다. 따라서 이러한 시나리오에서는이를 사용할 수 있습니다.
— Vincent Joy

3
그것은 해킹이며, 그것을 방해 하지는 않지만 지금 은 효과 가 있습니다. 모두 당신이 말하는 것처럼. 문제 prefersStatusBarHidden는을 사용하여 상태 표시 줄을 켜거나 끄면 제약 조건을 사용하여 상태 표시 줄에 연결된보기와 탐색 표시 줄이 잘못된 방식으로 이동한다는 것 prefersStatusBarHidden 입니다. 현재로서는이 답변만이 해결되는 것 같습니다.
— 조니

@Jonny에 전적으로 동의합니다.이 솔루션도 마음에 들지 않지만 그가 말했듯이 재정의 prefersStatusBarHidden하면 제약 조건 이 손상 됩니다. 지금까지는이 작업을 수행합니다. 내가 싱글 톤을 사용하지 않는 것이 작은 래퍼를 사용하고 그러나 당신은 그것을 찾을 수 있습니다 여기에
— rgkobashi

34

코딩보다는 시각적 접근 방식을 선호하는 경우 다음 방법을 사용하십시오. info.plist

여기에 이미지 설명을 입력하십시오 간단하게 추가 View controller-based status bar appearance로NO

와 Status bar is initially hidden같은YES


이것은 2018 년의 정식 답변입니다.
— ChrisH

28
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}

28

iOS 10 / Swift 3.0 업데이트

더 이상 함수, 이제 속성이 아닙니다 ...

override var prefersStatusBarHidden: Bool {
    return true
}

전체 앱에서 이것을 설정하는 방법을 알고 있습니까? 현재 각 viewController에 입력해야합니다
— William T.

찾기 메뉴를 시도한 다음 프로젝트에서 찾기 및 바꾸기? 혹시? 그러나 중첩 된 get ... hmmm .... dunno와 그 대담한 추가 버팀대. 좋은 질문!
— atlwx

prefersStatusBarHidden는 결코 불려지지 않았다
— Bagusflyer

6
당신은 필요하지 않습니다 get { }당신이하지 않은 경우 set, 단지 쓰기return true
— 다니엘

16

스위프트 3.x에서 :

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}

이것은 iOS 9.0에서 사용되지 않습니다
— Georgios

16

Info.plist로 이동하여 두 개의 키를 추가하십시오.

Info.plist로 이동하여 두 개의 키를 추가하십시오.


12

따라서 여기의 문제는 실제로 Swift와 관련이 없지만 iOS 7에서 상태 표시 줄 모양이 처리되는 방식입니다.

기본적으로 뷰 컨트롤러는 화면에있을 때 상태 표시 줄의 모양을 개별적으로 제어합니다. 이 상태 표시 줄을 제어하는이 방법을 사용하려면 모양을 수정하려는 뷰 컨트롤러에 대해 다음 방법을 재정의 할 수 있습니다.

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

귀하의 경우에는 구현 prefersStatusBarHidden하고 반환하면됩니다.true 합니다.

다른 방법은 응용 프로그램 수준에서 상태 표시 줄 모양을 제어하는 ​​것입니다. 이것은 실제로하려고하는 것 같습니다 (설정하여)application.statusBarHidden ).

이 작업을 수행하려면 앱 Info.plist파일 을 열고 키를 추가하고 UIViewControllerBasedStatusBarAppearance값을 지정해야 NO합니다.


1
prefersStatusBarHidden에 대해 true 를 반환 하는 것을 의미한다고 생각합니다 . NO 는 ObjC에 속하며 어쨌든 잘못된 부울 값입니다.
— HenryRoot2

.plist 파일에없는 @HenryRootTwo 우리는 여전히 YES / NO를 사용합니다
— Alex Salom

8

나는 실제로 이것을 스스로 알아 냈습니다. 솔루션을 다른 옵션으로 추가하겠습니다.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

깨끗하고 모듈 식으로 유지하기위한 좋은 접근
— Roger Fernandez Guri

2
나는 이것을 구현할 수 없다. 어쩌면 Swift 1.2를 사용하기 때문일 수 있습니다. "Objective-C 선택기가있는 'prefersStatusBarHidden ()'방법이 동일한 Objective-C 선택기가있는 이전 선언과 충돌합니다"라는 오류가 발생합니다. 또한 처음에 override 키워드를 추가했지만 여전히 같은 오류가 발생합니다.
— Andrej

이것을 모든 뷰에 추가해야합니까?
— Sean

Swift 2에서는 작동하지 않습니다. 위의 @Andrej에서 설명한 오류를 표시합니다.
— Nagendra Rao

4

이 방법은 사람들 위에 어떤을 지원하지 않는 아이폰 OS 9 이후 나에게 문제가 될 수 있도록 좋아요, 여기에 같은 언급 UIApplication.sharedApplication().statusBarHidden = true 또는

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

과

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

작동하지만 조건을 변경할 수있는 프로그래밍 가능한 솔루션을 제공하지 않습니다. ( statusBarHidden = true그리고 statusBarHidden = false우리가 이전에 한 것처럼).

이 광기에 대한 해결책 :

prefersStatusBarHidden()아래와 같이 추가하면 info.plist에UIViewControllerBasedStatusBarAppearance 설정을 추가하지 않고도 상태 표시 줄 숨기기 및 표시를 프로그래밍 방식으로 제어 할 수 있습니다 .

var showStatusBar = true

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

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

그런 다음 코드 전체에서 다음과 같이 사용하십시오.

//Hide Status Bar
showStatusBar(false)

또는

//Show Status Bar
showStatusBar(true)

1
않는 prefersStatusBarHidden말이 호출? 난 당신이 할당 self.setNeedsStatusBarAppearanceUpdate()후 의미를 추측showStatusBar
— 레오

정말 광기 야, 그렇지? 이것이 얼마나 안타까운 API였으며 오랫동안 사용되어 왔습니다. 이런 종류의 것들로 인해 iOS 개발이 때때로 실망 스럽습니다.
— Womble

@Womble, 예. 꽤 복잡 할 수도 있습니다. Swift 3.0이 더 나은 라이브러리를 가지고 있기 때문에 첫 번째 모습에서 볼 수 있듯이 신속한 2.3에서 큰 변화를 가져올 것입니다.
— CodeOverRide

대신에 당신의 방법에서 prefersStatusBarHidden를 호출, 당신은 setNeedsStatusBarAppearanceUpdate를 부를 수
— 오스카

4

prefersStatusBarHidden메서드 나 변수를 재정의 할 때 View controller-based status bar appearanceInfo.plist에 YES 를 추가 해야합니다. 그렇지 않으면 재정의가 적용되지 않습니다.


4

Swift 4.2에서는 현재 부동산입니다.

override var prefersStatusBarHidden: Bool {
    return true
}

3

필자의 경우, 요청시 숨기거나 표시 할 상태 표시 줄을 찾고있었습니다. 뷰가로드되거나 사라질 때가 아니라

스위프트 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()

3

스위프트 5 : 메인 뷰 컨트롤러 또는 메인 네비게이션 컨트롤러 (있는 경우)

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

그리고 plist에서 "컨트롤러 기반 상태 표시 줄보기"는 YES 여야합니다. 그렇지 않으면 위의 코드가 호출되지 않습니다.

앱을 시작할 때 상태 표시 줄을 숨기려면 plist에서 "상태 표시 줄이 처음에 숨겨져 있습니다"가 YES 여야합니다. 이렇게하면 화면 상단에 여분의 파란색 막대가 표시 될 때 시작 이미지가 왜곡되는 것을 방지 할 수 있습니다.


2

나를 위해 일하는 솔루션; 로드하는 동안 특정 뷰 컨트롤러에서 상태 표시 줄을 숨기려면

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

주의 : info.plist에서 " 컨트롤러 기반 상태 표시 줄보기 "키 를 " NO "로 설정하면 위의 코드가 작동하지 않습니다. 키를 " 예 "로 설정하거나 info.plist에서 제거 해야합니다.


hideStatusBar 속성은 저장된 속성이므로 재정의 할 수 없습니다! 그러나 다른 이름을 선택하면 애니메이션이 작동합니다.
— XcodeNOOB

2

프로젝트 일반-> 배포 정보-> 상태 표시 줄 스타일에서 상태 표시 줄 숨기기의 확인 표시를 선택하십시오. 참고 :-응용 프로그램 전체에서 상태 표시 줄을 숨 깁니다


1
이것은 plist 답변이없는 저에게 효과적입니다 (ios 12).
— threeve

2

Swift 4+의 경우 다음 코드를 시도하십시오 (Swift 4.0, 4.1-IOS 10, 11에서 테스트).

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}

2

스위프트 5+

필자의 경우 일부 조건에 따라 숨겨진 상태 표시 줄을 업데이트해야합니다.

이 때문에 BaseViewController새로운 속성을 포함 하는 기본 컨트롤러 를 만듭니다.hideStatusBar .

다른 뷰 컨트롤러는이 기본 컨트롤러의 하위 클래스입니다. 마지막으로 상태 표시 줄 동작을 업데이트하려면이 hideStatusBar값만 변경하면 됩니다.

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

사용하는 방법

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

데모

다음은 UIView.animate(...)전환을 부드럽게 만드는 데 사용하는 데모 입니다.

여기에 이미지 설명을 입력하십시오


1

배포 대상이 10.1로 설정된 Xcode 8.1 (8B62)을 사용하고 있으며 위에서 언급 한 재정의 옵션으로 많은 운이 없었습니다. 그러나 배포 정보에서 "상태 표시 줄 숨기기"옵션을 확인하면 문제가 해결되었습니다.

프로젝트> 일반

이게 도움이 되길 바란다.


1

뷰 컨트롤러를 모달로 제시하는 경우 시도해보십시오

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }

4
질문에 답변 할 때 답변을 설명하십시오. 코드 스 니펫은 올바른 답변이 아닙니다.
— LazerBanana

0

이 코드를 ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

답을 주셔서 감사합니다. 좀 더 정교하게 신경 쓰세요. 정확히 코드 라인을 추가해야하는 곳과 이것이 왜 작동할까요? 참고 항목 어떻게 내가 좋은 응답 쓰기 절을 참조하십시오.
— 9953-div-37 5

0

프로젝트-> 일반-> 배포 정보에서

상태 표시 줄 스타일 :-

상태 표시 줄 숨기기 표시 (iOS 10)


0

스위프트 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true

좋아, 지금은 IOS가 없어 12. 11.4 업데이트 때 나는 그것을 고칠 것입니다, 또한 팀 뷰어를 가지고 있다면 시스템에 와서 고칠 것입니다
— Shakeel Ahmed

더 이상 사용되지 않습니다
— Vyachaslav Gerchicov

0

iOS 13 및 Swift 5 용으로 업데이트

위의 답변 중 어느 것도 당신에게 효과가 없다면. plist를 확인하여 다음이 있는지 확인하십시오.

"컨트롤러 기반 상태 표시 줄보기"

그렇다면, 반드시 YES로 설정하십시오 !!!!!

그런 다음 다음 코드가 작동합니다.

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