Làm cách nào để ẩn thanh trạng thái trong ứng dụng Swift iOS?


201

Tôi muốn xóa thanh trạng thái ở đầu màn hình.

Điều này không hoạt động:

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

Tôi cũng đã thử:

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
}

Câu trả lời:


449

Bạn thực sự nên triển khai prelikeStatusBarHidden trên (các) trình điều khiển xem của bạn:

Swift 3 trở lên

override var prefersStatusBarHidden: Bool {
    return true
}

4
Tôi nghĩ ý định của Jay là ẩn thanh trạng thái cho ứng dụng hoàn chỉnh. Đó là lý do tại sao anh ta có chức năng ẩn văn bản trong didFinishLaunchingWithOptions của ứng dụng. Làm thế nào để ẩn thanh trạng thái cho ứng dụng hoàn chỉnh?
Satyam

@Satyam có điểm tốt, sẽ rất tốt nếu loại bỏ điều này trong toàn bộ ứng dụng. Có một cách tiếp cận để thực hiện điều này thông qua thừa kế? Hoặc thông qua giao thức mở rộng?
Dan Beaulieu

3
@DanBeaulieu Tôi nghĩ thông qua thừa kế sẽ là một giải pháp tuyệt vời. Tạo một lớp con UIViewControll trong đó thanh ẩn được đặt thành true và sau đó làm cho tất cả các phân nhóm của bạn được kế thừa từ lớp đó. Một cách tiếp cận khác có thể là sử dụng Swizzling
CrisGriega

1
Mã Swift 3 không hoạt động, xem: stackoverflow.com/a/38902285/129202
Jonny

1
Trong phương pháp này có một lỗi: khi bạn muốn thực hiện một segue, chế độ xem cha mẹ của bạn về trình điều khiển khung nhìn hiện tại rơi xuống khoảng 20 px
iman kazemayni

99
  1. Chuyển đến tập tin Info.plist
  2. Di chuột vào một trong những dòng đó và nút (+) và (-) sẽ hiển thị.
  3. Nhấp vào nút dấu cộng để thêm khóa mới Loại bắt đầu bằng chữ V và tự động lựa chọn đầu tiên sẽ là Xem giao diện thanh trạng thái dựa trên bộ điều khiển.
  4. Thêm vào đó là chìa khóa.
  5. Đặt GIÁ TRỊ thành "KHÔNG"
  6. Chuyển đến bạn AppDelegate.swift
  7. Thêm mã, bên trong phương thức

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

LÀM XONG! Chạy ứng dụng của bạn và không có thêm thanh trạng thái!


1
Lúc đầu, tôi nghĩ giải pháp này hoạt động tốt, nhưng sau đó tôi nhận thấy rằng nó gây ra lỗi mà tôi cần gỡ lỗi với CG_CONTEXT_SHOW_BACKTRACE. Backtraced nó để thêm "Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển"
Sean

Làm việc tốt với tôi trong iOS 9 2.2
uplearnedu.com

1
Đã làm việc cho trình giả lập iOS 10.1. Cảm ơn, @nycdanie.
Jerome

7
Ngoài việc đặt "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" thành NO, đồng thời thêm "Thanh trạng thái ban đầu bị ẩn" được đặt thành "CÓ". Sau đó, bạn không cần thêm mã trong trình điều khiển xem và thanh trạng thái sẽ bị ẩn trong toàn bộ ứng dụng. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF

1
@tylerSF Hoạt động tuyệt vời! Bạn nên thêm điều này như một câu trả lời :)
Pétur Ingi Egilsson

72

Swift 3

Trong Info.plistthiết lập View controller-based status bar appearanceđểNO

Và gọi UIApplication.shared.isStatusBarHidden = true


1
Nếu nó được đặt thành có, đây là cách duy nhất nó sẽ hoạt động.
farzadshbfn

@farzadshbfn không đúng. Như tôi đã đề cập và thử nghiệm, nó không hoạt động với boolean NO.
Codetard

43

Nếu bạn muốn ẩn và đưa trở lại thanh trạng thái trên nút nhấn , trong khi tại thời điểm trình bày và loại bỏ menu trượt , cửa sổ bật lên , v.v., thì bạn có thể sử dụng phương pháp này: -

Để ẩn thanh trạng thái: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Để mang lại thanh trạng thái: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

