การเปลี่ยนสีของแถบสถานะสำหรับ ViewControllers ที่ระบุโดยใช้ Swift ใน iOS8


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

โดยใช้โค้ดข้างต้นใน ViewController ใด ๆ ในการตั้งค่าสีสถานะสีขาวสำหรับเฉพาะ ViewController ไม่ได้ทำงานใน iOS8 สำหรับฉัน ข้อเสนอแนะใด ๆ การใช้วิธี UIApplication.sharedApplication สีจะเปลี่ยนไปหลังจากการเปลี่ยนแปลงที่จำเป็นใน Info.plist สำหรับแอปทั้งหมด

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

ฉันจะเปลี่ยนสีแถบสถานะสำหรับViewControllers ที่ต้องการและเจาะจงได้อย่างไร

คำตอบ:


350

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

ขั้นแรก:

เปิด info.plist ของคุณและใส่คีย์ใหม่ชื่อ " ดูลักษณะแถบสถานะที่ใช้ควบคุม " เป็นNO

ขั้นตอนที่สอง (เพียงคำอธิบายไม่จำเป็นต้องใช้สิ่งนี้):

โดยปกติเราใส่รหัสต่อไปนี้ในแอปพลิเคชัน (_: didFinishLaunchingWithOptions :) วิธีของ AppDelegate

สวิฟท์ 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

สวิฟท์ 3

UIApplication.shared.statusBarStyle = .lightContent

แต่นั่นมีผลstatusBarStyleกับ ViewControllers ทั้งหมด

ดังนั้นวิธีการทำให้การทำงานนี้สำหรับ ViewControllers เฉพาะ - ขั้นตอนสุดท้าย:

เปิดไฟล์ viewcontroller ที่คุณต้องการเปลี่ยนstatusBarStyleและใส่รหัสต่อไปนี้viewWillAppear() ,

สวิฟท์ 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

สวิฟท์ 3

UIApplication.shared.statusBarStyle = .lightContent

นอกจากนี้ให้ใช้viewWillDisappear()วิธีการสำหรับ viewController เฉพาะนั้นและวางบรรทัดของรหัสต่อไปนี้

สวิฟท์ 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

สวิฟท์ 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

ขั้นตอนนี้จะเปลี่ยนstatusBarStyleสำหรับ viewcontroller เฉพาะก่อนแล้วจึงเปลี่ยนกลับไปเป็นdefaultเมื่อ viewcontroller เฉพาะหายไป การไม่ใช้งานviewWillDisappear()จะเปลี่ยนค่าstatusBarStyleถาวรเป็นค่าใหม่ที่กำหนดUIStatusBarStyle.LightContent


4
โปรดทราบว่าถ้าคุณตั้งค่าStatus bar is initially hidden = YESในไฟล์ info.plist "การดูลักษณะแถบสถานะตามตัวควบคุม = NO" จะทำให้แถบสถานะถูกซ่อน
xi.lin

13
หากคุณเปลี่ยนกลับไปUIStatusBarStyle.Defaultใช้viewWillDisappear()คุณควรใช้viewWillAppear()เพื่อเริ่มต้นมันแทนที่จะเป็นviewDidLoad()... มิฉะนั้นถ้าคุณกลับมาที่มุมมองนั้นโดยไม่ต้องโหลดซ้ำคุณจะไม่เห็นว่าStatusBarStyleคุณคาดหวัง
William GP

7
สำหรับ Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz

4
ยังไม่ชัดเจนว่าคุณเปลี่ยนสีของแถบสถานะอย่างไร
DoruChidean

4
พวกมันเลิกใช้งานจาก iOS 9
Jeevan

109

(ณ วันที่ 20 กันยายน 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}

7
อย่าลืมโทรsuper.viewWillAppearถ้าคุณกำลังคัดลอกและวางรหัสนี้ไว้
Stephen Silber

แก้ไขเพื่อรวม super.viewWillAppear () ขอบคุณ @StephenSilber สำหรับคำแนะนำ!
BennyTheNerd

คุณต้องแทนที่ StatusStyle ที่ต้องการมิเช่นนั้นจะไม่ทำงาน ขอบคุณสำหรับการชี้ให้เห็นว่า +1
Alix

