วิธีการตั้งค่า Status Bar Style ใน Swift 3


186

ฉันใช้ Xcode 8.0 beta 4

ในเวอร์ชันก่อนหน้า UIViewController มีวิธีการตั้งค่าสไตล์แถบสถานะ

public func preferredStatusBarStyle() -> UIStatusBarStyle

อย่างไรก็ตามฉันพบว่ามันเปลี่ยนเป็น "Get varaiable ONLY" ใน Swift 3

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

ฉันจะจัดเตรียมสไตล์ที่จะใช้ใน UIViewController ของฉันได้อย่างไร


ลองสิ่งนี้ var PreferredStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

คำตอบ:


485

[อัพเดท] สำหรับ Xcode 10+ และ Swift 4.2+

นี่เป็นวิธีที่ต้องการสำหรับ iOS 7 ขึ้นไป

ในใบสมัครของคุณInfo.plistตั้งไปView controller-based status bar appearanceYES

แทนที่preferredStatusBarStyle ( Apple เอกสาร ) ในตัวควบคุมมุมมองของคุณ ตัวอย่างเช่น:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

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

iOS ก่อนเวอร์ชั่น 7 วิธีเลิก

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

หากใบสมัครของคุณจะให้การสนับสนุนในของแอพลิเคชันของคุณInfo.plistตั้งไปView controller-based status bar appearanceNO

ในappDelegate.swiftการdidFinishLaunchingWithOptionsฟังก์ชั่นเพิ่ม:

UIApplication.shared.statusBarStyle = .lightContent

สำหรับตัวควบคุมการนำทาง

ถ้าคุณใช้ควบคุมการนำและคุณต้องการสไตล์แถบสถานะที่ต้องการของแต่ละตัวควบคุมมุมมองที่จะนำมาใช้และการตั้งค่าView controller-based status bar appearanceไปYESในใบสมัครของคุณinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

3
ได้ผลสำหรับฉัน ลืมใส่การตั้งค่าใหม่เข้าไปใน Info.plist ก่อน
falsecrypt

1
@LightMan uiapplication statusBarStyle ไม่ได้เลิกฉันใช้มันใน iOS 11 และใช้งานได้
Sushobhit

1
@Sushobhit setStatusBarStyle เลิกใช้แล้วใน iOS 9 ตามที่ใช้ในคำตอบนี้ แต่คุณยังคงมี UIApplication.statusBarStyle เป็นคุณสมบัติอ่านอย่างเดียว
LightMan

1
มีหลายครั้งที่คุณต้องการตั้งค่าโดยทางโปรแกรมเนื่องจากสีของแต่ละมุมมอง
Alejandro Cavazos

9
คุณยังสามารถลบบรรทัดใน appDelegate.swift และไปที่เป้าหมาย -> ทั่วไป -> ข้อมูลการปรับใช้ -> สไตล์แถบสถานะ -> แสง
Robert Veringa

162

อัพเดทล่าสุด (Xcode 10+ / Swift 4.2+)

บทความนี้ไม่เป็นอันตรายสำหรับทุกคนที่ยินดีที่จะเข้าใจตรรกะที่อยู่เบื้องหลังวิธีการต่าง ๆ ที่นำเสนอสำหรับหลายปีที่ผ่านมา ในขณะเดียวกันตั้งแต่Xcode 10 แนวทางแรกของ Swift 4.2 จะถูกคัดค้านและไม่ได้รับการสนับสนุนอีกต่อไป (เช่นจะไม่มีผลหากคุณพยายามใช้งาน) มันยังคงถูกเรียกสำหรับข้อมูลของคุณเพื่อทำความเข้าใจเกี่ยวกับเหตุผลที่อยู่เบื้องหลังการPlist.infoตั้งค่าสถานะและการปรับแต่งการปฏิบัติที่ดีขึ้น

การชี้แจงที่สำคัญ

มันสำคัญมากที่จะต้องเข้าใจสองวิธีในการปรับแต่งลักษณะที่ปรากฏของแถบสถานะ พวกเขาแตกต่างกันและไม่ควรผสม

วิธีการแรก - สีเดียวสำหรับทั้งแอป (เลิกใช้ตั้งแต่ iOS7)

ใน info.plist คุณจะค้นหาหรือสร้างรหัสที่เรียกว่า

View controller-based status bar appearance

และตั้งค่าให้NO

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

