ฉันจะซ่อนแถบสถานะในแอพ 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
}

ซ้ำกันเป็นไปได้ของวิธีการซ่อนแถบสถานะใน iOS?
Jake Chasan

คำตอบ:


449

คุณควรใช้ prefersStatusBarHidden จริง ๆ บนคอนโทรลเลอร์มุมมองของคุณ:

Swift 3 และใหม่กว่า

override var prefersStatusBarHidden: Bool {
    return true
}

4
ฉันคิดว่าความตั้งใจของเจย์คือการซ่อนแถบสถานะสำหรับแอพที่สมบูรณ์ นั่นเป็นเหตุผลที่เขาจะเขียนฟังก์ชันซ่อนในแอพพลิเคชั่นของเขาได้ FinishLaunchingWithOptions จะซ่อนแถบสถานะสำหรับแอพที่สมบูรณ์ได้อย่างไร
Satyam

@Satyam มีจุดที่ดีมันจะดีที่จะลบมันตลอดทั้งแอปพลิเคชัน มีวิธีการดำเนินการนี้ผ่านการสืบทอดหรือไม่ หรือผ่านส่วนขยายโปรโตคอล?
Dan Beaulieu

3
@ DanBeaulieu ฉันคิดว่าผ่านการสืบทอดจะเป็นทางออกที่ดี สร้างคลาสย่อย UIViewController ที่แถบซ่อนถูกตั้งค่าเป็นจริงจากนั้นทำให้ subclases ทั้งหมดของคุณสืบทอดมาจากอันนั้น อีกวิธีคือใช้Swizzling
CrisGriega

1
Swift 3 code ใช้งานไม่ได้ดู: stackoverflow.com/a/38902285/129202
Jonny

1
ในวิธีการนี้มีข้อผิดพลาด: เมื่อคุณต้องการทำเซกเมนต์มุมมองพาเรนต์ของผู้ควบคุมวิวเวอร์ปัจจุบันของคุณล้มลงประมาณ 20 px
iman kazemayni

99
  1. ไปที่ไฟล์ Info.plist
  2. โฮเวอร์ที่หนึ่งในบรรทัดเหล่านั้นและปุ่ม (+) และ (-) จะปรากฏขึ้น
  3. คลิกปุ่มบวกเพื่อเพิ่มคีย์ใหม่ประเภทเริ่มต้นด้วยตัวพิมพ์ใหญ่ V และตัวเลือกแรกโดยอัตโนมัติคือดูลักษณะแถบสถานะที่ใช้ตัวควบคุม
  4. เพิ่มว่าเป็นกุญแจ
  5. ตั้งค่าเป็น "ไม่"
  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
เจอโรม

7
นอกเหนือจากการตั้งค่า "ดูแถบสถานะตามตัวควบคุม" เป็น NO นอกจากนี้ยังเพิ่ม "แถบสถานะถูกซ่อนอยู่ในขั้นต้น" ตั้งค่าเป็น "YES" จากนั้นคุณไม่จำเป็นต้องเพิ่มรหัสในตัวควบคุมมุมมองและแถบสถานะจะถูกซ่อนในแอปพลิเคชันทั้งหมด Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF

1
@tylerSF ใช้งานได้ดี! คุณควรเพิ่มสิ่งนี้เป็นคำตอบ :)
38499 Pétur Ingi Egilsson

72

สวิฟท์ 3

ในการInfo.plistตั้งค่าView controller-based status bar appearanceเป็นNO

และโทรมา UIApplication.shared.isStatusBarHidden = true


1
หากตั้งค่าเป็นใช่นี่เป็นวิธีเดียวที่จะใช้งานได้
farzadshbfn

@farzadshbfn ไม่ถูกต้อง ดังกล่าวและทดสอบโดยฉันมันทำงานกับบูลีน NO
Codetard

43

