UIStatusBarStyle PreferredStatusBarStyle ไม่ทำงานบน iOS 7


110

ในการประยุกต์ใช้ iPhone ของฉันสร้างขึ้นด้วย Xcode 5 สำหรับ iOS 7 ผมชุดUIViewControllerBasedStatusBarAppearance=YESในinfo.plistและในของฉันViewControllerฉันมีรหัสนี้:

-(UIStatusBarStyle) preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

แต่แถบสถานะยังคงเป็นสีดำตัดกับพื้นหลังสีดำ

ฉันรู้ว่ามันเป็นไปได้ที่จะเปลี่ยนนี้ app กว้างโดยการตั้งค่าUIViewControllerBasedStatusBarAppearance=NOในinfo.plistแต่จริง ๆ แล้วฉันต้องการที่จะปรับเปลี่ยนนี้บนviewControllerโดยviewControllerพื้นฐานที่รันไทม์


สวัสดีฉันมีปัญหาเดียวกันกับที่คุณพูดถึงในคำถาม คุณได้รับการแก้ปัญหาหรือไม่? โปรดระบุที่
Noundla Sandeep

คำตอบ:


281

ฉันค้นพบว่าถ้า ViewController ของคุณอยู่ใน navigationController ดังนั้น navigationController จะnavigationBar.barStyleกำหนด statusBarStyle

การตั้งค่า navigationBar ของคุณbarStyleเพื่อUIBarStyleBlackTranslucentจะให้ข้อความแถบสถานะสีขาว (ie. UIStatusBarStyleLightContent) และUIBarStyleDefaultจะให้สถานะสีดำข้อความบาร์ (ie. UIStatusBarStyleDefault)

หมายเหตุว่านี้ใช้แม้ว่าคุณทั้งหมดเปลี่ยนสี navigationBar barTintColorผ่านทางของมัน


มันสมเหตุสมผลสำหรับฉัน ... เยี่ยมมาก
Nick

14
ฉันเชื่อว่าเป็นเพราะพวกUINavigationControllerเขาpreferredStatusBarStyleไม่ได้โทรผ่านไปยัง ViewController ซึ่งโฮสต์ไว้และเพียงแค่ส่งคืนตาม navigationBarStyle
mxcl

ในกรณีนี้มุมมองไม่ได้อยู่ในตัวควบคุมการนำทาง
Andrew Smith

ง่ายมากที่จะคิดว่าสไตล์แท่งจะชอบวิธีการใช้งานในตัวควบคุมมุมมองและเมื่อนำเสนอมุมมองแบบโมดอลเท่านั้น!
Matej

3
UIBarStyleBlackTranslucent เลิกใช้แล้วให้ใช้UIBarStyleBlackแทน
Nhon Nguyen

87

ตกลงนี่คือเคล็ดลับ คุณต้องเพิ่มคีย์ "ดูแถบสถานะตามตัวควบคุม" และตั้งค่าเป็นไม่

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

ตอนนี้ฉันจะได้รับแถบสถานะเป็นสีขาวหรือสีเข้ม


6
สำหรับฉันสิ่งนี้ผิด ต้องตั้งค่าคีย์เป็น "ใช่" ตามที่คุณคาดหวัง ฉันใช้ Xcode 5.1 iOS 7.1 ดังนั้นอาจมีการเปลี่ยนแปลง
joel.d

ฉันใช้ Xcode 5.1 และ iOS 7.1 ด้วยและไม่ได้ผลสำหรับฉัน ...
Arjun Mehta

ฉันควรเพิ่มคีย์นี้ที่ไหน
Hadu

ในไฟล์ [AppName] -Info.plist ของคุณ
Saren Inden

1
ทำงานได้ดีเมื่อตั้งค่าคีย์ "ดูแถบสถานะตามตัวควบคุม" เป็น "ใช่" ด้วย Xcode6.0, iOS 8.0
bpolat

77

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