ให้เป็นหนึ่งในชุดของเหล่านี้ขึ้น ( หนึ่งในการตั้งค่าสำหรับหน้าจอทั้งหมด ):

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

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

วิธีที่สอง - แต่ละสีสำหรับแต่ละมุมมองคอนโทรลเลอร์

นี่คือสิ่งที่ตรงกันข้าม เพื่อให้มันใช้งานได้โปรดไปที่ info.plist และตั้งค่า

View controller-based status bar appearance

ถึงใช่

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

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

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

UIKit มีการเรียกคุณสมบัตินี้ในสองสถานการณ์:

  1. เมื่อเริ่มต้นของหน้าจอเมื่อ UI กำลังเตรียม
  2. เมื่อโทรเข้ามาsetNeedsStatusBarAppearanceUpdate()ในรหัส

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

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

จากนั้นเมื่อใดก็ตามที่คุณโทรtoggleAppearance()การเปลี่ยนรูปแบบของแถบสถานะจะถูกเรียกใช้

วิธีที่สาม - แฮ็ค!

มีแฮ็คที่อนุญาตให้เข้าถึงแถบสถานะโดยตรง:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = UIColor.blue
    }
    
    return true
}

ทำไมแฮ็ค หากคุณต้องการสีแถบสถานะอื่นที่ไม่ใช่สีดำหรือสีขาวคุณใช้ API ที่ไม่มีเอกสาร คุณได้รับstatusBarวัตถุโดยใช้ KVC และตั้งค่าสีพื้นหลัง วัตถุที่คุณได้มาด้วยวิธีนี้คือUIStatusBarซึ่งได้มาจากUIViewและจึงสนับสนุนbackgroundColorคุณสมบัติตามธรรมชาติ สิ่งนี้สกปรกไม่ถูกกฎหมาย แต่จนถึงตอนนี้ก็เป็นวิธีเดียวในการตั้งค่าสีที่กำหนดเองสำหรับแถบสถานะ (ไม่ได้คำนึงถึงUINavigationBarวิธีการทางบัญชีซึ่งช่วยให้สามารถปรับแต่งรูปลักษณ์ของแถบนำทาง + สถานะทั้งหมด) อาจทำให้แอปของคุณถูกปฏิเสธ แต่บางทีคุณอาจโชคดี และหากคุณอยู่ในสถานการณ์ที่ซับซ้อนบางอย่าง (เช่นลำดับชั้นของซ้อนกันการนำทางของเด็กและตัวควบคุมมุมมอง) สิ่งนี้อาจเป็นเพียงวิธีเดียวหรืออย่างน้อยก็เป็นวิธีที่ยุ่งยากน้อยกว่าในการปรับแต่งลักษณะแถบสถานะ (ตัวอย่างเช่นเพื่อทำให้โปร่งใส)

Xcode 10+, Swift 4.2

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


โบนัส

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

extension UIViewController {
    func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
            statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
            statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
        }
    }
}

2
เมื่อคุณมีแถบสถานะคุณสามารถทำสิ่งนี้ได้: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); หรือใช้คีย์ที่มีอยู่เพื่อตั้งค่าคุณสมบัติใด ๆ ที่พร้อมใช้งานสำหรับ UIStatusBar แต่ไม่ใช่สำหรับ UIView
ทำเครื่องหมาย