3
การใช้UIApplication.shared.statusBarStyle = .lightContentผลลัพธ์ในคำเตือนคอมไพเลอร์นี้: Setter สำหรับ 'statusBarStyle' ถูกคัดค้านใน iOS 9.0: การใช้งาน - [UIViewController
preferStatusBarStyle

3
ใน Info.plist ของแอปพลิเคชันของคุณให้ตั้งค่า "ดูแถบสถานะตามตัวควบคุม" เป็น YES
IvanPavliuk

30

โซลูชัน Swift 4.2 พร้อมด้วย NavigationController

ขั้นแรก:

เปิด info.plist ของคุณและใส่คีย์ใหม่ชื่อ " ดูลักษณะแถบสถานะที่ใช้คอนโทรลเลอร์ " หรือUIViewControllerBasedStatusBarAppearanceเพื่อYESเพื่อให้ VC แต่ละตัวใช้คุณสมบัติสถานะของตนเอง

ขั้นตอนที่สอง

ในแต่ละ VC, แทนที่preferredStatusBarStyleคุณสมบัติเช่นนี้

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

ขั้นตอนสุดท้าย

แทนที่คุณสมบัติPreferredStatusBarStyleในคลาส NavigationController ที่คุณกำหนดเอง:

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}

นี่เป็นเพียงวิธีการบรรลุผลลัพธ์ที่คาดหวังโดยใช้ Navigation Controller และตัวควบคุมของคุณเอง นอกจากนี้คุณสามารถทำเช่นนี้เพื่อ preStatusBarHidden ตามที่ฉันได้ทำไว้สำหรับโครงการ :)
atereshkov

29

ฉันติดตามการกวดวิชานี้และมันก็ใช้ได้สำหรับฉัน อย่างไรก็ตามฉันไม่แน่ใจว่ามีคำเตือนใด ๆ หรือไม่

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • เปิด info.plist และการตั้งค่าของคุณ จะUIViewControllerBasedStatusBarAppearancefalse
  • ในฟังก์ชั่นแรกAppDelegate.swiftซึ่งประกอบด้วยdidFinishLaunchingWithOptionsให้ตั้งค่าสีที่คุณต้องการ

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3 อัพเดท *

    UIApplication.shared.statusBarStyle = .lightContent


11
มีความเฉพาะเจาะจงกับคอนโทรลเลอร์แต่ละมุมมองอย่างไร
Yarneo

4
ตรงนี้เป็นแอพที่สมบูรณ์และนั่นไม่ใช่คำถาม
Anuj

3
ฉันใช้ iOS 8 Swift และ xCode 6.1.1 และเพียงทำตามสองขั้นตอนเหล่านี้ไม่ทำงาน คุณต้องเพิ่มUIApplication.sharedApplication().statusBarHidden = falseใน AppDelegate.swift ได้ทำการเสร็จสิ้นการเปิดตัวด้วยตัวเลือก
Ahmad Amin

ชุดนี้สำหรับแอปพลิเคชันทั้งหมด สำหรับตัวควบคุมมุมมองเฉพาะดูคำตอบแรก มันใช้งานได้สำหรับฉัน
Akshar Patel

Setter สำหรับ 'statusBarStyle' ถูกคัดค้านใน iOS 9.0: การใช้งาน - [UIViewController ที่ต้องการStatusBarStyle]
Oleksandr

22

มีคำตอบนับพันล้านที่นี่ดังนั้นฉันคิดว่าทำไมไม่เพิ่มอีกในรูปแบบของส่วนขยาย (ด้วยความช่วยเหลือจาก@Cœur)

สวิฟท์ 3

ส่วนขยาย:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

การดำเนินงาน:

UIApplication.statusBarBackgroundColor = .blue

2
โปรดทราบว่าวิธีการนี้ถือเป็นการเข้าถึง API ส่วนตัวและอาจหมายความว่าแอปของคุณจะถูกปฏิเสธโดย Apple
JWhitey

หรืออย่างน้อยก็ขึ้นอยู่กับรายละเอียดการใช้งานของ Apple และอาจแตกหักโดยไม่มีการเตือนด้วยการเปลี่ยนแปลงใน iOS
Chris Prince