Đây là nhiều hơn một hack. Tôi sẽ không muốn can thiệp vào cửa sổ như thế này ... đặc biệt là nếu một giải pháp đã tồn tại. Tôi sẽ khuyến khích các nhà phát triển ghi đè lên prefersStatusBarHiddentài sản như những gì đã được đề cập.
Stephen Paul

2
điều này có thể được sử dụng nếu chúng ta muốn ẩn và đưa trở lại thanh trạng thái trong giây lát .. trong ứng dụng của tôi, khi menu thanh trượt xuất phát từ phía bên trái, tôi phải ẩn thanh trạng thái. và khi menu biến mất, chúng ta phải đưa thanh trạng thái trở lại, như trong ứng dụng iOS của gmail .. vì vậy trong các loại kịch bản đó, chúng ta có thể sử dụng điều này.
Vincent Joy

3
Đó là một hack, và tôi sẽ không xen vào với nó, nhưng nó không làm việc cho thời điểm này. Kiểu như tất cả các bạn nói. Vấn đề với prefersStatusBarHiddenlà các chế độ xem được gắn với thanh trạng thái bằng các ràng buộc và cả các thanh điều hướng, sẽ di chuyển xung quanh theo cách xấu nếu bạn bật / tắt thanh trạng thái bằng cách sử dụng prefersStatusBarHidden . Hiện tại chỉ có câu trả lời này dường như hoạt động xung quanh đó.
Jonny

Hoàn toàn đồng ý với @Jonny, tôi cũng không thích giải pháp này nhưng như anh ấy nói, việc ghi đè prefersStatusBarHiddensẽ làm rối tung sự ràng buộc của bạn. Cho đến nay điều này làm việc. Tuy nhiên tôi đang sử dụng một trình bao bọc nhỏ để tránh sử dụng singletons, bạn có thể tìm thấy nó ở đây
rgkobashi

34

nếu bạn thích một cách tiếp cận trực quan hơn là mã hóa, hãy sử dụng phương pháp này: trong info.plist

nhập mô tả hình ảnh ở đây chỉ cần thêm View controller-based status bar appearancevàoNO

Status bar is initially hiddennhưYES


Đây là câu trả lời kinh điển trong năm 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

Cập nhật cho iOS 10 / Swift 3.0

Không còn là một chức năng, bây giờ là một tài sản ...

override var prefersStatusBarHidden: Bool {
    return true
}

Bạn có biết làm thế nào để thiết lập điều này trong toàn bộ ứng dụng không, hiện tại tôi phải nhập cái này vào mỗi viewContoder
William T.

Hãy thử Menu Tìm, sau đó Tìm và Thay thế trong Dự án? Có lẽ? Nhưng cái niềng răng cực lớn đó với cái lồng được ... hmmm .... dunno. câu hỏi hay!
atlwx

prelikeStatusBarHidden không bao giờ được gọi
Bagusflyer

6
Bạn không cần get { }nếu bạn không có set, chỉ cần viếtreturn true
Daniel

16

trong Swift 3.x:

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

Điều này không được chấp nhận trong iOS 9.0
Georgios

16

Truy cập Info.plist của bạn và thêm hai Khóa:

Truy cập Info.plist của bạn và thêm hai Khóa:


12

Vì vậy, vấn đề ở đây thực sự không liên quan gì đến Swift mà chỉ là cách xuất hiện của thanh trạng thái kể từ iOS 7.

Theo mặc định, các bộ điều khiển xem riêng lẻ kiểm soát sự xuất hiện của thanh trạng thái khi chúng ở trên màn hình. Nếu bạn muốn sử dụng phương pháp kiểm soát thanh trạng thái này, bạn có thể ghi đè các phương thức sau cho bất kỳ trình điều khiển xem nào bạn muốn sửa đổi giao diện cho:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

Trong trường hợp của bạn, bạn sẽ chỉ thực hiện prefersStatusBarHiddenvà trả lại true.

Một cách khác là kiểm soát sự xuất hiện của thanh trạng thái ở cấp ứng dụng. Đây dường như là những gì bạn đang thực sự cố gắng (bằng cách thiết lập application.statusBarHidden).

Để thực hiện công việc này, bạn cần mở Info.plisttệp ứng dụng của mình và thêm khóa UIViewControllerBasedStatusBarAppearancevà cung cấp cho nó một giá trị NO.


