UIStatusBarStyle ไม่ทำงานใน Swift


85

ฉันพยายามเปลี่ยนสีแถบสถานะในแอป Swift เป็นสีขาว แต่กำลังชนกำแพงอิฐ ฉันมี ViewControllers 3 ตัวที่แต่ละตัวฝังอยู่ใน NavigationController (นั่นอาจเป็นปัญหาได้หรือไม่ฉันได้พยายามวางโค้ดในคลาส NavigationController แล้ว) ฉันได้ลองใช้โค้ดทั้งสองชิ้นต่อไปนี้ใน didFinishLaunchingWithOptions ของ AppDelegate ของฉัน .swift แต่ไม่ทำงาน

application.statusBarStyle = .LightContent

และ

UIApplication.sharedApplication().statusBarStyle = .LightContent

สิ่งที่เอกสารต้องพูดเกี่ยวกับเรื่องนี้ก็คือ UIBarButtonStyle เป็น Int และให้ข้อมูลโค้ด enum นี้แก่ฉันซึ่งไม่ได้ช่วยอะไรฉันเลย

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

ฉันขาดอะไรไป?

คำตอบ:


145

คุณมีสองทางเลือก

หากคุณต้องการตั้งค่ารูปแบบของแถบสถานะด้วยตนเองต่อไปให้ทำสิ่งที่คุณทำต่อไป แต่คุณจะต้องเพิ่มคีย์ต่อไปนี้ลงในไฟล์ info.plist ของคุณโดยมีค่าเป็นNO.

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

หรือหากคุณต้องการใช้ลักษณะแถบสถานะตามตัวควบคุมมุมมองต่อไปแทนที่จะตั้งค่า statusBarStyle ของแอปพลิเคชันให้แทนที่preferredStatusBarStyleคุณสมบัติในตัวควบคุมมุมมองแต่ละตัวที่คุณต้องการระบุลักษณะแถบสถานะ

สวิฟต์ 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

สวิฟต์ 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

ฉันได้ลองใช้รหัสนี้แล้ว ... แต่ฉันได้รับแถบสถานะสีขาวในหน้าจอแรกเท่านั้น .. ฉันไม่ได้รับแถบสถานะสำหรับส่วนที่เหลือของหน้าจอ :( .. มีอะไรช่วยไหม
ราหุล

7
คุณต้องตั้งค่า "ดูลักษณะแถบสถานะตามตัวควบคุม" ใน plist ของคุณเป็นใช่
StackUnderflow

1
นั่นก็ต่อเมื่อคุณต้องการใช้ลักษณะแถบสถานะตามตัวควบคุมมุมมอง
Sam Holmes

4
ใน iOS 10 (Swift 3.0) ไม่ใช่วิธีการอีกต่อไป แต่เป็นคุณสมบัติ ดู: stackoverflow.com/questions/38862208/…
stevo.mit

สำหรับหน้าจอเดียว
Oubaida AlQuraan

143

Swift 3.0

ใน AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

ใน AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

1
นี่คือคำตอบที่สมบูรณ์แบบ :)
Jay Mayu

1
คำตอบที่สมบูรณ์แบบ สั้นและหวาน
Mehul

3
ขออภัยนี่อาจเป็นคำตอบที่ง่ายที่สุด แต่ก็ไม่ใช่คำตอบที่ดีที่สุดอย่างแน่นอนเพราะเพียงแค่ตั้งค่าสไตล์นี้ให้กับทุกคนและ viewControllers ในแอป พฤติกรรมดังกล่าวได้รับการแนะนำเพื่อให้สามารถควบคุมได้ละเอียดขึ้นและใช้การตั้งค่าที่แตกต่างกันตามตัวควบคุมมุมมองที่แตกต่างกัน (เช่นการผสมเนื้อหาที่สว่างและมืด)
auco

มันแปลกประหลาดไม่ใช่สิ่งที่เอกสารของ Apple พูด แต่ใช้งานได้ ลองใช้วิธีอื่น ๆ อีกมากมายรวมถึงมีแถบสถานะตาม UIViewController แต่ไม่มีวิธีใดได้ผล
59 เวลา 07:04 น

33

คุณต้องตั้งค่า:

navigationController.navigationBar.barStyle = .black

และข้อความจะปรากฏเป็นสีขาว


1
ขอบคุณ! ไม่มีอะไรที่ช่วยแม้กระทั่งการแทนที่นี้ func preferredStatusBarStyle () เป็น -> UIStatusBarStyle {} ผลตอบแทน UIStatusBarStyle.LightContent นี้จริงๆช่วย: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana

ขอบคุณ! คุณช่วยวันของฉัน อย่างไรก็ตาม BlackTranslucent เลิกใช้แล้ว ดังนั้นฉันใช้ navigationController.navigationBar.barStyle =
.Black

override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }มันสมบูรณ์แบบการทำงานร่วมกับ คุณต้องเขียนบรรทัดนี้viewDidLoadเพื่อ wrok ให้ดี อย่าลืมView controller-based status bar appearance = YESใช้วิธีนี้
Bhavin_m

ดูเหมือนจะ overkill ... เพิ่งลองใช้งานและทำงานแบบนี้ในไฟล์ Info.plist: 1. สไตล์แถบสถานะ -> UIStatusBarStyleLightContent 2. ดูลักษณะแถบสถานะตามคอนโทรลเลอร์ -> NO
raistlin

การเปลี่ยนแปลงนี้ทำให้ปุ่มย้อนกลับของฉันหายไป
Leon

21

สำหรับ iOS9.x และ Xcode7 เพียงใส่สิ่งนี้ไว้ด้านในAppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

การดำเนินการนี้จะเปลี่ยนรูปแบบแถบสถานะของคุณโดยอัตโนมัติ.Lightcontentสำหรับตัวควบคุมมุมมองทั้งหมดภายใน UINavigationController