หากคุณต้องการซ่อนและนำกลับมาแถบสถานะเมื่อแตะปุ่มในขณะที่ในช่วงเวลาของการนำเสนอและการไล่สไลด์ในเมนู , ป๊อปอัพฯลฯ จากนั้นคุณสามารถใช้วิธีนี้: -

ในการซ่อนแถบสถานะ: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

วิธีนำแถบสถานะกลับมา: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

นี่เป็นเรื่องแฮ็คที่มากกว่า ฉันไม่อยากยุ่งกับหน้าต่างแบบนี้ ... โดยเฉพาะถ้ามีวิธีแก้ไขอยู่แล้ว ฉันขอแนะนำให้นักพัฒนาซอฟต์แวร์แทนที่prefersStatusBarHiddenคุณสมบัติเช่นที่กล่าวไว้แล้ว
Stephen Paul

2
สามารถใช้งานได้หากเราต้องการซ่อนและนำแถบสถานะกลับมาชั่วครู่ .. ในแอพของฉันเมื่อเมนูตัวเลื่อนมาจากด้านซ้ายฉันต้องซ่อนแถบสถานะ และเมื่อเมนูหายไปเราต้องนำแถบสถานะกลับมาเช่นในแอพ iOS ของ gmail .. ดังนั้นในสถานการณ์แบบนั้นเราสามารถใช้มันได้
Vincent Joy

3
มันเป็นสับและฉันจะไม่เข้าไปยุ่งกับมัน แต่มันไม่ทำงานในขณะนั้น ทุกคนชอบพูด ปัญหากับprefersStatusBarHiddenเป็นมุมมองที่ผูกติดอยู่กับแถบสถานะการใช้ข้อ จำกัด และยังแถบนำทางจะย้ายไปรอบ ๆ ในแฟชั่นไม่ดีถ้าคุณสลับแถบสถานะเปิด / prefersStatusBarHidden ปิดการใช้ ในขณะนี้มีเพียงคำตอบเดียวที่ดูเหมือนจะแก้ไขได้
Jonny

เห็นด้วยอย่างสมบูรณ์กับ @Jonny ฉันไม่ชอบวิธีนี้เช่นกัน แต่อย่างที่เขาบอกว่าการเอาชนะprefersStatusBarHiddenจะทำให้คุณสับสน จนถึงตอนนี้ก็ใช้งานได้แล้ว อย่างไรก็ตามฉันใช้ wrapper ขนาดเล็กเพื่อหลีกเลี่ยงการใช้ singletons คุณสามารถค้นหาได้ที่นี่
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.

ลองใช้เมนูค้นหาจากนั้นค้นหาและแทนที่ในโครงการ บางที? แต่นั่นรั้งเสริมพิเศษกับที่ซ้อนกันรับ ... อืม .... ไม่ได้ คำถามที่ดี!
atlwx

prefersStatusBarHidden ไม่เคยถูกเรียกว่า
Bagusflyer

6
คุณไม่ต้องการget { }ถ้าคุณไม่มีsetแค่เขียนreturn true
Daniel



12

ดังนั้นปัญหาที่นี่ไม่มีส่วนเกี่ยวข้องกับ Swift แต่วิธีจัดการกับลักษณะที่ปรากฏของแถบสถานะเป็นของ iOS 7

ตามค่าเริ่มต้นตัวควบคุมการดูจะควบคุมลักษณะที่ปรากฏของแถบสถานะเมื่ออยู่บนหน้าจอ หากคุณต้องการใช้วิธีนี้ในการควบคุมแถบสถานะคุณสามารถแทนที่วิธีต่อไปนี้สำหรับตัวควบคุมมุมมองที่คุณต้องการแก้ไขลักษณะที่ปรากฏสำหรับ:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation ,

ในกรณีของคุณคุณจะใช้prefersStatusBarHiddenและส่งคืนtrueและผลตอบแทน