application.statusBarStyle = .lightContent วิธีการนี้โดยทั่วไปตั้งแต่ iOS9> Setter สำหรับ 'statusBarStyle' ถูกคัดค้านใน iOS 9.0: การใช้งาน - [UIViewController ที่ต้องการ
StatusBarStyle

นี่เป็นเพียงการทำงานที่นี่เมื่อเปลี่ยนธีมสีของแอป อย่างไรก็ตามดูเหมือนว่าเมื่อมีการตั้งค่านี้คุณจะต้องรีเซ็ตเสมอเมื่อเปลี่ยนมุมมองตัวควบคุม เมธอด PreferredStatusBarStyle () จะถูกละเว้นจากที่นี่ใน (แม้จะมีการตั้งค่าที่เหมาะสมใน info.plist)
ไม่ใช่

2
คำตอบนี้มีความหมายมากกว่าเมื่อเปรียบเทียบกับคนอื่น ๆ
ViruMax

2
โบนัสโซลูชั่นแตกใน iOS 13.1
ViruMax

130

คุณสามารถลองแทนที่ค่าที่ส่งคืนแทนที่จะตั้งค่า วิธีการประกาศเป็น {รับ} ดังนั้นเพียงแค่ให้ทะเยอทะยาน:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

หากคุณตั้งค่าตามเงื่อนไขนี้คุณจะต้องโทรหาsetNeedsStatusBarAppearanceUpdate()เพื่อให้ภาพเคลื่อนไหวนั้นเปลี่ยนแปลงเมื่อคุณพร้อม


2
นี่เป็นวิธีที่ดีกว่าเนื่องจากคุณสามารถเลือกprefersStatusBarHiddenมุมมองของคุณได้ หากคุณกำลังจะไปกับUIApplication.shared.statusBarStyleคุณจะติดอยู่กับมัน
superarts.org

105

Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
สำหรับฉันวิธีนี้ใช้ไม่ได้:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

เมื่อฉันใช้แต่ละตัวควบคุมมุมมอง แต่สิ่งนี้ได้ผล:

  • ในไฟล์ info.list เพิ่มแถว: View controller-based status bar appearanceและตั้งเป็นNO

  • ถัดไปในแอปที่ได้รับมอบหมาย:

    UIApplication.shared.statusBarStyle = .lightContent

ฉันพยายามหลังจากเพิ่มรหัสไปยังตัวแทนแอปเท่านั้น แต่การตั้งค่า Plist ข้อมูลมีประโยชน์สำหรับฉัน ขอบคุณ
Akhilesh Sharma

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

33

หากคุณต้องการเปลี่ยนstatusBarสีเป็นสีขาวสำหรับทุกมุมมองที่มีอยู่ใน a UINavigationControllerให้เพิ่มส่วนนี้ไว้ภายในAppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

รหัสนี้:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

ใช้ไม่ได้กับที่UIViewControllersอยู่ใน a UINavigationControllerเพราะคอมไพเลอร์มองหาstatusBarStyleของUINavigationControllerไม่ใช่สำหรับstatusBarStyleของViewControllersที่มีอยู่โดยมัน

หวังว่านี่จะช่วยให้ผู้ที่ไม่ประสบความสำเร็จกับคำตอบที่ยอมรับ!


ใช่ขอบคุณมาก! ตัวควบคุมการนำทางเป็นความแตกต่างเล็กน้อยที่หลายคนไม่พิจารณา!
Alexis Candelaria

26

หากคุณต้องการเปลี่ยนรูปแบบแถบสถานะเมื่อใดก็ตามที่มุมมองปรากฏขึ้นคุณสามารถใช้สิ่งนี้:

  • ในไฟล์ info.list เพิ่มแถว: ดูลักษณะของแถบสถานะตามคอนโทรลเลอร์และตั้งค่าเป็นYES

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
และIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G

26

Xcode 10 หรือใหม่กว่า

ทดสอบใน Swift 5

ไม่จำเป็นต้องใช้รหัสเพียงทำตามขั้นตอนด้านล่าง

หากคุณต้องการเปลี่ยนแถบสถานะในแอพทั้งหมด

  1. เลือก Project จาก Project Navigator (แผงด้านซ้าย)
  2. เลือกเป้าหมาย
  3. เลือกแท็บทั่วไป
  4. ค้นหาข้อมูลการปรับใช้
  5. เปลี่ยนสไตล์แถบสถานะเป็นLight (สำหรับพื้นหลังสีเข้ม"Light" , พื้นหลังสีอ่อน"Default" )

อย่าลืม info.plist การเปลี่ยนแปลง

  1. เลือกแท็บข้อมูล
  2. เพิ่มคีย์นี้ลงในไฟล์ plist ของคุณ "ดูลักษณะแถบสถานะตามคอนโทรลเลอร์" = NO

เรียกใช้โครงการของคุณและตรวจสอบ

โครงการของฉันใน swift 5 และ Xcode 10.2 & 11.0


สำหรับ Xcode 10 / Swift5 นี่ควรเป็นคำตอบที่ยอมรับได้ คุณต้องทำตามขั้นตอนทั้งสองเพื่อให้สิ่งนี้ทำงานได้
John Robi

สมบูรณ์ ขอบคุณ! ฉันยอมรับว่านี่ควรเป็นคำตอบที่ยอมรับได้จริง
DungeonDev

นี่เป็นคำตอบที่สมบูรณ์แบบ🤟🏻
nikhilgohil11

ทั้งหมดนี้ใช้งานได้กับ xcode 11 ด้วย swift 5 ขอบคุณ
Luis Santiago

25

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

View controller-based status bar appearance ด้วยค่าบูลีนตั้งเป็น NO

ในคลาส appdelegate ของคุณด้วยdidFinishLaunchingWithOptionsวิธีก่อนส่งคืน

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

เปลี่ยนbackgroundColorและstatusBarStyleตามความต้องการ


วิธีแก้ปัญหาที่ดี แต่สิ่งนี้นับเป็นการใช้ API ส่วนตัวหรือไม่
GoldenJoe

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

@MohanSrinivasan แทน "UIColor.red" คุณสามารถระบุสีที่คุณกำหนดเองได้
Himanshu padia

13

คุณสามารถทำได้ในกระดานเรื่องราว

  1. สร้างรายการใหม่ใน info.plist "ดูลักษณะแถบสถานะตามคอนโทรลเลอร์" ตั้งเป็น "YES"
  2. ไปที่กระดานเรื่องราวของคุณแล้วเลือกตัวควบคุมทิศทางที่คุณต้องการเปลี่ยน คลิกที่แถบนำทางจากส่วนเค้าร่างเอกสารสตอรีบอร์ด (แผงด้านซ้ายบนกระดานเรื่องราว)
  3. ไปที่แผงด้านขวาและคลิกส่วนแอตทริบิวต์
  4. ใต้ส่วนแถบนำทางคุณจะเห็นสไตล์ เลือกสไตล์ที่คุณต้องการ (ค่าเริ่มต้นคือสีดำและสีดำเป็นสีขาว)

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

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

(เสร็จสิ้นด้วย Xcode 8.3.3 ในโครงการ Swift ทั้งหมด)


"ดูลักษณะแถบสถานะตามตัวควบคุม" ควรตั้งค่าเป็น "ไม่"
Willjay

2
วิธีที่สะอาดมากในการตั้งค่าสไตล์แถบสถานะตามเนื้อหาของ View Controller ซึ่งเป็นวิธีที่ถูกต้องแทนที่จะเพียงแค่ตั้งค่าView controller-based status bar appearance = NOและต้องใช้สไตล์แบบแสงหรือมืดเท่านั้นในแอปทั้งหมด เป็นเรื่องที่น่าเสียดายที่วิธีการ "ไร้รหัส" นี้ใช้งานได้เฉพาะในตัวควบคุมการนำทาง Apple ควรพิจารณาเพิ่มเขตข้อมูลอื่นสำหรับการตั้งค่าตัวเลือกนี้ภายในอินสแตนซ์มุมมองตัวควบคุมใด ๆ
aldoram5

12

สำหรับผู้ที่ต้องการเปลี่ยนแถบสถานะสำหรับ viewcontrollers ทั้งหมดบน: iOS 11 โซลูชัน Swfit 4/5 นั้นค่อนข้างง่าย

1) Info.plist เพิ่ม:

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

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