extension UITabBarController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return visibleViewController
    }
}

สำหรับSwift 3นั้นไม่ใช่วิธีการ แต่เป็นคุณสมบัติ:

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

Swift 4.2คุณสมบัติได้รับการเปลี่ยนชื่อ:

extension UITabBarController {
   open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
   open override var childForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

การใช้งาน

class ViewController: UIViewController {

    // This will be called every time the ViewController appears
    // Works great for pushing & popping
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}

6
นี่เป็นคำตอบที่ดีที่สุด (สำหรับแอพที่ใช้ UINavigationController หรือ UITabBarController
Kesava

1
การใช้งานสำหรับสิ่งนี้คืออะไร?
AnBisw

@Annjawn ใช้วิธีการเหล่านี้โดย UIKit คุณไม่จำเป็นต้องทำอะไรนอกจากเพิ่มลงในโครงการของคุณ
Daniel Wood

@DanielWood ใช่ฉันคิดออกและลืมไปเสียสนิทว่าฉันใช้สิ่งเดียวกันนี้ในโครงการก่อนหน้านี้แม้ว่าจะแตกต่างกันเล็กน้อย
AnBisw

นี่เป็นคำตอบที่ดีที่สุดจริงๆ
Musa almatri

33

ฉันอาจจะมาช้าไปหน่อย แต่ในกรณีที่มีคนอื่นกำลังมองหาแอปที่ใช้งานได้และผ่านการตรวจสอบแล้ว

@mxcl อธิบายสาเหตุที่เกิดขึ้นได้ถูกต้อง ในการแก้ไขเราเพียงแค่สร้างส่วนขยาย (หรือหมวดหมู่ใน obj-c) ที่แทนที่เมธอดที่ต้องการของ UINavigationController นี่คือตัวอย่างใน Swift:

extension UINavigationController {
    public override func preferredStatusBarStyle() -> UIStatusBarStyle {
        if let rootViewController = self.viewControllers.first {
            return rootViewController.preferredStatusBarStyle()
        }
        return super.preferredStatusBarStyle()
    }
}

รหัสนี้เพียงแค่ดึงตัวควบคุมมุมมองแรก (ตัวควบคุมมุมมองรูท) และแกะออก (ใน obj-c เพียงตรวจสอบว่าไม่ใช่ศูนย์) หากการแกะสำเร็จ (ไม่ใช่ศูนย์) เราจะคว้า rootViewControllers ที่ต้องการ StatusBarStyle มิฉะนั้นเราจะคืนค่าเริ่มต้น

หวังว่านี่จะช่วยทุกคนที่อาจต้องการมัน


2
ใน Swift 2.0 คุณต้องลบ "as? UIViewController" ของคำสั่งเงื่อนไข
Thomás Calmon

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

1
หากตัวควบคุมการนำทางของคุณไม่มีตัวควบคุมมุมมองสิ่งนี้จะทำให้เกิดการวนซ้ำแบบไม่สิ้นสุด return self.preferredStatusBarStyle()จะโทรกลับไปใช้วิธีการเดียวกันนี้
bearMountain

1
ในกรณีของฉันแทนที่จะใช้ rootViewController ฉันใช้ topViewController เนื่องจากในระหว่างสแต็กสไตล์อาจเปลี่ยนไป
Ric Santos

2
@Unome visibleViewControllerจะดีกว่านี้
Cœur

21

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

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

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

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

แก้ไข : คุณสามารถทำได้โดยไม่ต้องพิมพ์รหัสใด ๆ : https://stackoverflow.com/a/18732865/855680


1
โปรดทราบว่าวิธีนี้เลิกใช้งานจาก IOS 9.0
Mohamed Salah

10

ใน viewDidLoad เพียงแค่เขียนสิ่งนี้

[self setNeedsStatusBarAppearanceUpdate];

เพียงแค่ทำและมันจะได้ผล

คุณช่วยลองดูได้ไหม

Set UIViewControllerBasedStatusBarAppearance to NO.
Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

อีกสิ่งหนึ่งที่ฉันได้เห็นในคำถามของคุณที่คุณเขียนวิธีการเช่นนี้

 -(void)UIStatusBarStyle PreferredStatusBarStyle ()
        {
            return UIStatusBarStyle.LightContent;
        }

แต่มันควรจะเป็นแบบนี้

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

สิ่งนี้จะทำให้เมธอดที่ต้องการถูกเรียกใช้ แต่แถบสถานะยังคงเป็นสีดำ
Andrew Smith

โปรดดูคำตอบที่อัปเดตของฉัน.. แจ้งให้ฉันทราบโดยเร็วว่าได้ผลหรือไม่
ผู้ใช้ 1531343

คำถามเดิมของฉันบอกอย่างชัดเจนว่าฉันต้องดูโดยการควบคุมมุมมองของแถบสถานะ
Andrew Smith

โปรดตรวจสอบรหัสของคุณโดยอ้างอิงถึงคำถามที่อัปเดตของฉันได้ไหม
ผู้ใช้ 1531343

1
[self setNeedsStatusBarAppearanceUpdate];เป็นวิธีที่ดีมากขอบคุณ!
Supertecnoboff

6

นี่คือวิธีที่ฉันแก้ไข โดยปกติ navigationController หรือ tabBarController จะเป็นตัวกำหนดลักษณะที่ปรากฏของแถบสถานะ (ซ่อนสี ฯลฯ )

ดังนั้นฉันจึงจบคลาสย่อยของตัวควบคุมการนำทางและแทนที่ recommendedStatusBarStyle หาก ViewContorller ที่มองเห็นได้ในปัจจุบันใช้ StatusBarStyleHandler ฉันขอค่าที่จะใช้เป็นสไตล์หากไม่ได้คืนค่าเริ่มต้น

วิธีที่คุณเรียกใช้การอัปเดตลักษณะแถบสถานะคือการเรียกsetNeedsStatusBarAppearanceUpdateซึ่งเรียกใช้preferredStatusBarStyleอีกครั้งและอัปเดต UI ตามสิ่งที่วิธีการส่งคืน

public protocol StatusBarStyleHandler {
    var preferredStatusBarStyle: UIStatusBarStyle { get }
}

public class CustomNavigationCotnroller: UINavigationController {

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        if let statusBarHandler = visibleViewController as? StatusBarStyleHandler {
            return statusBarHandler.preferredStatusBarStyle
        }

        return .default
    }
}

แล้วการใช้งาน

public class SomeController: UIViewController, StatusBarStyleHandler {