1
Tôi nghĩ rằng bạn có nghĩa là trả lại đúng cho prelikeStatusBarHidden. NO thuộc về ObjC và dù sao cũng là giá trị bool sai.
HenryRootTwo

@HenryRootTwo không có trong tệp .plist. Ở đó chúng tôi vẫn sử dụng CÓ / KHÔNG
Alex Salom

8

Tôi thực sự tìm ra điều này bản thân mình. Tôi sẽ thêm giải pháp của mình dưới dạng tùy chọn khác.

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

Cách tiếp cận tuyệt vời để giữ mọi thứ sạch sẽ và mô-đun
Roger Fernandez Guri

2
Tôi không thể thực hiện điều này. Có lẽ đó là vì bây giờ tôi sử dụng Swift 1.2. Tôi đang gặp lỗi: "Phương thức 'pre preferStatusBarHidden ()' với bộ chọn Objective-C 'prelikeStatusBarHidden' xung đột với khai báo trước đó với cùng bộ chọn Objective-C". Tôi cũng đã thêm từ khóa ghi đè lúc đầu, nhưng vẫn gặp lỗi tương tự.
Andrej

Bạn có cần thêm cái này vào mỗi view không?
Sean

Không hoạt động trong Swift 2, hiển thị lỗi như được giải thích bởi @Andrej ở trên.
Nagendra Rao

4

Được rồi, vì vậy điều này trở thành một vấn đề đối với tôi vì iOS 9 không hỗ trợ bất kỳ phương thức nào mà mọi người đã đề cập ở đây như UIApplication.sharedApplication().statusBarHidden = true hoặc

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

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

hoạt động nhưng không cung cấp giải pháp lập trình trong đó tôi có thể thay đổi theo điều kiện. ( statusBarHidden = truestatusBarHidden = falsenhư chúng tôi đã làm trước đây).

Giải pháp cho sự điên rồ này:

Bằng cách thêm để prefersStatusBarHidden()thích bên dưới, bạn có thể lập trình điều khiển ẩn và hiển thị của thanh trạng thái mà không cần thêm UIViewControllerBasedStatusBarAppearancethiết lập để bạn info.plist :

var showStatusBar = true

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

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

sau đó sử dụng nó như thế này trong suốt mã của bạn:

//Hide Status Bar
showStatusBar(false)

HOẶC LÀ

//Show Status Bar
showStatusBar(true)

1
Liệu prefersStatusBarHiddengọi có ý nghĩa gì? Tôi đoán bạn có nghĩa là self.setNeedsStatusBarAppearanceUpdate()sau khi showStatusBarchuyển nhượng
Leo

Nó thực sự là điên rồ, phải không? Thật là một API đáng thương này, và đã có từ rất lâu. Đôi khi điều này làm cho sự phát triển của iOS trở nên vô cùng khó chịu.
Womble

@Womble, vâng và nó cũng có thể trở nên khá phức tạp. Hy vọng Swift 3.0 có một thư viện tốt hơn và hỗ trợ như cái nhìn đầu tiên về nó, nó sẽ thay đổi toàn bộ từ swift 2.3 ... phá vỡ mọi thứ.
CodeOverRide

Thay vì gọi pre preferStatusBarHidden từ phương thức của bạn, bạn có thể gọi setNeedStatusBarAppparentUpdate
Oscar

4

Chỉ cần thêm, khi ghi đè prefersStatusBarHiddenphương thức hoặc biến, View controller-based status bar appearancetrong Info.plist phải là CÓ, nếu không, ghi đè sẽ không có hiệu lực


4

trong Swift 4.2 bây giờ nó là một tài sản.

override var prefersStatusBarHidden: Bool {
    return true
}

3

Trong trường hợp của tôi, tôi đã tìm kiếm thanh trạng thái để ẩn / hiển thị theo yêu cầu; thay vì chỉ khi chế độ xem tải hoặc biến mất.

nhanh chóng 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

Swift 5: Trong bộ điều khiển chế độ xem chính hoặc bộ điều khiển điều hướng chính nếu bạn có,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

Và "Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển" trong phần phải là CÓ, nếu không, đoạn mã trên sẽ không được gọi.