หากคุณต้องการเปลี่ยนแถบสถานะสำหรับviewcontrollerเพียงตัวเดียวให้เพิ่ม viewDidLoad:

2.1 ) Info.plist

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

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Objective-C (หรือการตอบสนองพื้นเมือง) การเปลี่ยนแปลงจากตัวแทนที่ได้รับ:

1) Info.plist เพิ่ม:

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

2) AppDelegate -> ทำเสร็จแล้วเปิดใช้งานด้วยตัวเลือก

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

การเปลี่ยนแถบสถานะไม่ทำงานพยายามที่จะผลักดัน (ตัวควบคุมการนำทาง) เฉพาะในการนำเสนอตัวควบคุม viewally modally


8

ขั้นตอนแรกคุณต้องเพิ่มแถวพร้อมคีย์: View controller-based status bar appearanceและค่าNOลงในInfo.plistไฟล์ หลังจากนั้นให้เพิ่ม 2 ฟังก์ชั่นในคอนโทรลเลอร์ของคุณให้เจาะจงเฉพาะคอนโทรลเลอร์ที่จะมีผล:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

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

6

สวิฟท์ 3

ใน Info.plist เพิ่มแถวที่เรียกว่า "ดูตัวควบคุมตามแถบสถานะลักษณะ" Noและการตั้งค่าของ

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

ดูเหมือนจะมีปัญหาเล็กน้อยเกี่ยวกับสีข้อความของแถบสถานะเมื่อจัดการกับแถบนำทาง

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

ตัวอย่างเช่น:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