19

ใน Info.plist ของคุณคุณจะต้องกำหนดลักษณะที่ปรากฏของแถบควบคุมตามค่าใด ๆ

หากคุณกำหนดว่าใช่แล้วคุณควรแทนที่ฟังก์ชันStatusBarStyleที่ต้องการในแต่ละคอนโทรลเลอร์มุมมอง

หากคุณกำหนดว่าไม่ใช่จากนั้นคุณสามารถกำหนดรูปแบบใน AppDelegate โดยใช้

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

7
setStatusBarStyleเลิกใช้แล้วใน iOS 9.0
Jeffrey Neo

@Jeffrey_Neo แม้ว่ามันจะเป็นจริงฉันก็ไม่สามารถทดแทนได้ มันจะมีประโยชน์ที่จะเห็นความคิดเห็นของคุณเป็นคำตอบกับรหัสการทำงาน
dumbledad

15
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}

ใช้valueForKey("statusBar")อาจจะไม่สอดคล้องกับหลักเกณฑ์ของแอปเปิ้ล
Cœur

15

สวิฟท์ 3

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = UIColor.black
} 

นั่นเป็นวิธีแก้ปัญหาสำหรับการตั้งค่าสีพื้นหลังของแถบสถานะสำหรับตัวควบคุมมุมมองเฉพาะ


3
UIView ตอบสนองต่อ backgroundColor ใน Swift เสมอ
Cœur

13

SWIFT 2

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

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

10

การดำเนินการpreferredStatusBarStyleตามที่คุณกล่าวถึงและโทร self.setNeedsStatusBarAppearanceUpdate()ในViewDidLoadและยังอยู่ใน Info.plist ชุดUIViewControllerBasedStatusBarAppearanceไปYES(มันYESโดยค่าเริ่มต้น)

ยังไม่ชัดเจนว่าทำไมมันไม่จำเป็นที่จะต้อง working.I เพื่อตรวจสอบ code.One ข้อเสนอแนะอื่น ๆ ไปกับการทำงานในรหัสและการเปลี่ยนแปลงนี้จะเริ่มต้นเมื่อคุณดูจะได้รับหายไปviewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContentviewWillDisappear


เพียงนำส่วนแรกของคำตอบมาใช้กับฉัน อย่างไรก็ตามฉันไม่ได้เพิ่ม UIViewcontrollerBasedStatusBarAppearance ใน Info.plist มันยังทำงานอยู่
Akshar Patel

10

สำหรับรวดเร็ว 3

.plist

View controller-based status bar appearance = NO

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }

1
ฉันลองวิธีแก้ปัญหาทั้งหมด ... มันใช้ได้กับฉันเท่านั้น !! ฉันไม่รู้ว่าทำไม: D
Khaled Hayek

โชคของการวาด
Giang

Setter สำหรับ 'isStatusBarHidden' เลิกใช้แล้วใน iOS 9.0: การใช้งาน - [UIViewController ชื่นชอบ StatusBarHidden] ...
drew ..

9

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

คุณสามารถดูในภาพด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

StarsView Controller เป็น a CPBaseNavigationControllerและCPBaseNavigationControllerเป็นคลาสย่อยของUINavigationControllerเป็นคลาสย่อยของ

ฉันลองตั้งค่าต่อไป:

  1. ในAppDelegate.swiftfunc didFinishLaunchingWithOptionsเพิ่ม

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    แต่ไม่มีผลกระทบ

  2. ใน StoryBoard ให้ค้นหาBase Tab BarController(ภาพด้านบน) เลือกAttributes Inspectorเปลี่ยนSattus Barคุณสมบัติเป็น. Light Contentso bad ไม่มีผลกระทบ

ป้อนคำอธิบายรูปภาพที่นี่

  1. ล่าสุดฉันได้รับมันในตัวควบคุมการนำทางที่กำหนดเองของฉันCPBaseNavigationControllerเพิ่ม funcpreferredStatusBarStyle

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

    มันใช้งานได้ดี!

นอกจากนี้ยังstatusBarStyleคัดค้านใน 9.0 -[UIViewController preferredStatusBarStyle]คุณสามารถใช้