อีกวิธีหนึ่งคือการควบคุมลักษณะที่ปรากฏของแถบสถานะที่ระดับแอปพลิเคชัน นี่น่าจะเป็นสิ่งที่คุณพยายามทำจริง ๆ (โดยการตั้งค่าapplication.statusBarHidden )

เพื่อที่จะทำให้งานนี้คุณจะต้องเปิดแอปของคุณInfo.plistไฟล์และเพิ่มที่สำคัญและให้คุณค่าของUIViewControllerBasedStatusBarAppearanceNO


1
ฉันคิดว่าคุณหมายถึงผลตอบแทนที่แท้จริงสำหรับ prefersStatusBarHidden NOเป็นของ ObjC และเป็นค่าบูลที่ผิดอยู่ดี
HenryRootTwo

@HenryRootTwo ไม่ได้อยู่ในไฟล์. plist ที่นั่นเรายังใช้ YES / NO
Alex Salom

8

ฉันคิดออกเองจริง ๆ ฉันจะเพิ่มโซลูชันของฉันเป็นตัวเลือกอื่น

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

วิธีการที่ดีในการรักษาความสะอาดและโมดูลาร์
Roger Fernandez Guri

2
ฉันไม่สามารถใช้สิ่งนี้ได้ อาจเป็นเพราะตอนนี้ฉันใช้ Swift 1.2 ฉันได้รับข้อผิดพลาด: "เมธอด 'prefersStatusBarHidden ()' กับตัวเลือก Objective-C 'prefersStatusBarHidden' ขัดแย้งกับการประกาศก่อนหน้าด้วยตัวเลือก Objective-C ตัวเดียวกัน" ฉันได้เพิ่มคำหลักแทนที่ที่จุดเริ่มต้น แต่ยังได้รับข้อผิดพลาดเดียวกัน
Andrej

คุณต้องการเพิ่มสิ่งนี้ลงในทุก ๆ มุมมองหรือไม่?
ฌอน

ไม่ทำงานใน Swift 2 แสดงข้อผิดพลาดตามที่อธิบายโดย @Andrej ด้านบน
Nagendra Rao

4

โอเคดังนั้นนี่จึงเป็นปัญหาสำหรับฉันเนื่องจาก iOS 9 ไม่สนับสนุนวิธีการที่ผู้คนกล่าวถึงที่นี่เช่นUIApplication.sharedApplication().statusBarHidden = true หรือ

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

และ

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

ใช้งานได้ แต่ไม่ได้ให้วิธีแก้ปัญหาที่ตั้งโปรแกรมได้ซึ่งฉันสามารถเปลี่ยนเงื่อนไขได้ ( statusBarHidden = trueและstatusBarHidden = falseอย่างที่เราเคยทำมาก่อน)

ทางออกของความบ้าคลั่งนี้:

ด้วยการเพิ่มไลค์prefersStatusBarHidden()ด้านล่างคุณสามารถควบคุมการซ่อนและแสดงแถบสถานะโดยทางโปรแกรมโดยไม่ต้องเพิ่มการUIViewControllerBasedStatusBarAppearanceตั้งค่าให้กับinfo.plistของคุณ:

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มอบหมาย
Leo

มันบ้าจริงๆใช่มั้ย สิ่งนี้เป็น API ที่น่าสงสารและเป็นมานานแล้ว สิ่งนี้ทำให้การพัฒนา iOS น่าผิดหวังอย่างมากในบางครั้ง
Womble

@ Womble ได้และมันก็ค่อนข้างซับซ้อนเช่นกัน หวังว่า Swift 3.0 จะมีไลบรารี่และการสนับสนุนที่ดีกว่าเมื่อดูเป็นครั้งแรกมันจะเปลี่ยนลอตทั้งหมดจากสวิฟท์ 2.3 ...
CodeOverRide

แทนที่จะเรียก prefersStatusBarHidden จากวิธีการของคุณคุณสามารถโทร setNeedsStatusBarAppearanceUpdate
Oscar