และ

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

รหัสด้านบนใช้ไม่ได้แม้ว่าคุณจะตั้งค่าต่อไปนี้ใน AppDelegate:

UIApplication.shared.statusBarStyle = .lightContent

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

nav?.barStyle = UIBarStyle.black

เมื่อสไตล์บาร์เป็นสีดำมันจะฟังตัวแปรที่คุณเขียนทับ หวังว่าจะช่วยให้ใครบางคน :)


6

หากต้องการเพิ่มผู้เยี่ยมชม asnwer โดย @Krunal https://stackoverflow.com/a/49552326/4697535

ในกรณีที่คุณกำลังใช้UINavigationControllerที่preferredStatusBarStyleจะต้องไม่มีผลกระทบต่อUIViewControllerจะต้องไม่มีผลกระทบต่อ

Xcode 10 และ Swift 4

ตั้งค่าที่กำหนดเอง UINavigationController

ตัวอย่าง:

class LightNavigationController: UINavigationController {

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

ใช้ส่วนขยายสำหรับโซลูชันระดับแอป:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}

5

Xcode 8.3.1, Swift 3.1

  1. สร้างรายการใหม่ใน info.plist "ดูลักษณะของแถบสถานะตามคอนโทรลเลอร์" ตั้งเป็น "ไม่"

  2. เปิด AppDelegate.swift และเพิ่มบรรทัดเหล่านี้ในวิธี "didFinishLaunchingWithOptions"

application.statusBarStyle = .lightContent


5

Swift 4+

สำหรับข้อความแถบสถานะสีขาว:

navigationController.navigationBar.barStyle = .blackTranslucent

5

นี่คือแนวทางของ Apple / คำแนะนำเกี่ยวกับการเปลี่ยนสไตล์ของแถบสถานะ

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

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

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

รวดเร็ว

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

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

  1. การตั้งค่าUIViewControllerBasedStatusBarAppearanceไปYESใน.plistแฟ้มถ้าคุณจำเป็นต้องตั้งค่าสถานะสไตล์บาร์ในระดับ UIViewController เท่านั้น
  2. ในฟังก์ชั่นเพิ่ม viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. แทนที่ที่ต้องการStatusBarStyleในตัวควบคุมมุมมองของคุณ

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

รวดเร็ว

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

ตั้งค่าเป็น. plist ตามระดับการตั้งค่าสไตล์แถบสถานะ

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


4

Swift 4.0 โปรดใช้รหัสนี้ใน "didFinishLaunchingWithOptions launchOptions:" คลาส Appdelegate

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

4

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}

'blackOpaque' ใช้งานไม่ได้: ใช้ UIStatusBarStyleLightContent
Makalele

3

สิ่งนี้ใช้ได้สำหรับฉัน

ตั้งค่าView controller-based status barลักษณะที่ปรากฏให้เป็นNO โดยใช้ Plist จากนั้นใน UIViewController viewDidAppearเพิ่งเพิ่มบรรทัดต่อไปนี้

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

setStatusBarStyle เลิกใช้แล้วใน iOS 9
Lastmboy

3

สวิฟท์ 3

ถ้าดูลักษณะแถบสถานะตามตัวควบคุม = ใช่ใน Info.plist

จากนั้นใช้ส่วนขยายนี้สำหรับ NavigationController ทั้งหมด

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

หากไม่มี UINavigationController และมีเพียง UIViewController ให้ใช้โค้ดด้านล่าง:

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

2
ไม่ได้ผลสำหรับฉัน ฉันได้รับข้อผิดพลาด "Property ไม่ได้แทนที่คุณสมบัติใด ๆ จาก superclass ของมัน" และ "Getter สำหรับ 'PreferredStatusBarStyle' พร้อมด้วย Objective-C selector 'PreferredStatusBarStyle' ขัดแย้งกับการประกาศก่อนหน้าด้วยตัวเลือก Objective-C เดียวกัน"
Theo

ขอบคุณสำหรับสิ่งนี้หลังจากความพยายามที่แตกต่างกันถึง 20 ครั้งและมีรายการรวมกันสองสามรายการที่จะลองทำนี่คือวิธีการตั้งค่าสีแถบสถานะ ฉันต้องจำไว้ว่าต้องเรียก setNeedsStatusBarAppearanceUpdate () เมื่อฉันต้องการเปลี่ยนสีเมื่อฉันเพิ่มโหมดกลางคืนและสีดำบนพื้นดำก็ไม่ทำงาน
Stuart P.