9

ใช้งานได้กับแอพพลิเคชั่นที่ใช้ระบบนำทาง

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)

จะเพิ่มรหัสเฉพาะนี้ได้ที่ไหนไม่สามารถใช้งานได้
Anuj

คุณสามารถเพิ่มได้ในไฟล์ผู้แทนแอปใน didFinishLaunchingWithOptions
Jio

1
จะดีกว่าไหมถ้าใช้ addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). bounds.width, 20) แทนที่จะเป็นรหัสความกว้าง 320 ฮาร์ดโค้ด?
Torsten Ojaperv

แก้ไข @TorstenOjaperv
Jio

ทำอย่างไรกับ swift 3.0
YETI

8

ทุกอย่างง่ายขึ้นใน Swift 3.0 Xcode 8

การใช้รหัสด้านล่างในไฟล์ Delegate ของแอพหลังจากนั้น

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

แทรกสิ่งนี้:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)

1
ค่าสีแดงสีเขียวและสีน้ำเงินอยู่ในช่วงตั้งแต่ 0 ถึง 1 คุณจะต้องหารด้วย 255 หรือจะไม่ทำงาน
Makalele

8

สวิฟท์ 3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

7

Swift 4สำหรับ ViewController เฉพาะที่ไม่มี navigationViewController ที่ฝังไว้เพียงเพิ่มไฟล์นี้ลงในไฟล์ ViewController ของคุณ

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

หากเรามีตัวควบคุมทิศทางในตัวคุณจะทำอย่างไร
icekomo

7

อีกวิธีที่ง่ายมากที่จะทำให้งานนี้เป็นเพียงการสร้างส่วนขยายของคลาส UINavigationController

ตั้งแต่การเอาชนะpreferredStatusBarStyle:วิธีการจะไม่ทำงานจนกว่าเราจะทำมันภายในคลาส UINavigationController

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

4

ฉันได้ตั้งค่าสีเฉพาะ (ในรูปแบบ RGB) โดยใช้รหัสด้านล่างในApp Delegateไฟล์:

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

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

คุณต้องเพิ่มรหัสด้านล่างในInfo.plistไฟล์:

ดูลักษณะแถบสถานะตามคอนโทรลเลอร์โดยตั้งค่าบูลีนเป็นNO

ภาพหน้าจอ 1

ภาพหน้าจอ 2


ด้วย Siwft 3.0 จะทำอย่างไร?
YETI

4

ฉันขอแนะนำให้คุณใช้วิธีที่ง่ายกว่า

  1. เพียงแค่เรียกsetNeedsStatusBarAppearance อัปเดตใน viewDidLoad ตามที่เอกสารของ Apple ระบุ

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

  1. Implement preferredStatusBarStyleกลับประเภทที่คุณต้องการ

มันใช้งานได้สำหรับฉันใน iOS 10.1

วัตถุประสงค์ C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

รวดเร็ว

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

ฉันประหลาดใจที่ไม่มีใครชี้เรื่องนี้ อย่างไรก็ตามเพลิดเพลินไปกับ :)


4

ฉันมีปัญหากับอันนี้ ฉันรู้สึกไม่ดีเลยเกี่ยวกับการเปลี่ยนสีของแถบสถานะในมุมมองทั่วโลกและจากนั้นการเปลี่ยนกลับในมุมมองก็หายไปเหมือนคำตอบที่ยอมรับ เชื่อหรือไม่ว่าคุณจะสามารถทำงานได้ด้วยการเอาชนะpreferredStatusBarStyleตัวควบคุมมุมมองที่คุณต้องการ หลังจากเวลามากนี่คือสิ่งที่ฉันทำเพื่อให้มันทำงาน:

  1. เปลี่ยนลักษณะที่ปรากฏบนแถบสถานะของตัวควบคุมในคุณinfo.plistเป็นใช่
  2. preferredStatusBarStyleตอนนี้ตัวควบคุมมุมมองแบบเต็มหน้าจอสามารถเปลี่ยนลักษณะแถบสถานะโดยการเอาชนะ
  3. ฉันระบุแบบเต็มหน้าจอเพราะจะไม่สามารถใช้งานได้กับตัวควบคุมมุมมองกิริยา (ไม่ใช่แบบเต็มหน้าจอ) ไม่ใช่โดยไม่ตั้งค่าmodal​Presentation​Captures​Status​Bar​Appearanceเป็นใช่นั่นคือ
  4. นอกจากนี้หากคุณมีตัวควบคุมมุมมองแบบฝังตัวเช่นในตัวควบคุมการนำทางตัวอย่างเช่นมันจะถามตัวควบคุมมุมมองด้านบนสุดสำหรับสไตล์แถบสถานะ การเอาชนะchild​View​Controller​For​Status​Bar​Styleและผ่านตัวควบคุมมุมมองแบบฝังตัวนั้นน่าจะใช้ได้ แต่ก็ไม่เหมาะสำหรับฉัน ดังนั้นฉันเพิ่งส่งคืนตัวควบคุมมุมมองแบบฝังที่ต้องการเป็นแถบสถานะที่ต้องการ บางสิ่งเช่นนี้

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }

คำตอบนี้ช่วยฉันได้! ฉันพบว่าด้วยเหตุผลบางประการตัวควบคุมการนำทางของฉัน (ถูกนำเสนอแบบ modally) ไม่ได้ขอให้ตัวควบคุมมุมมองบนสุดสำหรับสไตล์แถบสถานะ ดังนั้นผมจึงต้องซับคลาสUINavigationControllerและแทนที่child​View​Controller​For​Status​Bar​Stylevar self.topViewControllerในนั้นกลับมา
Taber

3

ใน Swift 4 หรือ 4.2

คุณสามารถเพิ่มใน vc ของคุณ

preferredStatusBarStyle

และตั้งค่าส่งคืนเป็น

.lightContent หรือ. default

อดีต:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

3

(ณ วันที่ 10 มิถุนายน 2020)

Swift 5 ( ไม่ต้องแก้ไข.Plistไฟล์ )

หากคุณใช้Storyboardไปที่NavigationControllerเลือกnavigationBarคลิกแล้วเปลี่ยนAttributes Inspector styleถ้าคุณต้องการlight content( แถบสถานะสีขาว ) ตั้งค่าอะไรนอกจากdefaultช่วยให้รูปแบบชุดพูดblackและถ้าคุณต้องการdark content ( แถบสถานะสีดำ ) defaultตั้งค่า

ค่าเริ่มต้น ( UIBarStyleDefault) ส่งผลให้UIStatusBarStyleDefaultแถบสถานะส่วนหน้ามืด และUIBarStyleBlackจะให้UIStatusBarStyleLightContentแถบสถานะ

programatically

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

ไม่มีแถบนำทาง ( แก้ไข.Plist )

เพิ่ม UIViewControllerBasedStatusBarAppearance / View controller-based status bar appearanceที่คุณและค่าที่ตั้งไว้คือinfo.plisttrue

OverridepreferredStatusBarStyleคุณสมบัติในการควบคุมของคุณ

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}

2

อัพเดต Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

2

สิ่งที่ทำงานร่วมกับฉันใน Storyboard ไปที่ตัวควบคุมการนำทางเลือกแถบการนำทางคลิกที่ตัวตรวจสอบคุณสมบัติแล้วเปลี่ยนรูปแบบจากค่าเริ่มต้นเป็นสีดำ แค่นั้นแหละ!


2

SWIFT 4.2 สวัสดีฉันต้องการแบ่งปันวิธีแก้ปัญหาที่ทำงานให้ฉันซึ่งฉันได้รับจากบทความที่ยอดเยี่ยมเกี่ยวกับเรื่องที่ยากลำบากนี้โดย Graig Grummitt

ขั้นตอนที่ 1 ตามที่คนอื่น ๆ ได้กล่าวถึงเพิ่มด้านล่างให้กับ PLIST ของคุณ

View controller-based status bar appearance YES

ขั้นตอนที่ 2 ใน RootViewcontroller เพิ่มด้านล่าง

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