(นอกจากนี้ให้ลบออกView controller-based status bar appearanceจาก Info.plist เพื่อระงับคำเตือนที่คุณอาจเห็นด้วย!)


ขอขอบคุณ. ดูเหมือนว่าจะมีข้อผิดพลาดร้ายแรงใน iOS9 นี่เป็นวิธีเดียวที่ฉันสามารถเปลี่ยนแถบสถานะใน VC เริ่มต้นเป็นสีขาว ฉันพยายามทุกอย่างแล้ว ฉันจะยื่นเรดาร์
1b0t

recommendedStatusBarStyle ส่งคืน UIStatusBarStyleDefault แต่ไม่อัปเดต lightcontent เป็น darkcontent สำหรับ viewcontroller เฉพาะ หลังจาก self.navigationController.navigationBar.barStyle = UIBarStyleDefault; ในมุมมอง WillAppear ทำงานให้ฉัน หวังว่าความคิดเห็นนี้จะช่วยคนอื่น ๆ
Pandey_Laxman

โปรดทราบว่า UIStatusBarStyle เปลี่ยนเป็น ".black" (ตัวพิมพ์เล็ก B) ใน Swift 3
brycejl

16

ใน Swift 3 สไตล์แถบสถานะได้เปลี่ยนไปเป็นคุณสมบัติที่คำนวณแล้วใน UIViewController ซึ่งคุณสามารถแทนที่ได้ดังนี้:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 

13

บน iOS 9 ต่อไปนี้ (setStatusBarStyle) เลิกใช้งานแล้วและคุณจะได้รับคำเตือนหากคุณไปทางนั้น

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

หากคุณต้องการให้ statusBars ทั้งหมดเปลี่ยนในนัดเดียวให้ลองเพิ่มสิ่งต่อไปนี้ใน Info.plist ของคุณ นอกจากนี้ยังจะทำให้แถบสถานะหน้าจอเปิดตัวของคุณเป็นสีขาว ในขณะที่รหัสด้านบนจะไม่

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

วิธีการ. plist ถูกต้อง แต่ setStatusBarStyle () ไม่จำเป็น 'setStatusBarStyle (_: animated :)' เลิกใช้งานแล้วใน iOS 9.0: Use - [UIViewController recommendedStatusBarStyle]
Bill Chan

@BillChan ขอบคุณสำหรับการแสดงความคิดเห็น แต่โปรดอ่านคำตอบที่ได้รับ ฉันได้อธิบายแล้วว่า 'setStatusBarStyle' เลิกใช้งานแล้ว คุณควรใช้ recommendedStatusBarStyle ถ้าคุณต้องการเปลี่ยน viewControllers อย่างใดอย่างหนึ่ง วิธีการ plist สำหรับผู้ที่ต้องการเปลี่ยน viewControllers ทั้งหมดในนัดเดียว ไม่มีถูกหรือผิดที่นี่. เพียงแค่เรื่องของสิ่งที่คุณต้องบรรลุ
GuiSoySauce

1
UIStatusBarStyle = UIStatusBarStyleLightContent (ใน. plist) ช่วยเปิดแอปของฉันด้วยข้อความแถบสถานะสีขาว ... ขอบคุณ !!!
Chris Allinson

10

สำหรับฉันทั้งหมดข้างต้นไม่ทำงานจนกว่าฉันจะเพิ่ม:

self.navigationController?.navigationBar.barStyle = .black;

ดังนั้น:

  1. ตั้งค่าUIViewControllerBasedStatusBarAppearanceเป็นYESใน.plist
  2. ในการviewDidLoadโทรself.setNeedsStatusBarAppearanceUpdate();
  3. แทนที่ recommendedStatusBarStyle ที่ต้องการ
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. ในวิธีการแทนที่ฉันยังตั้งค่าnavigationBar.barStyleขั้นสุดท้าย
    สำหรับเนื้อหาแสง :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    และสำหรับเนื้อหาสีดำให้ใช้ค่าเริ่มต้น

แหล่งที่มาจากที่นี่และที่นี่

และหากไม่ได้ผลคุณสามารถลองเพิ่มUINavigationController extension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}

1
ไม่มีความคิดเห็นสำหรับรูปแบบแถบนำทาง ... แต่ใน Swift 3, Xcode 8 - นี่เป็นทางออกเดียวที่ใช้ได้กับฉัน
Despotovic

ข้อเสียเปรียบเพียงอย่างเดียวที่ฉันสังเกตเห็นคือขั้นตอนทั้งหมดนั้นจะเปลี่ยนไป แต่ไม่มีภาพเคลื่อนไหว
Lukasz 'Severiaan' Grela

6

แปลกโดยใช้ Swift 3.1 & XC8.2.1 แต่ทั้งหมดข้างต้นไม่ได้ผล

สิ่งที่ฉันทำก็แค่

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

ไม่มี Plist ไม่มีสิ่งอื่น ๆ HTH


ใช้งานได้กับ Swift 4.2 ด้วย
zeeshan

2

ใน Swift 3.0 คุณสามารถแทนที่ getter ใน ViewController สำหรับดูลักษณะแถบสถานะตามคอนโทรลเลอร์ได้:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

1

อย่าแก้ไข Info.plist ของคุณ เพิ่มสิ่งนี้ใน ViewController.swift ของคุณ:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

1

ขั้นตอนที่ 1. เพิ่มใน info.plist View controller-based status bar appearance -> NO

ขั้นตอนที่ 2. เพิ่มรหัสในวิธีที่คุณต้องการเปลี่ยนสีแถบสถานะ:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

บรรทัดสำคัญของรหัส: setNeedsStatusBarAppearanceUpdate()

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