3

สวิฟท์ 5

หากต้องการเพิ่มรายละเอียดเพิ่มเติมสำหรับคำตอบของ PRAVEENที่https://stackoverflow.com/a/40066798/2082851ฉันต้องการให้การดำเนินการของฉัน สนับสนุนความยืดหยุ่นในการปรับแต่งแถบสถานะของคอนโทรลเลอร์แต่ละตัว

โดยรวมแล้วเราจะสร้างBaseViewControllerที่จัดการstatusBarStyleทรัพย์สินในทุกกรณี เมื่อคุณสร้างตัวควบคุมใหม่ทำให้มันเป็นคลาสย่อยของตัวควบคุมฐานนี้

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

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

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

การสาธิต

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

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

2 UINavigationController

สำหรับUINavigationControllerมันเป็นกรณีพิเศษที่คุณสามารถทำตามวิธีแก้ปัญหาทั้งสอง:

โซลูชัน A: แทนที่ด้วยการแจกจ่ายข้อความ

เนื่องจาก UINavigationController เป็นNSObjectและสืบทอดมาObjectiveCเมธอดจึงเป็นmessage dispatchและคุณสามารถแทนที่ได้

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

โซลูชัน B: สร้างUINavigationControllerคลาสย่อย

หากคุณมีกำหนดเองอยู่แล้วUINavigationController(ซึ่งโดยปกติจะต้องควบคุมข้อกำหนดเพิ่มเติม) นี่เป็นทางออกที่ดีที่สุดสำหรับคุณ

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

คุณสามารถใช้คุณสมบัติบูลชื่อ "shouldStatusBarDark" เพื่อสลับสีแถบสถานะของคุณ และคุณยังสามารถอัปเดตค่าเพื่อเปลี่ยนสีแถบสถานะเมื่อคุณเลื่อน

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }

คุณสมบัติ navView คืออะไร ขอบคุณที่แบ่งปันโซลูชันของคุณ
medskill

1
@medskill navView เป็นเพียงแถบการนำทางเลียนแบบที่เพิ่มโดยทางโปรแกรม
tiantong

2

คำตอบส่วนใหญ่เหล่านี้เป็นสิ่งเดียวกันที่แฮชอีกครั้ง แต่ไม่มีคำตอบใดที่อยู่บนหน้าจอเรียกใช้สำหรับฉันเมื่อใช้พื้นหลังสีดำ

ฉันได้สิ่งนี้โดยทำสิ่งต่อไปนี้info.plistซึ่งสร้างแถบสถานะแบบแสง

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

หากคุณได้รับคำเตือน: Setter สำหรับ 'statusBarStyle' ถูกเลิกใช้แล้วใน iOS 9.0: ใช้ - [UIViewController preferStatusBarStyle]แล้วให้ตั้งค่าแถบสถานะให้สว่างหรือมืดใช้รหัสต่อไปนี้:

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

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

NB คุณต้องให้แน่ใจว่าคุณได้กำหนดไว้ใน info.plist ของคุณ

View controller-based status bar appearance to YES

2

หากคุณใช้งานนำเสนอเป็นกิริยาช่วยคุณต้องตั้งค่า:

viewController.modalPresentationCapturesStatusBarAppearance = true


0

สำหรับวัตถุประสงค์ C เพียงเพิ่มบรรทัดนี้ในแอปพลิเคชันของคุณ didFinishLaunch วิธีการ

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
สิ่งนี้เลิกใช้แล้วตั้งแต่ iOS 9
MK_Dev

0

ใช้ WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

3
รวดเร็ว 9.3 ปีที่ไม่ถูกต้องมาร์ตี้
iOS ยูนิต

ฉันแนะนำให้อยู่ห่างจากการใช้ API ส่วนตัวสำหรับ exaple "statusBar" Apple ทำการเปลี่ยนแปลงใน API ทุกครั้ง! และเมื่อแอปเปิ้ลเปลี่ยน API ของคุณแอปของคุณอาจพังและมันจะไม่เปลี่ยนแถบสถานะอีกต่อไป สิ่งนี้จะทำให้คุณค้นหาโซลูชันอื่นอีกครั้ง
Doci

0

หากคุณยังไม่สามารถเปลี่ยนรูปแบบแถบสถานะบนวิธีการ

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

คุณอาจลองใช้วิธีนี้:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.