    private var statusBarToggle = true

    // just a sample for toggling the status bar style each time method is called
    private func toggleStatusBarColor() {
        statusBarToggle = !statusBarToggle
        setNeedsStatusBarAppearanceUpdate()
    }

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

โพสต์นี้จะได้รับการปรับปรุงให้ดีขึ้นมากหากคุณสามารถอธิบายสาเหตุและวิธีการแก้ไขปัญหา

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

4

1) การตั้งค่าเดียวสำหรับทั้งโครงการ:

หากมีให้ลบUIViewControllerBasedStatusBarAppearanceคู่คีย์ - ค่าออกจาก info.plist ของคุณหรือตั้งค่าNOโดยไม่ต้องลบออก หากไม่มีใน info.plist ของคุณไม่ต้องทำอะไรเลย ค่าเริ่มต้นNOสำหรับคุณสมบัตินี้

เพิ่มโค้ดด้านล่างใน AppDelegate.m ของคุณ:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

2) การตั้งค่าที่แตกต่างกันสำหรับ View Controllers ต่างๆ:

เพิ่มUIViewControllerBasedStatusBarAppearanceคู่คีย์ที่มีมูลค่าการ info.plist YESของคุณและตั้งค่าให้

หาก View Controller ของคุณไม่ได้ฝังอยู่ใน Navigation Controller สมมติว่า MyViewController เพียงเพิ่มโค้ดด้านล่างลงในไฟล์ MyViewController.m ของคุณ ถ้า View Controller ของคุณฝังอยู่ใน Navigation Controller ให้สร้าง Cocoa Touch Class ใหม่และทำให้เป็นคลาสย่อยของ UINavigationController สมมติว่า MyNC เลือกมุมมองตัวควบคุมการนำทางบนกระดานเรื่องราวของคุณที่บานหน้าต่างด้านขวา ยูทิลิตี้ -> Identity Inspector -> Custom Class -> Class พิมพ์ "MyNC" หลังจากเชื่อมโยง Storyboard View กับคลาส Cocoa Touch "MyNC" ของคุณแล้วให้เพิ่มโค้ดด้านล่างใน MyNC.m ของคุณ:

