วิธีการซ่อนแถบสถานะ iOS


219

ในแถบสถานะแอปวิดีโอ iOS ของฉันถูกซ่อนอยู่ในคอนโทรลเลอร์บางตัว ฉันทำสิ่งนี้โดยใช้รหัสต่อไปนี้

[[UIApplication sharedApplication] setStatusBarHidden:YES];
  • ใช้งานได้กับ iOS 5 และ iOS 6 แต่ไม่ใช่ใน iOS 7

  • ฉันลองใช้ตัวควบคุมมุมมองนี้เป็นพิเศษ

เช่น:

-(BOOL)prefersStatusBarHidden { return YES; }

มันทำงานได้ดี แต่ฉันไม่สามารถแสดงแถบสถานะอีกครั้งในตัวควบคุมมุมมองหลัก



1
หากมีการตั้งค่าสไตล์ของแถบสถานะในกระดานเรื่องราวหลังจากเปลี่ยน "ดูแถบสถานะที่ใช้ตัวควบคุม" (ด้านล่าง) สไตล์นั้นอาจจะต้องมีการตั้งค่าไว้ในส่วนย่อยเนื่องจากการตั้งค่าตัวควบคุมมุมมองจะไม่ถูกใช้อีกต่อไป stackoverflow.com/questions/18924345/…
แมตต์

1
ฉันตอบในคำถามอื่น ลองสิ่งนี้ [วิธีที่ง่ายที่สุดในการซ่อนแถบสถานะโดยทางโปรแกรม] [1] [1]: stackoverflow.com/a/27339754/3718498
wataru

1
ผมใช้เคล็ดลับสำหรับมัน - ฉันตีพิมพ์เป็นฝัก cocoapods.org/pods/UIViewController+ODStatusBarผมหวังว่ามันจะเป็นประโยชน์สำหรับทุกคน
อเล็กซ์ Nazarsky

คำตอบที่นี่ถูกเลิกใช้แล้ว ผมมีปัญหาในการหาคำตอบที่ถูกต้องสำหรับ iOS 9 เมื่อหลบซ่อนตัวอยู่แถบสถานะเพียงเปิดตัวหน้าจอเพื่อให้การเชื่อมโยงด้านล่างดังนั้นจึงหวังว่าจะได้ง่ายขึ้นสำหรับคนอื่น ๆ ที่จะหาวิธีการทำที่: stackoverflow.com/questions/34413848/...
เบน

คำตอบ:


277

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

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


40
สำหรับการอ้างอิงคีย์ดิบคือUIViewControllerBasedStatusBarAppearance
William Denniss

1
@ Rajneesh071 สิ่งที่ฉันต้องทำอย่างไรถ้าฉันต้องการตั้ง preferredStatusBarStyle สำหรับการทำงานของมันฉันต้องการ"View controller-based status bar appearance" set it to "YES".?
Bimawa


คุณกำลังเผชิญกับปัญหาอะไร
Rajneesh071

ดูเหมือนว่าเลิกพินัยกรรมแบ่งของแอป
เบน

194

เพิ่มสิ่งต่อไปนี้ใน Info.plist ของคุณ:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

ภาพ


ทำงานได้ดีใน Xcode 11.3, iOS 13
Wayne Henderson

113

เพิ่มบรรทัดต่อไปนี้ใน viewdidload

  [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationFade];

และเพิ่มวิธีการใหม่

  - (BOOL)prefersStatusBarHidden {
          return YES;
  }

เปลี่ยนไฟล์ info.plist ดูลักษณะแถบสถานะตามคอนโทรลเลอร์ "= NO

มันเหมาะกับฉัน


Thanx อันนี้ใช้ได้สำหรับฉัน แต่ฉันต้องเพิ่มแถวด้านล่างใน plist ด้วย "ดูลักษณะแถบสถานะที่ใช้คอนโทรลเลอร์" = NO i, e เพิ่มบรรทัดต่อไปนี้ใน viewdidload [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: UIStatusBarAnimationFade]; และเพิ่มวิธีการใหม่ - (BOOL) ชอบ StatusBarHidden {return YES; } เพิ่ม "ดูลักษณะแถบสถานะตามคอนโทรลเลอร์" = NO ในไฟล์ Plist
sandy

prefersStatusBarHiddenคือสิ่งที่ได้เคล็ดลับสำหรับผม (ไม่ว่าจะมีการแก้ปัญหาของกับคนอื่น ๆ ที่คล้ายกันนี้)
Abdo

34

ใน Plist เพิ่มคุณสมบัติต่อไปนี้

Status bar is initially hidden = YES

View controller-based status bar appearance = NO

ตอนนี้แถบสถานะจะถูกซ่อน


8
คีย์ Raw น่าจะเป็น UIStatusBarHidden และ UIViewControllerBasedStatusBarAppearance
leolobato

27

ลองวิธีการง่ายๆนี้:


Objective-C:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}

สวิฟท์:

