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 appearanceNO

그리고 전화 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 appearanceNO

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.