Nếu bạn muốn ẩn thanh trạng thái khi khởi chạy ứng dụng, "Thanh trạng thái ban đầu bị ẩn" trong phần chính phải là CÓ. Điều này có thể ngăn hình ảnh khởi chạy bị biến dạng khi thanh màu xanh thêm hiển thị trên màn hình.


2

Một giải pháp hiệu quả với tôi; nếu bạn muốn ẩn thanh trạng thái trên bộ điều khiển xem cụ thể trong khi tải:

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()
    }
}

Chú ý: nếu bạn đặt khóa " Xem giao diện thanh trạng thái dựa trên bộ điều khiển " thành " KHÔNG " trong thông tin của bạn. Hãy nhập mã ở trên không hoạt động. Bạn nên đặt khóa thành " " hoặc xóa nó khỏi info.plist


Bạn không thể ghi đè thuộc tính hideStatusBar vì đây là thuộc tính được lưu trữ! tuy nhiên bạn có thể chỉ cần chọn một tên khác và hoạt hình của bạn sẽ hoạt động.
XcodeNOOB

2

Trong dự án của bạn Chung-> Thông tin triển khai-> Kiểu thanh trạng thái chọn dấu kiểm của Ẩn thanh trạng thái Lưu ý: - nó ẩn thanh trạng thái trong suốt ứng dụng


1
Điều này làm việc cho tôi (ios 12), trong đó câu trả lời không có.
threeve

2

Đối với Swift 4+, hãy thử đoạn mã sau (đã thử nghiệm trên 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

Swift 5+

Trong trường hợp của tôi, tôi cần cập nhật thanh trạng thái ẩn dựa trên một số điều kiện.

Vì điều này, tôi tạo ra một trình điều khiển cơ sở BaseViewControllercó chứa thuộc tính mới hideStatusBar.

Các bộ điều khiển xem khác là lớp con của bộ điều khiển cơ sở này. Cuối cùng khi tôi muốn cập nhật hành vi trên thanh trạng thái, tôi chỉ cần thay đổi hideStatusBargiá trị này .

class BaseViewController: UIViewController {

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

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Cách sử dụng

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
            }
        }
    }
}

Bản giới thiệu

Đây là một bản demo, tôi đang sử dụng UIView.animate(...)để làm cho quá trình chuyển đổi mượt mà hơn.

nhập mô tả hình ảnh ở đây


1

Tôi đang sử dụng Xcode 8.1 (8B62) với mục tiêu triển khai được đặt thành 10.1 và tôi không gặp nhiều may mắn với các tùy chọn ghi đè được đề cập ở trên. Tuy nhiên, việc kiểm tra tùy chọn "Ẩn thanh trạng thái" trong Thông tin triển khai đã giúp tôi.

Dự án> Chung

Tôi hi vọng cái này giúp được.


1

Nếu bạn đang trình bày bộ điều khiển xem một cách vừa phải, hãy thử

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

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

4
Khi trả lời một câu hỏi, vui lòng giải thích câu trả lời của bạn, đoạn mã không phải là một câu trả lời thích hợp.
LazerBanana

0

Bạn có thể sử dụng mã này trong ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

Cảm ơn bạn đã trả lời, bạn có quan tâm để xây dựng thêm một chút. Trường hợp chính xác anh ta phải thêm dòng mã và tại sao điều này sẽ làm việc? Xem phần Làm thế nào để tôi viết một phần trả lời tốt .
9953-div-37

0

Trong Dự án của bạn-> Chung-> Thông tin triển khai

Kiểu thanh trạng thái: -

vừa được đánh dấu Ẩn thanh trạng thái (iOS 10)


0

Swift 4

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

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

ok bây giờ tôi không có ios 12 nào, tôi có 11.4 khi cập nhật, tôi cũng sẽ sửa nó, nếu bạn có teamviewer tôi sẽ đến và sửa nó trên hệ thống của bạn
Shakeel Ahmed

nó không được chấp nhận
Vyachaslav Gerchicov

0

Đã cập nhật cho iOS 13 và Swift 5

Nếu không có câu trả lời trên làm việc cho bạn. Kiểm tra danh sách của bạn để xem nếu bạn có điều này:

"Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển"

Nếu vậy, hãy chắc chắn đặt nó thành CÓ !!!!!

Sau đó, đoạn mã sau sẽ hoạt động.

override var prefersStatusBarHidden: Bool {
    return true
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.