override func viewWillAppear(animated: Bool) 
{
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) 
{
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

1
นี่เป็นคำตอบที่ยอดเยี่ยม! ลองกับของหลาย ๆUIStatusBarAnimationอันมันยอดเยี่ยมมาก
VedTopkar

อย่าลืม[super viewWillAppear:animated]และ[super viewWillDisappear:animated]
59

1
โซลูชันที่เรียบง่ายนี้ใช้งานได้สำหรับฉัน iOS 10 วิธีที่จะเป็นคนเรียบง่าย!
coolcool1994

14

ฉันทำสิ่งต่อไปนี้และดูเหมือนว่าจะใช้งานได้ (แม้ใน iOS 8):

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

12
  • UIApplication.setStatusBarX เลิกใช้แล้วตั้งแต่ iOS9
  • เลิกใช้แล้วเพื่อให้ UIViewControllerBasedStatusBarAppearance = NO ใน info.plist ของคุณ
  • ดังนั้นเราควรใช้ที่ต้องการ StatusBarX ในตัวควบคุมมุมมองของเราทั้งหมด

แต่มันจะน่าสนใจยิ่งขึ้นเมื่อมี UINavigationController ที่เกี่ยวข้อง:

  • ถ้า navigationBarHidden = true ระบบจะเรียกเด็ก ๆ ว่า UStiewController ที่ต้องการของ UIViewController เนื่องจากเด็กจะแสดงเนื้อหาภายใต้แถบสถานะ
  • ถ้า navigationBarHidden = false UStavigationController ของ UINavigationController จะถูกเรียกใช้หลังจากทั้งหมดแสดงเนื้อหาภายใต้แถบสถานะ
  • ค่าเริ่มต้น PreferredStatusBarStyle ของ UINavigationController ใช้ค่าจาก UINav.navigationBar.barStyle .Default = เนื้อหาแถบสถานะสีดำ, .Black = เนื้อหาแถบสถานะสีขาว
  • ดังนั้นหากคุณกำลังตั้งค่า barTintColor เป็นสีที่กำหนดเอง (ซึ่งคุณน่าจะเป็น) คุณต้องตั้งค่า barStyle เป็น. Black เพื่อให้ได้เนื้อหาแถบสถานะสีขาว ฉันจะตั้งค่า barStyle เป็นสีดำก่อนตั้งค่า barTintColor ในกรณีที่ barStyle แทนที่ barTintColor
  • อีกทางเลือกหนึ่งคือคุณสามารถ subclass UINavigationController แทนที่จะ mucking รอบ ๆ ด้วยลักษณะแถบ
  • อย่างไรก็ตามถ้าคุณซับคลาส UINavigationController คุณจะไม่สามารถควบคุมแถบสถานะได้หาก navigationBarHidden = true อย่างใด UIKit ไปโดยตรงกับเด็ก UIViewController โดยไม่ถาม UINavigationController ในสถานการณ์นี้ ฉันคิดว่ามันควรจะเป็นความรับผิดชอบของ UINavigationController ที่จะถามเด็ก> ยักไหล่ <
  • และแสดงอย่างเป็นทางการ UIViewController เพียงรับพูดในแถบสถานะถ้า modalPresentationStyle = .FullScreen
  • หากคุณมีตัวควบคุมมุมมองสไตล์การนำเสนอที่กำหนดเองและคุณต้องการให้มันควบคุมแถบสถานะคุณสามารถตั้งค่า modalPresentationCapturesStatusBarAppearance = true

ทำไมแอปเปิ้ลทำตามคำแนะนำเพียงชิ้นเดียวไม่ได้ หากยังไม่พังอย่าแก้ไข!
Jargen89

9

ในการซ่อนแถบสถานะใน iOS7 คุณต้องมีรหัส 2 บรรทัด

  1. ในแอปพลิเคชัน: (UIApplication *) แอปพลิเคชันไม่ได้ FinishLaunchingWithOptions: (NSDictionary *) launchOptions เขียน

     [[UIApplication sharedApplication] setStatusBarHidden:YES];
    
  2. ใน info.plist เพิ่มสิ่งนี้

     View-Controller Based Status Bar Appearance = NO
    

8

เพื่อความเข้าใจที่ดียิ่งขึ้นให้เพิ่มรูปภาพพร้อมความคิดเห็น:

แอพก่อนการเปลี่ยนแปลงใด ๆ

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

พบในProject Navigatorโฟลเดอร์ของคุณชื่อSupporting Filesและคลิกที่ไฟล์ * .plist

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

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

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

หลังจากกด + คุณสามารถเลือกหนึ่งในคีย์ - เพียงแค่เริ่มพิมพ์

รุ่นที่ถูกต้อง:

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

และในที่สุดแอปพลิเคชันหลังจากใช้การเปลี่ยนแปลงนี้:

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

นอกจากนี้คุณสามารถค้นหาโซลูชันทางเลือกได้ที่นี่


8

ใน iOS10 สิ่งที่ฉันต้องทำคือแทนที่prefersStatusBarHiddenvar ในของฉันRootViewController(Swift):

override var prefersStatusBarHidden: Bool {
    return true
}

7

ลองดูสิ

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

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

5

วิธีซ่อนแถบสถานะใน iOS7:

เปิด plist ไฟล์ของคุณแล้วเพิ่มเพิ่มแถวที่เรียกว่า"ดูตัวควบคุมตามแถบสถานะลักษณะ"NOและการตั้งค่าของ


5

นี่คือเวอร์ชั่น Swift (ก่อน iOS9):

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

สิ่งนี้ยังใช้งานได้ (iOS7 +):

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

คุณต้องโทรหา:

setNeedsStatusBarAppearanceUpdate()

viewDidLoad()ในการพูด

หมายเหตุว่าถ้าคุณใช้ตัวควบคุม SplitView หรือบางอื่น ๆควบคุมมุมมองของคุณยังจำเป็นต้องมีมันกลับชั้นเรียนของคุณเมื่อที่ส่งของcontainer childViewControllerForStatusBarHiddenวิธีหนึ่งในการทำเช่นนี้คือมีจุดอ่อนสาธารณะเพื่อพูดstatusControllerและส่งคืนในวิธีการแทนที่นี้


1
บล็อกด้านบนเลิกใช้แล้วใน iOS8 - ใช้วิธีที่สองของคุณ และขอบคุณ! ฉันแก้ไขรหัสเพื่อเพิ่มอีกสายที่จำเป็น
David H

5

iOS 9 เป็นต้นไป:

ในฐานะที่เป็นstatusBarHiddenวิธีการที่ถูกเลิกจากiOS9 คุณจะต้องเพิ่มค่าสองค่าใน plist เป็นด้านล่าง:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

หรือโดยส่วนต่อประสานผู้ใช้โปรดอ้างอิงภาพด้านล่าง:

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

ตามที่statusBarHiddenถูกคัดค้านจากiOS9 :

@property (อ่านและเขียน, nonatomic, getter = isStatusBarHidden) BOOL statusBarHidden NS_ เลิก _IOS (2_0, 9_0 "ใช้งาน - [UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;


5

โซลูชันที่แก้ไขแล้วสำหรับ SWIFT 3+ (iOS 9, 10)

1- ใน info.plist ตั้งอยู่ด้านล่างคุณสมบัติ

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

2- วางโค้ดด้านล่างลงในรูตคอนโทรลเลอร์, ถึง

 private var isStatusBarHidden = true {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
        return isStatusBarHidden
    }

คุณสามารถโทรisStatusBarHidden = trueและisStatusBarHidden = falseสถานที่ที่คุณต้องการhide/showแถบสถานะ


4

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


4

ขั้นตอนในการซ่อนแถบสถานะใน iOS
1. เปิดไฟล์AppDelegate.mเพิ่มแอพพลิเคชั่นสถานะห้ามซ่อนในวิธีการทำฟินิชแลงกิ้งด้วยวิธีการ

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    application.statusBarHidden = YES;
    return YES;
    }
  1. เปิดinfo.plist และตั้งค่า

View controller-based status bar appearance ชุด NO


4

สวิฟท์ 5

ใช้ขั้นตอนต่อไปนี้เพื่อซ่อนแถบสถานะ iOS:

  1. เปิดบน Info.plist
  2. เพิ่มคีย์ใหม่ดูควบคุมตามลักษณะแถบสถานะและชุดมูลค่าให้กับNO
  3. เพิ่มคีย์ใหม่แถบสถานะที่ถูกซ่อนอยู่ในขั้นแรกและชุดมูลค่าให้กับYES
  4. รวบรวมโครงการใหม่
  5. แถบสถานะควรซ่อนอยู่ในโทรศัพท์ iOS ตอนนี้

ภาพหน้าจอการตั้งค่าสุดท้าย:

การตั้งค่าสุดท้าย

สิ่งนี้ทำงานบนXcode 10.2


2

จากUIKit> UIApplication.h:

// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);

ดังนั้นควรตั้งค่าView controller-based status bar appearanceเป็นไม่


2

ที่จะตอบคำถามของ Susitha ใช้งาน: ใช้setNeedsStatusBarAppearanceUpdate สิ่งนี้จะทำการโทรไปยัง PrefersStatusBarHidden เพื่อรีเฟรชด้วยสถานะแถบสถานะที่คุณต้องการ ลองสิ่งนี้:

    @property (nonatomic, getter=isHideStatusBar) BOOL hideStatusBar; // Give this a default value early

    - (BOOL)prefersStatusBarHidden {
        return self.isHideStatusBar;
    }

    - (void)someMethod {
    // triggered by an event or user action
    [self setHideStatusBar:YES];
    [self setNeedsStatusBarAppearanceUpdate];
    }

หากคุณต้องการที่จะเห็นแถบสถานะอีกครั้งตั้งค่าคุณสมบัติของคุณ hideStatusBar (หรือสิ่งที่คุณเรียกว่า) เป็น NO โทร preferStatusBarHidden ทางอ้อมด้วยการโทรอีกครั้งไปที่

[self setNeedsStatusBarAppearanceUpdate]

1

อัปเดตสำหรับ Swift 3:

อัพเดต Info.plist ด้วยข้อมูลต่อไปนี้:

View controller-based status bar appearance: NO

จากนั้นใน ViewController หรือที่อื่น ๆ :

UIApplication.shared.isStatusBarHidden = true

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