- (BOOL)prefersStatusBarHidden {
    return NO;
}

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

ดูเหมือนว่าใน iOS9 UIViewControllerBasedStatusBarAppearance โดยค่าเริ่มต้นมีค่า YES เนื่องจากฉันต้องการเพิ่มด้วยตนเองใน. plist และตั้งค่าเป็น NO เพื่อให้ทำงานได้อย่างถูกต้อง
Mohd Asim

4

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

override var preferredStatusBarStyle: UIStatusBarStyle {
     return visibleViewController?.preferredStatusBarStyle ?? .lightContent
}

ในตัวควบคุมการนำทาง (คล้ายกับแท็บเลือกไว้เพียง ViewController) แล้วมันจะเคารพ:

override var preferredStatusBarStyle: UIStatusBarStyle {
     return .lightContent
}

ในตัวควบคุมมุมมองแต่ละตัวเว้นแต่คุณจะตั้งค่าไว้เป็นอย่างอื่น ฉันไม่จำเป็นต้องโทรไปsetNeedsStatusBarAppearanceUpdate()ที่ใดเลยเพียงแค่อัปเดตเมื่อคุณมาถึงตัวควบคุมมุมมองแต่ละตัว


2
ฉันลงเอยด้วยวิธีแก้ปัญหาที่เหมือนกันเกือบทั้งหมดหลังจากต่อสู้กับสิ่งนี้มาหลายชั่วโมง
Scott Jungwirth

ในบางจุดสิ่งนี้ดูเหมือนจะได้รับการแก้ไขแล้วเพียงแค่ใช้ที่ต้องการ StatusBarStyle ในแต่ละ VC ก็ใช้ได้ดีสำหรับฉันแล้ว
Andrew Plummer

4

โซลูชัน iOS 13

คำตอบที่ได้รับการโหวตสูงสุดใช้รหัส "เดิม" 👎

การตั้งค่าbarStyleคุณสมบัติตอนนี้ (iOS 13+) ถือเป็นการ "ปรับแต่งแบบเดิม" ตามที่ Appleระบุ

ใน iOS 13 ขึ้นไปปรับแต่งแถบนำทางของคุณโดยใช้คุณสมบัติ standardAppearance, compactAppearance และ scrollEdgeAppearance คุณสามารถใช้ตัวเข้าถึงเดิมเหล่านี้เพื่อปรับแต่งลักษณะของแถบนำทางได้โดยตรง แต่คุณต้องอัปเดตลักษณะที่ปรากฏสำหรับการกำหนดค่าแถบต่างๆด้วยตัวคุณเอง

เกี่ยวกับความพยายามของคุณ - คุณมาถูกทางแล้ว!

UINavigationControllerเป็นคลาสย่อยของUIViewController(ผู้รู้🙃)!