เมื่ออัพเดตคุณสมบัติstatusBarHiddenหรือvcStatusBarStyleจะเรียกใช้setNeedsStatusBarAppearanceUpdate()และจะอัปเดตแถบสถานะด้วยค่าใหม่สำหรับprefersStatusBarHiddenหรือpreferredStatusBarStyleหรือในสถานการณ์ของฉันฉันต้องอัปเดตคุณสมบัติเหล่านี้สำหรับคอนเทนเนอร์ viewcontroller นั่นคือพาเรนต์ของ childviewcontroller ที่มองเห็นได้ ฉันทำสิ่งนี้โดยใช้วิธีการมอบหมายอย่างง่าย

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

Ofcourse เมื่อสร้างอินสแตนซ์ childViewController (Visible VC) อย่าลืมตั้งค่า MainViewcontroller (Container VC) เป็นตัวแทน บางครั้งฉันก็ทำ :)

childViewController.delegate = self

จากนั้นใน childViewController ฉันเพิ่งเรียกเมธอดมอบหมายเมื่อจำเป็นเพื่ออัพเดตแถบสถานะ

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

ดังกล่าวข้างต้น Graig Grummitt ไปลงรายละเอียดเพิ่มเติมเกี่ยวกับโซลูชันนี้และยังทำงานกับ UINavigationControllers เช่นกัน ลิงค์ที่นี่: กรณีลึกลับของแถบสถานะ


1

คลิกที่กลุ่มไฟล์สนับสนุน (ด้านบนซ้าย - ชื่อโครงการของคุณ) นำทางไปยังข้อมูล คลิกที่ + บางรายการระหว่างรายการเช่นด้านล่างชื่อชุดข้อมูล และเพิ่ม "ดูแถบสถานะที่ใช้ตัวควบคุมดู" และตั้งเป็น NO จากนั้นเปิด AppDelegate.swift และแก้ไขดังนี้:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

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

return true
}

แค่นั้นแหละ.


คุณอ่านคำถามผิด ฉันถามเกี่ยวกับวิธีการเปลี่ยน StatusBarStyle สำหรับ viewcontrollers เฉพาะไม่ใช่สำหรับแอปพลิเคชันที่สมบูรณ์
Anuj

ตรวจสอบคำตอบของฉันด้านล่าง @Anuj
theCrab

1

สำหรับ Xcode 10 คุณสามารถสร้างคลาสและวางไว้ก่อนคลาส viewController ของคุณคุณสามารถเรียกคลาสนี้ได้ในทุกมุมมองคอนโทรลเลอร์จำเป็นต้องมีแถบสถานะเนื้อหาเบา ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

ตอนนี้เปลี่ยนคลาส viewController ของคุณใน:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

และนั่นคือทั้งหมด ...


1

ใช้งานได้กับการนำทางอิงจากตัวควบคุมมุมมองเฉพาะใน swift4

   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

1

คำเตือน


Setter สำหรับ 'statusBarStyle' เลิกใช้แล้วใน iOS 9.0: Use - [UIViewController ที่ต้องการStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

ดังนั้นวิธีการแก้ปัญหาของฉันเป็นดังนี้: ทำส่วนขยายจากตัวควบคุมการนำทาง:

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

        return .default
    }
}

และถ้าคุณมี viewController ที่จะมีสไตล์อื่นนอกเหนือจากสไตล์ของแอพคุณสามารถสร้างมันได้

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

ให้บอกว่าสไตล์แอพของคุณคืออะไร.defaultและคุณต้องการให้หน้าจอนี้เป็นแบบ.lightContent นั้น barStyle จะใช้.lightContentเป็นค่าเริ่มต้นซึ่งจะเปลี่ยนสไตล์ของแถบสถานะเป็น lightContent จากนั้นตรวจสอบให้แน่ใจว่าเมื่อviewWillDisappearเปลี่ยน barStyle อีกครั้งกับสไตล์แถบสถานะของแอป .defaultซึ่งในกรณีของเราคือ

มันใช้งานได้สำหรับฉัน


1

สีที่กำหนดเองสำหรับแถบสถานะ (iOS11 +, Swift4 +)

หากคุณกำลังมองหาวิธีการเปลี่ยนแถบสถานะเป็นสีที่คุณกำหนดเองนี่เป็นวิธีแก้ปัญหาที่ใช้งานได้

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.