4

เพียงเพื่อเพิ่มเมื่อเอาชนะprefersStatusBarHiddenเมธอดหรือตัวแปรView controller-based status bar appearanceใน Info.plist ต้องเป็น YES มิฉะนั้นการแทนที่จะไม่มีผลใด ๆ



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

Swift 5: ในตัวควบคุมมุมมองหลักหรือตัวควบคุมการนำทางหลักหากคุณมี

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

และ "ดูแถบสถานะตามตัวควบคุม" ในรายการที่ต้องมีคือ YES ไม่เช่นนั้นโค้ดด้านบนจะไม่ถูกเรียก

หากคุณต้องการซ่อนแถบสถานะเมื่อเปิดใช้แอป "แถบสถานะถูกซ่อนอยู่ในขั้นต้น" ในรายการที่ต้องเป็น 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 ของคุณรหัสด้านบนไม่ทำงาน คุณควรตั้งรหัสเป็น " ใช่ " หรือลบออกจาก info.plist


คุณไม่สามารถแทนที่คุณสมบัติ hideStatusBar เนื่องจากเป็นคุณสมบัติที่จัดเก็บ! อย่างไรก็ตามคุณสามารถเลือกชื่ออื่นและภาพเคลื่อนไหวของคุณจะใช้งานได้
XcodeNOOB

2

ในโครงการของคุณทั่วไป -> ข้อมูลการปรับใช้ -> สไตล์แถบสถานะเลือกเครื่องหมายถูกของซ่อนแถบสถานะหมายเหตุ: - มันจะซ่อนแถบสถานะตลอดทั้งแอปพลิเคชัน


1
สิ่งนี้ใช้ได้กับฉัน (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

Swift 5+

ในกรณีของฉันฉันต้องอัปเดตแถบสถานะที่ซ่อนอยู่ตามเงื่อนไขบางประการ

ด้วยเหตุนี้ฉันจะสร้าง Controlller ฐานซึ่งมีคุณสมบัติใหม่BaseViewControllerhideStatusBar

ตัวควบคุมมุมมองอื่น ๆ เป็นคลาสย่อยของตัวควบคุมฐานนี้ ในที่สุดเมื่อฉันต้องการอัปเดตพฤติกรรมของแถบสถานะฉันต้องเปลี่ยน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

ฉันใช้ Xcode 8.1 (8B62) กับเป้าหมายการปรับใช้ที่ตั้งไว้ที่ 10.1 และฉันไม่ได้โชคดีมากกับตัวเลือกการแทนที่ดังกล่าวข้างต้น อย่างไรก็ตามการตรวจสอบตัวเลือก "ซ่อนแถบสถานะ" ในข้อมูลการปรับใช้นั้นเป็นเคล็ดลับสำหรับฉัน

โครงการ> ทั่วไป

ฉันหวังว่านี่จะช่วยได้.


1

หากคุณกำลังแสดงตัวควบคุมมุมมองแบบ Modally ให้ลอง

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

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 เมื่อการอัปเดตของฉันจะแก้ไขได้เช่นกันถ้าคุณมี teamviewer ฉันจะมาแก้ไขมันในระบบของคุณ
Shakeel Ahmed

มันเลิกใช้แล้ว
Vyachaslav Gerchicov

0

อัปเดตสำหรับ iOS 13 และ Swift 5

หากคำตอบข้างต้นไม่เหมาะกับคุณ ตรวจสอบรายการของคุณเพื่อดูว่าคุณมีสิ่งนี้หรือไม่:

"ดูลักษณะแถบสถานะตามคอนโทรลเลอร์"

ถ้าเป็นเช่นนั้นอย่าลืมตั้งค่าเป็นใช่ !!!!!

จากนั้นรหัสต่อไปนี้จะใช้งานได้

override var prefersStatusBarHidden: Bool {
    return true
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.