ดังนั้นเมื่อนำเสนอตัวควบคุมมุมมองที่ฝังอยู่ในตัวควบคุมการนำทางคุณจะไม่ได้นำเสนอตัวควบคุมมุมมองแบบฝัง คุณกำลังนำเสนอตัวควบคุมการนำทาง! UINavigationControllerเป็นคลาสย่อยของการUIViewControllerสืบทอดpreferredStatusBarStyleและchildForStatusBarStyleซึ่งคุณสามารถตั้งค่าได้ตามต้องการ

วิธีการใด ๆ ต่อไปนี้ควรใช้งานได้:

  1. แทนที่preferredStatusBarStyleภายในUINavigationController

    • preferredStatusBarStyle( doc ) - ลักษณะแถบสถานะที่ต้องการสำหรับตัวควบคุมมุมมอง
    • คลาสย่อยหรือขยาย UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }

      หรือ

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
  2. แทนที่childForStatusBarStyleภายในUINavigationController

    • childForStatusBarStyle( doc ) - เรียกเมื่อระบบต้องการตัวควบคุมมุมมองเพื่อใช้สำหรับกำหนดรูปแบบแถบสถานะ
    • ตามเอกสารของ Apple

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

    • กล่าวอีกนัยหนึ่งถ้าคุณไม่ใช้โซลูชัน 3 ที่นี่ระบบจะถอยกลับไปใช้โซลูชัน 2 ข้างต้น
    • คลาสย่อยหรือขยาย UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }

      หรือ

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
    • คุณสามารถส่งคืนตัวควบคุมมุมมองที่คุณต้องการด้านบน ขอแนะนำอย่างใดอย่างหนึ่งต่อไปนี้:

      • topViewController(of UINavigationController) ( doc ) - ตัวควบคุมมุมมองที่ด้านบนของสแตกการนำทาง
      • visibleViewController(ของUINavigationController) ( doc ) - ตัวควบคุมมุมมองที่เชื่อมโยงกับมุมมองที่มองเห็นได้ในปัจจุบันในอินเทอร์เฟซการนำทาง (คำใบ้: อาจรวมถึง "ตัวควบคุมมุมมองที่นำเสนอเป็นโมดูลที่ด้านบนของตัวควบคุมการนำทางเอง")

หมายเหตุ: หากคุณตัดสินใจที่จะคลาสย่อยUINavigationControllerอย่าลืมใช้คลาสนั้นกับตัวควบคุมการนำทางของคุณผ่านตัวตรวจสอบข้อมูลประจำตัวใน IB

ปล. รหัสของฉันใช้ไวยากรณ์ Swift 5.1 😎


1
คำตอบที่สมบูรณ์มากขอบคุณ! นอกจากนี้บางสิ่งที่ฉันต่อสู้มาระยะหนึ่งแล้วใน iOS 13 .defaultสไตล์จะต้องคำนึงถึงโหมดมืดและไม่ได้รับการบันทึกไว้ดังนั้นหากคุณรองรับ iOS เวอร์ชันก่อนหน้าคุณสามารถเพิ่มได้if #available(iOS 13, *) { return .darkContent } else { return .default }หากคุณพยายามตั้งค่าสไตล์แถบสถานะด้วยตนเองตาม สีหลังแถบสถานะและสีนั้นคือ "สว่าง"
valcanaia

1
โปรดทราบว่าวิธีการขยายของการแทนที่ var ใช้ไม่ได้อีกต่อไปใน Xcode 11.4 / iOS 13.4
Marc Etcheverry

เนื่องจากการขยายคลาส C วัตถุประสงค์ใน Swift ถูกนำไปใช้ผ่านหมวด Objective C ไม่แนะนำให้ใช้วิธีการลบล้างผ่านหมวดหมู่ Objective C และมีแนวโน้มที่จะทำลาย ดูstackoverflow.com/a/38274660/2438634
Marc Etcheverry

แม้ว่าการแทนที่ UINavigationController จะใช้งานได้อย่างแน่นอน แต่ดูเหมือนว่าจะมีข้อผิดพลาดทางฝั่ง Apple ที่จะไม่ทำ childForStatusBarStyle โดยค่าเริ่มต้นจะส่งคืน topViewController เช่น UITabBarController ทำสิ่งนี้สำหรับแท็บของมัน สำหรับฉันแล้วไม่มีเหตุผลใดที่ UINavigationController ซึ่งเป็นผู้ควบคุมคอนเทนเนอร์อย่างเคร่งครัดสำหรับการโฮสต์คอนโทรลเลอร์ดู "ของจริง" แทนที่จะนำเสนอ UI ของตัวเองควร "กิน" สไตล์แถบสถานะเหล่านั้น จะสร้างเรดาร์สำหรับ Apple.
Igor Vasilev

1

หากในกรณีที่คุณต้องการซ่อน statusBar ระหว่าง splashScreen แต่ต้องการเปลี่ยนสไตล์เป็นเนื้อหาแบบสว่าง (StatusBarInitiallyHidden บน Plist ต้องเป็น NO เพื่อซ่อน statusBar บน splash) คุณสามารถเพิ่มสิ่งนี้ลงในเมธอด didFinishLaunchingWithOptions ของ appDelegate เพื่อเปลี่ยนเป็น lightContent

[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

1

ตัวอย่างรวดเร็ว

ใน AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent;

    return true
}

ใน info.plist set ดูลักษณะแถบสถานะตามคอนโทรลเลอร์: NO


1

หากคุณกำลังใช้NavigationControllerคุณสามารถคลาสย่อยNavigationControllerเพื่อให้คำปรึกษาตัวควบคุมมุมมองลูกของมัน

// MyCustomNavigationController

- (NSUInteger)supportedInterfaceOrientations {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk shouldAutorotate];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk preferredStatusBarStyle];
}

- (UIViewController *)findChildVC {
    return self.viewControllers.firstObject;
}

1

Swift 4.2

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

โปรดทราบว่าวิธีการขยายของการแทนที่ var ใช้ไม่ได้อีกต่อไปใน Xcode 11.4 / iOS 13.4
Marc Etcheverry

@MarcEtcheverry แล้วทำไมคุณถึงลงคะแนนคำตอบ? มันดูแปลก ๆ
Vyacheslav

เนื่องจากการขยายคลาส C วัตถุประสงค์ใน Swift ถูกนำไปใช้ผ่านหมวดหมู่ Objective C ไม่แนะนำให้ใช้วิธีการลบล้างผ่านหมวดหมู่ Objective C และมีแนวโน้มที่จะทำลาย ดูstackoverflow.com/a/38274660/2438634
Marc Etcheverry

@MarcEtcheverry 'not recommended'! = 'never use it!'. สำหรับ jul2018 คำตอบถูกต้อง แม้คำตอบนี้จะไม่เป็นปัจจุบัน แต่ก็ไม่ใช่เหตุผลที่จะลดคะแนน ฉันมองไม่เห็นอนาคต
Vyacheslav

0

คุณสามารถกำหนดลักษณะแถบสถานะ จะเป็นแถบสถานะเหมือน IOS 6 ขึ้นไป
วางวิธีนี้ในตัวควบคุมมุมมองของคุณ

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleBlackOpaque;
}

และเรียกวิธีนี้จากมุมมองโหลดแบบนี้

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
    {
       [self setNeedsStatusBarAppearanceUpdate];
    }

คุณหมายถึง[self setStatusBarNeedsUpdate]ในบล็อกที่สองหรือไม่? (หรืออย่างอื่นเป็นอย่างน้อย).
mxcl

0

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

บันทึกนี้อาจช่วยผู้อื่นที่มีโครงสร้างคล้ายกัน! โดยพื้นฐานแล้วคุณสามารถใช้โซลูชันที่กล่าวถึงข้างต้นใน ViewController ของ UIWindow ใหม่

นี่เป็นกรณีเฉพาะอีกครั้ง

ขอบคุณ


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