แถบสถานะ iOS 7 กลับไปเป็นสไตล์เริ่มต้นของ iOS 6 ในแอพ iPhone?


292

ใน iOS 7 UIStatusBarได้รับการออกแบบในลักษณะที่ผสานเข้ากับมุมมองเช่นนี้:

GUI ออกแบบโดย Tina Tavčar (GUI ออกแบบโดยTina Tavčar )

  • มันเยี่ยม แต่มันจะทำให้มุมมองของคุณยุ่งเหยิงเมื่อคุณมีบางอย่างที่ส่วนบนสุดของมุมมองของคุณและมันจะทับซ้อนกับแถบสถานะ

  • มีวิธีง่ายๆ (เช่นการตั้งค่าคุณสมบัติใน info.plist) ที่สามารถเปลี่ยนวิธีการทำงาน [ไม่ทับซ้อน] กลับไปเป็นอย่างไรใน iOS6

  • ฉันรู้วิธีแก้ปัญหาที่ตรงไปตรงมามากขึ้นคือการมีself.view.center.x+ 20 คะแนนสำหรับตัวควบคุมมุมมองเดียวทุกตัว แต่การเปลี่ยนแปลงจะทำให้มิติอื่น ๆself.view.center.xเสียหาย(การมีที่แตกต่างกันอาจทำให้เกิดปัญหากับเซ็กส์แบบกำหนดเอง ฯลฯ ) และทันใดนั้นมันก็กลายเป็นงานที่น่าเบื่อนั่นคือ ควรหลีกเลี่ยง

  • ฉันจะดีใจมากถ้ามีใครสามารถให้วิธีแก้ปัญหานี้ได้

ป.ล. ฉันรู้ว่าสามารถซ่อนแถบสถานะได้โดยทำสิ่งต่างๆเช่นมี

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

ในdidFinishLaunchingWithOptionsวิธีการ แต่นั่นเป็นวิธีแก้ปัญหาทางลัดเพื่อหลีกเลี่ยงปัญหาดังนั้นฉันจึงไม่คิดว่าเป็นวิธีแก้ปัญหาที่แท้จริง


6
แถบสถานะสีดำน่าเศร้าที่เลิกใช้งานใน iOS 7
i_duhh_bomb

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

คุณได้ลองตั้งค่า recommendedStatusBarStyle เป็น UIStatusBarDefault หรือยัง? ชำระเงินเอกสาร UIViewController iOS 7
theaob

1
การมีUIStatusBarDefaultสำหรับแถบสถานะจะทำให้เนื้อหาเป็นสีดำเท่านั้น มันจะไม่ทำให้วิธีการทำงานกลับไปเป็นเหมือนใน iOS6
吖奇说の archywillhe

2
โชคดีไหม? ฉันรัก iOS7 แต่สิ่งนี้ทำให้ฉันแทบคลั่ง!
Mihai Fratu

คำตอบ:


449

นี่คือการโพสต์ข้ามจากบล็อกโพสต์ที่ฉันเขียนแต่นี่คือบทสรุปทั้งหมดบนแถบสถานะแถบนำทางและตัวควบคุมมุมมองคอนเทนเนอร์บน iOS 7:

  1. ไม่มีวิธีใดที่จะรักษาเค้าโครงแถบสถานะสไตล์ iOS 6 แถบสถานะจะทับแอปพลิเคชันของคุณบน iOS 7 เสมอ

  2. อย่าสับสนลักษณะแถบสถานะกับเค้าโครงแถบสถานะ ลักษณะที่ปรากฏ (แสงหรือค่าเริ่มต้น) ไม่มีผลต่อการวางแถบสถานะ (กรอบ / ความสูง / เหลื่อม) สิ่งสำคัญคือต้องสังเกตด้วยว่าแถบสถานะของระบบไม่มีสีพื้นหลังอีกต่อไป เมื่อ API อ้างถึง UIStatusBarStyleLightContent จะหมายถึงข้อความสีขาวบนพื้นหลังที่ชัดเจน UIStatusBarStyleDefault เป็นข้อความสีดำบนพื้นหลังที่ชัดเจน

  3. ลักษณะแถบสถานะถูกควบคุมตามหนึ่งในสองเส้นทางพื้นฐานที่ใช้ร่วมกันโดยเฉพาะ: คุณสามารถตั้งค่าโดยใช้โปรแกรมในลักษณะดั้งเดิมหรือ UIKit จะอัปเดตลักษณะที่ปรากฏให้คุณตามคุณสมบัติใหม่ของ UIViewController ตัวเลือกหลังจะเปิดโดยค่าเริ่มต้น ตรวจสอบค่า plist ของแอปของคุณสำหรับ“ ลักษณะแถบสถานะตาม ViewController” เพื่อดูว่าคุณใช้อันไหน หากคุณตั้งค่านี้เป็นใช่ตัวควบคุมมุมมองระดับบนสุดทุกตัวในแอปของคุณ (นอกเหนือจากตัวควบคุมมุมมองคอนเทนเนอร์ UIKit มาตรฐาน) จะต้องแทนที่ค่าที่ต้องการ StatusBarStyle โดยจะคืนค่าเริ่มต้นหรือสไตล์แสง หากคุณแก้ไขค่า plist เป็น NO คุณสามารถจัดการลักษณะแถบสถานะได้โดยใช้วิธีการสมัคร UIA ที่คุ้นเคย

  4. UINavigationController จะเปลี่ยนความสูงของ UINavigationBar เป็น 44 จุดหรือ 64 จุดขึ้นอยู่กับชุดข้อ จำกัด ที่ค่อนข้างแปลกและไม่มีเอกสาร หาก UINavigationController ตรวจพบว่าด้านบนสุดของเฟรมของมุมมองนั้นติดกันอย่างเห็นได้ชัดกับด้านบนของ UIWindow ก็จะดึงแถบนำทางที่มีความสูง 64 พอยต์ หากด้านบนของมุมมองไม่ติดกันกับด้านบนของ UIWindow (แม้ว่าจะปิดเพียงจุดเดียวก็ตาม) ระบบจะดึงแถบการนำทางในลักษณะ "ดั้งเดิม" ที่มีความสูง 44 จุด ตรรกะนี้ดำเนินการโดย UINavigationController แม้ว่าจะมีลูกหลายตัวอยู่ในลำดับชั้นของตัวควบคุมมุมมองของแอปพลิเคชัน ไม่มีทางป้องกันพฤติกรรมนี้ได้

  5. หากคุณใส่ภาพพื้นหลังของแถบนำทางแบบกำหนดเองที่มีความสูงเพียง 44 จุด (88 พิกเซล) และขอบเขตของมุมมองของ UINavigationController ตรงกับขอบเขตของ UIWindow (ตามที่กล่าวไว้ใน # 4) UINavigationController จะวาดภาพของคุณในเฟรม (0,20,320 , 44) โดยเว้นพื้นที่สีดำทึบ 20 จุดไว้เหนือรูปภาพที่คุณกำหนดเอง สิ่งนี้อาจทำให้คุณสับสนคิดว่าคุณเป็นนักพัฒนาที่ฉลาดซึ่งข้ามกฎข้อ 1 แต่คุณเข้าใจผิด แถบนำทางยังคงมีความสูง 64 จุด การฝัง UINavigationController ในลำดับชั้นของมุมมองสไตล์สไลด์เพื่อเปิดเผยทำให้สิ่งนี้ชัดเจนมาก

  6. ระวังคุณสมบัติ edgeForExtendedLayout ที่ชื่อสับสนของ UIViewController การปรับ edgeForExtendedLayout ไม่ทำอะไรเลยในกรณีส่วนใหญ่ วิธีเดียวที่ UIKit ใช้คุณสมบัตินี้คือถ้าคุณเพิ่มตัวควบคุมมุมมองไปยัง UINavigationController จากนั้น UINavigationController จะใช้ edgeForExtendedLayout เพื่อพิจารณาว่าตัวควบคุมมุมมองลูกควรจะมองเห็นได้หรือไม่ภายใต้แถบนำทาง / พื้นที่แถบสถานะ การตั้งค่า edgeForExtendedLayout บน UINavigationController เองไม่ได้ทำอะไรเพื่อเปลี่ยนแปลงว่า UINavigationController มีพื้นที่แถบการนำทางสูง 44 หรือ 64 จุดหรือไม่ ดู # 4 สำหรับตรรกะนั้น ตรรกะเค้าโครงที่คล้ายกันใช้กับด้านล่างของมุมมองของคุณเมื่อใช้แถบเครื่องมือหรือ UITabBarController

  7. หากสิ่งที่คุณพยายามทำคือป้องกันไม่ให้ตัวควบคุมมุมมองเด็กที่กำหนดเองของคุณขีดเส้นใต้แถบการนำทางเมื่ออยู่ใน UINavigationController จากนั้นตั้งค่า edgeForExtendedLayout เป็น UIRectEdgeNone (หรืออย่างน้อยมาสก์ที่ไม่รวม UIRectEdgeTop) ตั้งค่านี้โดยเร็วที่สุดในวงจรชีวิตของตัวควบคุมมุมมองของคุณ

  8. UINavigationController และ UITabBarController จะพยายามแทรก contentInsets ของมุมมองตารางและมุมมองคอลเลกชันในลำดับชั้นมุมมองย่อย มันทำในลักษณะที่คล้ายกับตรรกะของแถบสถานะจาก # 4 มีวิธีทางโปรแกรมในการป้องกันสิ่งนี้โดยการตั้งค่า AutomaticAdjustsScrollViewInsets เป็น NO สำหรับมุมมองตารางและมุมมองคอลเลคชันของคุณ (ค่าเริ่มต้นคือ YES) สิ่งนี้ก่อให้เกิดปัญหาร้ายแรงบางประการสำหรับ Whisper และ Riposte เนื่องจากเราใช้การปรับ contentInset เพื่อควบคุมรูปแบบของมุมมองตารางเพื่อตอบสนองต่อการเคลื่อนไหวของแถบเครื่องมือและแป้นพิมพ์

  9. เพื่อย้ำ: ไม่มีวิธีกลับไปใช้ตรรกะเค้าโครงแถบสถานะสไตล์ iOS 6 ในการประมาณค่านี้คุณต้องย้ายตัวควบคุมมุมมองทั้งหมดของแอปของคุณไปยังมุมมองคอนเทนเนอร์ที่หักล้างกัน 20 จุดจากด้านบนของหน้าจอโดยทิ้งมุมมองสีดำไว้ด้านหลังแถบสถานะโดยเจตนาเพื่อจำลองลักษณะเก่า นี่เป็นวิธีที่เราใช้ใน Riposte และ Whisper

  10. Apple กำลังผลักดันอย่างหนักเพื่อให้แน่ใจว่าคุณจะไม่พยายามทำ # 9 พวกเขาต้องการให้เราออกแบบแอปทั้งหมดของเราใหม่เพื่อขีดเส้นใต้แถบสถานะ อย่างไรก็ตามมีข้อโต้แย้งหลายประการสำหรับทั้งประสบการณ์ของผู้ใช้และเหตุผลทางเทคนิคเหตุใดจึงไม่ใช่ความคิดที่ดีเสมอไป คุณควรทำในสิ่งที่ดีที่สุดสำหรับผู้ใช้ของคุณและไม่ใช่เพียงแค่ทำตามแพลตฟอร์มอย่างรวดเร็ว


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

4
นั่นเป็นวิธีแก้ปัญหาที่ยอดเยี่ยม คุณได้เปิดเผยความไม่รู้ของฉันใน AutoLayout ดีกว่าไปที่
jaredsinclair

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

2
@BreadicalMD ส่วนหนึ่งที่ฉันไม่เข้าใจคือ -topLayoutGuide ไม่มีใน iOS 6 นั่นหมายความว่าคุณต้องใช้ข้อ จำกัด ของการจัดวางอัตโนมัติที่แตกต่างกันบน iOS 7 และ 6 หรือไม่
Jeremy

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

122

อัปเดตเมื่อ 19 ก.ย. 2556:

แก้ไขข้อบกพร่องในการปรับขนาดโดยการเพิ่ม self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

แก้ไขการพิมพ์ผิดในNSNotificationCenterคำสั่ง


อัปเดตเมื่อ 12 ก.ย. 2556:

แก้ไขUIViewControllerBasedStatusBarAppearanceเป็นNO

เพิ่มโซลูชันสำหรับแอพที่มีการหมุนหน้าจอ

เพิ่มวิธีการเปลี่ยนสีพื้นหลังของแถบสถานะ


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

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

  1. ตั้งค่าUIViewControllerBasedStatusBarAppearanceเป็นNOในinfo.plist(หากต้องการเลือกที่จะไม่ให้ตัวควบคุมมุมมองปรับสไตล์แถบสถานะเพื่อให้เราสามารถตั้งค่าสไตล์แถบสถานะโดยใช้เมธอด UIApplicationstatusBarStyle)

  2. ใน AppDelegate ของapplication:didFinishLaunchingWithOptionsโทร

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds =YES;
        self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    


เพื่อที่จะ:

  1. ตรวจสอบว่าเป็น iOS 7 หรือไม่

  2. ตั้งค่าเนื้อหาของแถบสถานะให้เป็นสีขาวตรงข้ามกับ UIStatusBarStyleDefault

  3. หลีกเลี่ยงมุมมองย่อยที่เฟรมขยายเกินขอบเขตที่มองเห็นได้ไม่ให้แสดงขึ้น (สำหรับมุมมองที่เคลื่อนไหวไปยังมุมมองหลักจากด้านบน)

  4. สร้างภาพลวงตาว่าแถบสถานะใช้พื้นที่เหมือนใน iOS 6 โดยการเลื่อนและปรับขนาดกรอบหน้าต่างของแอป


สำหรับแอพที่มีการหมุนหน้าจอ

ใช้ NSNotificationCenter เพื่อตรวจจับการเปลี่ยนแปลงการวางแนวโดยการเพิ่ม

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];

ในif (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)และสร้างวิธีการใหม่ใน AppDelegate:

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
    int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
    int w = [[UIScreen mainScreen] bounds].size.width;
    int h = [[UIScreen mainScreen] bounds].size.height;
    switch(a){
        case 4:
            self.window.frame =  CGRectMake(0,20,w,h);
            break;
        case 3:
            self.window.frame =  CGRectMake(-20,0,w-20,h+20);
            break;
        case 2:
            self.window.frame =  CGRectMake(0,-20,w,h);
            break;
        case 1:
           self.window.frame =  CGRectMake(20,0,w-20,h+20);
    }
}

ดังนั้นเมื่อการวางแนวเปลี่ยนไปมันจะเรียกใช้คำสั่งสวิตช์เพื่อตรวจจับการวางแนวหน้าจอของแอพ (แนวตั้ง, กลับหัว, แนวนอนซ้ายหรือแนวนอนขวา) และเปลี่ยนกรอบหน้าต่างของแอพตามลำดับเพื่อสร้างภาพลวงตาแถบสถานะ iOS 6


ในการเปลี่ยนสีพื้นหลังของแถบสถานะของคุณ:

เพิ่ม

 @property (retain, nonatomic) UIWindow *background;

ในการAppDelegate.hที่จะทำให้backgroundสถานที่ให้บริการในชั้นเรียนของคุณและป้องกัน ARC จาก deallocating มัน (คุณไม่จำเป็นต้องทำถ้าคุณไม่ได้ใช้ ARC)

หลังจากนั้นคุณต้องสร้าง UIWindow ในif (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1):

background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

อย่าลืม@synthesize background;หลัง@implementation AppDelegate!


3
สิ่งนี้หยุดหมุน เพียงแค่หัวขึ้น
Jesse Naugher

2
@JesseNaugher ฉันขอแนะนำให้แก้ไข Vertical Spacing Constraint จาก 0 ถึง 20 โดยทางโปรแกรม มันจะทำงานในการหมุน
ผู้เชี่ยวชาญ

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

4
@ArchyHolt: วิธีง่ายๆของคุณใช้ได้ผลสำหรับฉันยกเว้นเมื่อฉันนำเสนอตัวควบคุมมุมมองแบบโมดอล เมื่อปิดตัวควบคุมมุมมองโมดอลมุมมองที่เหลือจะอยู่ภายใต้แถบสถานะ ฉันได้ทำซ้ำสิ่งนี้ในโครงการตัวอย่างใหม่เพื่อให้แน่ใจว่าไม่มีอะไรน่าสนใจอีกแล้ว ฉันคิดว่าโซลูชันขั้นสูงของคุณอาจมีประโยชน์ที่นี่ แต่ไม่แน่ใจว่าจะมีการแจ้งเตือนใดบ้าง ความคิดใด ๆ ?
markdorison

4
มุมมองจะรีเซ็ตหลังจากปิดตัวควบคุมมุมมองโมดอล :(
KarenAnne

41

อัปเดต (โซลูชันใหม่)

การอัปเดตนี้เป็นทางออกที่ดีที่สุดสำหรับปัญหาแถบนำทาง iOS 7 คุณสามารถตั้งค่าตัวอย่างสีของแถบนำทาง: FakeNavBar.backgroundColor = [UIColor redColor];

หมายเหตุ: หากคุณใช้ตัวควบคุมการนำทางเริ่มต้นโปรดใช้โซลูชันเก่า

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
    {
        UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        FakeNavBar.backgroundColor = [UIColor whiteColor];

        float navBarHeight = 20.0;
        for (UIView *subView in self.window.subviews) {

            if ([subView isKindOfClass:[UIScrollView class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
            } else {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
            }
        }
        [self.window addSubview:FakeNavBar];
    }

    return YES;

}

โซลูชันเก่า - หากคุณใช้รหัสก่อนหน้านี้โปรดละเว้นรหัสและรูปภาพต่อไปนี้

นี่คือโซลูชันแถบนำทาง iOS 7 เวอร์ชันเก่า

ฉันแก้ไขปัญหาด้วยรหัสต่อไปนี้ นี่คือการเพิ่มแถบสถานะ didFinishLaunchingWithOptions

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    UIView *addStatusBar = [[UIView alloc] init];
    addStatusBar.frame = CGRectMake(0, 0, 320, 20);
    addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
    [self.window.rootViewController.view addSubview:addStatusBar];
}

และสำหรับInterface Builderสิ่งนี้มีไว้สำหรับเมื่อคุณเปิดด้วย iOS 6 เริ่มต้นที่ 0 พิกเซล

หมายเหตุ: iOS 6/7 Deltas จะปรากฏก็ต่อเมื่อคุณยกเลิกการเลือก "ใช้การจัดวางอัตโนมัติ" สำหรับ View Controller ใน "File Inspector" (ไอคอนซ้ายสุด) ในบานหน้าต่างรายละเอียด

ใส่คำอธิบายภาพที่นี่


6
คุณทำให้วันของฉันใช้ +1 เพื่อช่วย!
Niru Mukund Shah

5
โปรดทราบ: iOS 6/7 Deltas จะปรากฏเฉพาะเมื่อคุณยกเลิกการเลือก "ใช้การจัดวางอัตโนมัติ" สำหรับ View Controller ใน "File Inspector" (ไอคอนด้านซ้ายสุด) ในบานหน้าต่างรายละเอียด
Matt

1
ขอบคุณมาก! คุณช่วยฉันได้มากปัญหา!
neowinston

2
ใครบอกว่าเค้าโครงแถบสถานะสไตล์ iOS 6 ไม่สามารถรักษาได้คุณสามารถทำได้โดยทาง @ TacettinÖzbölük ... ขอบคุณเพื่อนสำหรับโซลูชัน awsum นี้
Vizllx

1
ทำได้ดีนี่! นอกจากนี้โปรดทราบว่า apple ชอบสิ่งนี้ในขณะนี้: if (NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1) {}
Joel Balmer

26

วิธีการแก้ :

ตั้งค่าใน viewcontroller ของคุณหรือใน rootviewcontroller โดยการแทนที่วิธีการ:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

ไม่ใช่ทางออกที่ไม่ดี ถอดแถบออกโดยสิ้นเชิง อาจไม่เหมาะสำหรับ UX ตลอดเวลา แต่สามารถใช้งานได้
Farhan Hafeez

ยอดเยี่ยมเพียง ทำงานให้ฉันอย่างไม่มีที่ติ
madLokesh

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

ฉันประสบความสำเร็จโดยใช้วิธีนี้เท่านั้น
user2277872

17

อีกแนวทางหนึ่งสำหรับโครงการที่ใช้ Storyboard อย่างกว้างขวาง:

เป้าหมาย:

เป้าหมายของแนวทางนี้คือการสร้างแถบสถานะลักษณะเดียวกันใน iOS7 ขึ้นมาใหม่เช่นเดียวกับใน iOS6 (ดูหัวข้อคำถาม "iOS 7 Status Bar Back to iOS 6 style?")

สรุป:

เพื่อให้บรรลุเป้าหมายนี้เราใช้ Storyboard ให้มากที่สุดโดยการเลื่อนองค์ประกอบ UI ที่ทับซ้อนกันโดยแถบสถานะ (ภายใต้ iOS 7) ลงด้านล่างในขณะที่ใช้เดลต้าเพื่อย้อนกลับการเปลี่ยนแปลงเค้าโครงด้านล่างสำหรับ iOS 6.1 หรือรุ่นก่อนหน้า พื้นที่พิเศษที่เป็นผลลัพธ์ใน iOS 7 จะถูกครอบครองโดย UIView พร้อมกับ backgroundColor ที่ตั้งค่าเป็นสีที่เราเลือก สามารถสร้างหลังได้ในรหัสหรือใช้ Storyboard (ดูทางเลือกด้านล่าง)

สมมติฐาน:

เพื่อให้ได้ผลลัพธ์ที่ต้องการเมื่อทำตามขั้นตอนด้านล่างนี้จะถือว่าView controller-based status bar appearanceตั้งค่าเป็น NO และคุณStatus bar styleตั้งค่าเป็น "สไตล์สีดำใส (อัลฟา 0.5)" หรือ "สไตล์สีดำทึบ" คุณสามารถพบ / หรือเพิ่มการตั้งค่าทั้งสองได้ภายใต้ "ข้อมูล" ในการตั้งค่าโครงการของคุณ

ขั้นตอน:

  • เพิ่มมุมมองย่อยลงใน UIWindow เพื่อใช้เป็นพื้นหลังแถบสถานะของคุณ เพื่อให้บรรลุสิ่งนี้ให้เพิ่มสิ่งต่อไปนี้ลงใน AppDelegate ของคุณapplication: didFinishLaunchingWithOptions:หลังmakeKeyAndVisible

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
        statusBarBackgroundView.backgroundColor = [UIColor blackColor];
        [yourAppsUIWindow addSubview:statusBarBackgroundView];
    }
    
  • เนื่องจากคุณได้เพิ่มพื้นหลังโดยใช้โปรแกรมสำหรับ iOS 7 เท่านั้นคุณจะต้องปรับเค้าโครงขององค์ประกอบ UI ของคุณที่ทับซ้อนกันโดยแถบสถานะให้สอดคล้องกันในขณะที่รักษาเลย์เอาต์ไว้สำหรับ iOS6 เพื่อให้บรรลุสิ่งนี้ให้ทำดังต่อไปนี้:

    • รับรองว่า Use Autolayoutทำเครื่องหมายไว้สำหรับ Storyboard ของคุณ (เนื่องจากไม่เช่นนั้น "iOS 6/7 Deltas" จะไม่แสดงในตัวตรวจสอบขนาด) เพื่อทำสิ่งนี้:
      • เลือกไฟล์ Storyboard ของคุณ
      • แสดงยูทิลิตี้
      • เลือก "แสดงตัวตรวจสอบไฟล์"
      • ภายใต้ "Interface Builder Document" ให้ยกเลิกการเลือก "Use Autolayout"
    • อีกทางเลือกหนึ่งเพื่อช่วยคุณตรวจสอบการเปลี่ยนแปลงเค้าโครงสำหรับทั้ง iOS 7 และ 6 ในขณะที่คุณใช้งานให้เลือก "Assistant Editor" เลือก "Preview" และ "iOS 6.1 หรือก่อนหน้า": ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่
    • ตอนนี้เลือกองค์ประกอบ UI ที่คุณต้องการปรับเพื่อไม่ให้ทับซ้อนกันโดยแถบสถานะอีกต่อไป
    • เลือก "Show the Size Inspector" ในคอลัมน์ Utilities
    • จัดตำแหน่งองค์ประกอบ UI ของคุณตามแกน Y ด้วยจำนวนเดียวกันกับความสูง bg ของแถบสถานะ: ป้อนคำอธิบายภาพที่นี่
    • และเปลี่ยนค่า Deltas iOS6 / 7 สำหรับ Y ด้วยจำนวนที่เป็นลบเดียวกันกับความสูง bg ของแถบสถานะ (สังเกตการเปลี่ยนแปลงในการแสดงตัวอย่าง iOS 6 หากคุณใช้งาน): ป้อนคำอธิบายภาพที่นี่

ทางเลือก:

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

ข้อเสียของทางเลือกนี้ (แม้ว่าอาจจะเล็กน้อยเมื่อพิจารณาถึงความเข้ากันได้ของการหมุนอัตโนมัติ) คือความจริงที่ว่ามุมมองพิเศษนี้จะไม่สามารถมองเห็นได้ในทันทีหากคุณกำลังดู Storyboard สำหรับ iOS 6 คุณจะรู้แค่ว่ามันอยู่ที่นั่นถ้าคุณได้ดู " Document Outline "ของ Storyboard


12

หากคุณไม่ต้องการให้ตัวควบคุมมุมมองของคุณซ้อนทับกันโดยแถบสถานะ (และแถบนำทาง) ให้ยกเลิกการเลือกช่อง "ขยายขอบภายใต้แถบด้านบน" ในตัวสร้างอินเทอร์เฟซในXcode 5

ยกเลิกการเลือกขอบขยายใต้แถบด้านบน


7
สิ่งนี้เป็นไปได้ก็ต่อเมื่อคุณใช้สตอรี่บอร์ด
Cœur

3
ใช้งานได้กับคอนเทนเนอร์ vcs เช่นตัวควบคุมการนำทางหรือตัวควบคุมแถบแถบเท่านั้น
Andrea

2
edgeForExtendedLayout ถูกใช้โดยตัวควบคุมมุมมองคอนเทนเนอร์เท่านั้น (เช่น UINavigationController) เพื่อพิจารณาว่ามุมมองของเด็กควรซ้อนทับกันโดย Chrome ของผู้ปกครอง การตั้งค่าคุณสมบัตินี้บนตัวควบคุมมุมมองรูทสำหรับ UIWindow ไม่ได้ทำอะไรเลย ดูคำตอบของฉันด้านบน: stackoverflow.com/questions/18294872/…
jaredsinclair

คุณทำเพื่อ UITabBarController @Andrea ได้อย่างไร? ขอบคุณ.
KarenAnne

@KarenAnne ขึ้นอยู่กับว่าคุณทำโดยใช้โปรแกรมหรือกับสตอรี่บอร์ด โดยทางโปรแกรมคุณเพียงแค่ต้องตั้งค่าคุณสมบัติ edgeForExtent เป็นสิ่งที่คุณต้องการในตัวควบคุมมุมมองที่คุณกำลังแสดงภายใน UITabBarViewController แต่เพื่อไม่มีปัญหาของแถบสถานะคุณต้องโหลด uinavigationcontroller ภายใน UITabbarController ตรวจสอบที่นี่ developer.apple.com/library/ios/documentation/UserExperience/…
Andrea

11

Apple เปิดตัวเทคนิค Q & A QA1797: ป้องกันแถบสถานะจากครอบคลุมผู้ชมของคุณ ใช้งานได้ดีสำหรับเวอร์ชัน iOS 6 และ iOS 7


5
Apple สมมติว่าทุกคนใช้การจัดวางอัตโนมัติ การจัดวางอัตโนมัตินั้นแย่มากใน Xcode 4 และ Xcode 5 เพิ่งเปิดตัวเท่านั้นดังนั้นนี่จึงเป็นข้อสันนิษฐานที่น่าสงสัย
Glenn Maynard

1
แต่ในโอกาสนี้เป็นทางออกที่ดีกว่าจากนั้นปรับขนาดกรอบของหน้าต่างรูทหรือแถบสถานะ
อิกอร์

เท่าที่ฉันสามารถบอกได้โซลูชันของ Apple จะไม่ทำงานหาก rootViewController ของคุณเป็น SplitViewController
Vern Jensen

8

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

if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
    float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
    for( UIView *v in [self.view subviews] ) {
        CGRect rect = v.frame;
        rect.origin.y += statusBarHeight;
        v.frame = rect;
    }
}

ตรรกะเป็นเรื่องง่าย ฉันเปลี่ยนมุมมองของเด็ก ๆ ทุกคนในตัวเองมุมมองด้วย 20 พิกเซล นั่นคือทั้งหมด จากนั้นภาพหน้าจอจะแสดงเช่นเดียวกับที่ iOS 6 ทำ ฉันเกลียดแถบสถานะ iOS7! ~ "~


2
จะเพิ่มได้ที่ไหน ใน app delegate เปิดตัวพร้อมตัวเลือก?
mhmdshawqi

เมื่อฉันทำสิ่งนี้แถบสถานะของฉันจะเปลี่ยนเป็นสีขาว
ropo

6

ทางเลือกเล็ก ๆ สำหรับคำตอบของ Archy Holt ง่ายกว่าเล็กน้อย:

ก. ตั้งค่าUIViewControllerBasedStatusBarAppearanceเป็นNOใน info.plist

ข. ในAppDelegate's application:didFinishLaunchingWithOptions:โทร:

if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
    // handling statusBar (iOS7)
    application.statusBarStyle = UIStatusBarStyleLightContent;
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.window.clipsToBounds = YES;

    // handling screen rotations for statusBar (iOS7)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

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

- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
    // handling statusBar (iOS7)
    self.window.frame = [UIScreen mainScreen].applicationFrame;
}

คุณยังสามารถพิจารณาคลาสย่อยUIWindowเพื่อจัดการUIApplicationDidChangeStatusBarOrientationNotificationตัวเองได้


คุณมีปัญหากับ presentViewController: animated: complete:?
TùngĐỗ

@ TùngĐỗจริงฉันจึงสร้างทางเลือกที่ดีกว่า: stackoverflow.com/questions/18294872/…
Cœur

5

ฉันใช้สิ่งนี้ในตัวควบคุมมุมมองทั้งหมดของฉันมันง่ายมาก เพิ่มบรรทัดนี้ในเมธอด viewDidLoad ทั้งหมดของคุณ:

- (void)viewDidLoad{
    //add this 2 lines:
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

    [super viewDidLoad];
}

1
ทำงานอย่างมีเสน่ห์และตายง่าย ในการเคลื่อนไหวของทับทิมก่อนการเรียกใช้ขั้นสูง: self.edgesForExtendedLayout = UIRectEdgeNone ถ้า responseToSelector ("edgeForExtendedLayout")
tehprofessor

4

ลองใช้วิธีง่ายๆนี้ ....

ขั้นตอนที่ 1 : ในการเปลี่ยนเดี่ยวviewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

ขั้นตอนที่ 2 : ในการเปลี่ยนแอปพลิเคชันทั้งหมด

info.plist
      ----> Status Bar Style
                  --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque

ขั้นตอนที่ 3 : เพิ่มสิ่งนี้ในแต่ละอันviewWillAppearเพื่อปรับstatusbarความสูงสำหรับiOS7

    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
        CGRect frame = [UIScreen mainScreen].bounds;
        frame.origin.y+=20.0;
        frame.size.height-= 20.0;
        self.view.frame = frame;
        [self.view layoutIfNeeded];
    }


3

ฉันได้รับแถบสถานะเช่น iOS 6 ใน iOS 7

ตั้งค่า UIViewControllerBasedStatusBarAppearance เป็น NO ใน info.plist

วางรหัสนี้ใน- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsวิธีการ

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height);

    //Added on 19th Sep 2013
    NSLog(@"%f",self.window.frame.size.height);
    self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}

มันอาจดันมุมมองทั้งหมดของคุณลง 20 พิกเซลในการมานั้นใช้รหัสต่อไปนี้ใน-(void)viewDidAppear:(BOOL)animatedวิธีการ

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    CGRect frame=self.view.frame;
    if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
    {
        frame.size.height-=20;
    }
    self.view.frame=frame;
}

คุณต้องตั้งค่า windowHeight Userdefaults หลังจากการจัดสรรหน้าต่างใน didFinishLauncing Method เช่น

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];

แนวทางที่ดีกว่าคือทำให้ UINavigationBar heightเท่ากับ 64 แทนที่จะเป็น 44 จากนั้นแถบของคุณจะขยายไปจนสุดเหมือนในแอพของ Apple
Aaron Brager

@AaronBrager แต่ความต้องการของฉันคือแสดงแถบสถานะสไตล์ iOS 6
Desert Rose

คุณช่วยเพิ่มโซลูชันสำหรับ Landscape Orientation iOS 7 ได้ไหม. ฉันกำลังทำสิ่งเดียวกัน แต่มันไม่ทำงานใน iOS 7 Landscape
sathiamoorthy

@DesertRose THX! สิ่งนี้ใช้ได้กับฉัน แต่มันตัด uitabbar ที่ด้านล่างออก ฉันมีแอพที่ใช้ตัวควบคุมแถบแท็บที่มี 3 มุมมองซึ่ง 2 ในนั้นคือตัวควบคุมตารางวิว
marciokoko

1
จนกว่าฉันจะหมุนอุปกรณ์ (อุปกรณ์ iOS 7 ของฉันคือ iPad) สิ่งนี้จะแก้ไขได้อย่างสมบูรณ์แบบ แต่เมื่อฉันหมุนแถบสีดำจะยังคงอยู่ตรงตำแหน่งและ "มุมมอง" (ขออภัยหากเป็นคำศัพท์ทางเทคนิคที่ไม่ถูกต้องฉันเป็น PhoneGap / เว็บ) จะคงความสูงที่หดตัวไว้ - ยกเว้นว่าจะไม่สูงอีกต่อไปแล้ว ความกว้าง. โซลูชันนี้ไม่รองรับการหมุน แต่เป็นการแก้ไขที่ดีที่สุดที่ฉันเคยเห็นจะปรับปรุงได้อย่างไรเพื่อดูการหมุนอุปกรณ์ ขอบคุณ!
tylerl

2

หากคุณใช้ตัวสร้างอินเทอร์เฟซให้ลองสิ่งนี้:

ในไฟล์ xib ของคุณ:

1) เลือกมุมมองหลักตั้งค่าสีพื้นหลังเป็นสีดำ (หรือสีอะไรก็ได้ที่คุณต้องการให้แถบสถานะเป็น

2) ตรวจสอบให้แน่ใจว่าพื้นหลังเป็นมุมมองย่อยที่มีอยู่ในตัวเองซึ่งอยู่ในตำแหน่งระดับบนสุดของมุมมองของคอนโทรลเลอร์
ย้ายพื้นหลังของคุณเพื่อเป็นลูกโดยตรงในมุมมองของคอนโทรลเลอร์ ตรวจสอบแผงการปรับขนาดอัตโนมัติเพื่อให้แน่ใจว่าคุณได้ล็อกขอบเฟรมทั้งหมดแล้วเปิดใช้งานแกนความยืดหยุ่นทั้งสองและหากเป็น UIImageView ให้ตั้งค่าโหมดเนื้อหาเป็นขนาด โดยทางโปรแกรมจะแปลเป็น contentMode ที่ตั้งค่าเป็น UIViewContentModeScaleToFill และมีการตั้งค่ามาสก์การปรับขนาดอัตโนมัติเป็น (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

3) ตอนนี้ย้ายทุกอย่างที่ล็อคไปด้านบน - ลง 20 pts และตั้งค่าเดลต้า iOS 6/7 Y เป็น -20
เด็กระดับบนสุดทั้งหมดที่ถูกล็อคไว้ที่กรอบด้านบนในแผงการปรับขนาดอัตโนมัติจะต้องเลื่อนลง 20pts และตั้งค่าเดลต้า Y ของ iOS 6/7 เป็น -20 (Cmd เลือกทั้งหมดและคลิกลูกศรลง 20 ครั้ง - มีใครดีกว่านี้ไหม)

4) ปรับความสูงเดลต้า iOS 6/7 ของรายการข้างต้นทั้งหมดที่มีความสูงที่ยืดหยุ่น รายการใด ๆ ที่ถูกล็อคเข้ากับเฟรมด้านบนและด้านล่างและเปิดใช้ความสูงที่ยืดหยุ่นในแผงการปรับขนาดอัตโนมัติจะต้องตั้งค่าความสูงเดลต้า iOS 6/7 เป็น 20 ซึ่งรวมถึงมุมมองพื้นหลังที่กล่าวถึงข้างต้นด้วย สิ่งนี้อาจดูเหมือนต่อต้านการใช้งานง่าย แต่เนื่องจากลำดับที่ใช้สิ่งเหล่านี้จึงเป็นสิ่งจำเป็น ความสูงของเฟรมถูกตั้งค่าก่อน (ขึ้นอยู่กับอุปกรณ์) จากนั้นใช้เดลต้าและในที่สุดก็ใช้มาสก์การปรับขนาดอัตโนมัติตามตำแหน่งออฟเซ็ตของเฟรมย่อยทั้งหมด - ลองคิดดูสักหน่อยมันจะสมเหตุสมผล

5) สุดท้ายรายการที่ถูกล็อคไว้ที่กรอบด้านล่าง แต่ไม่ใช่เฟรมด้านบนไม่จำเป็นต้องมีเดลต้าเลย

ซึ่งจะทำให้คุณมีแถบสถานะเหมือนกันใน iOS7 และ iOS6

ในทางกลับกันหากคุณต้องการสไตล์ iOS7 ในขณะที่ยังคงความเข้ากันได้กับ iOS6 ให้ตั้งค่าความสูงของเดลต้า Y / เดลต้าเป็น 0 สำหรับมุมมองพื้นหลัง

หากต้องการดูข้อมูลการย้าย iOS7 เพิ่มเติมโปรดอ่านโพสต์แบบเต็ม: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html


ไม่มีเดลต้าเมื่อใช้รูปแบบอัตโนมัติ
หายไปการแปล

2

วิธีแก้ปัญหาของฉันคือเพิ่มUIViewความสูง 20 คะแนนที่ด้านบนของหน้าต่างเมื่ออยู่บน iOS 7 จากนั้นฉันก็สร้างเมธอดในคลาส AppDelegate ของฉันเพื่อแสดง / ซ่อนพื้นหลังของแถบสถานะ "ทึบ" ในapplication:didFinishLaunchingWithOptions::

// ...

// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];

// ...
return YES;

จากนั้นฉันสร้างวิธีการเลือนเข้า / ออกพื้นหลังแถบสถานะสีดำ:

- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
    [UIView animateWithDuration:0.3f animations:^{
        if(solidStatusBar)
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
            self.statusBarBackground.alpha = 1.0f;
        }
        else
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
            self.statusBarBackground.alpha = 0.0f;
        }
    }];
}

สิ่งที่ฉันต้องทำตอนนี้คือโทร[appDelegate showSolidStatusBar:YES]เมื่อจำเป็น


2

นี่อาจเป็นปัญหาที่หนักใจหากคุณใช้การจัดวางอัตโนมัติเนื่องจากคุณไม่สามารถจัดการเฟรมได้โดยตรงอีกต่อไป มีวิธีง่ายๆโดยไม่ต้องทำงานมากเกินไป

ฉันลงเอยด้วยการเขียนวิธียูทิลิตี้ในคลาสยูทิลิตี้และเรียกใช้จากวิธีการควบคุมมุมมองviewDidLayoutSubviewsทั้งหมด

+ (void)addStatusBarIfiOS7:(UIViewController *)vc
    {
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
            CGRect viewFrame = vc.view.frame;
            if(viewFrame.origin.y == 20) {
                //If the view's y origin is already 20 then don't move it down.
                return;
            }
            viewFrame.origin.y+=20.0;
            viewFrame.size.height-= 20.0;
            vc.view.frame = viewFrame;
            [vc.view layoutIfNeeded];
        }
    }

แทนที่viewDidLayoutSubviewsวิธีการของคุณในตัวควบคุมมุมมองที่คุณต้องการแถบสถานะ จะช่วยให้คุณผ่านภาระการจ่ายอัตโนมัติ

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}

1

วิธีที่ง่ายที่สุดคือการติดตั้ง SDK รุ่นเก่าลงใน Xcode ใหม่ล่าสุดของคุณ

จะติดตั้ง SDK รุ่นเก่าไปยัง Xcode ใหม่ล่าสุดได้อย่างไร

  1. คุณสามารถรับ iOS 6.1 SDK จากhttp://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.htmlหรือดาวน์โหลด Xcode รุ่นเก่าและรับ SDK จากเนื้อหา

  2. คลายซิปและวางโฟลเดอร์นี้ลงใน /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs

  3. รีสตาร์ท xcode

  4. ตอนนี้คุณสามารถเลือก SDK ที่เก่ากว่าในการตั้งค่าการสร้างโครงการของคุณได้แล้ว

หวังว่าจะช่วยคุณได้ มันได้ผลสำหรับฉัน =)


ทำงานให้ฉัน ขอบคุณ @marcelosalloum แต่ยังคงค้นหาวิธีแก้ปัญหาสำหรับแอพ phonegap (uiwebview) ของฉันเพื่อรองรับแถบสถานะโปร่งใสของ iOS7 สำหรับการอัปเดตแอปในอนาคต ขอบคุณอีกครั้ง. ;)
hanism

@marcellosaloum แน่ใจหรือว่าแอปจะได้รับการยอมรับจาก Apple? พวกเขากล่าวว่าแอพที่รวบรวมด้วย XCode 4 จะไม่ได้รับการยอมรับอีกต่อไป ... ซึ่งตามความเป็นจริงแล้ว iOS 6 SDK
Valerio

แอปของฉันได้รับการยอมรับอย่างแท้จริงเนื่องจาก Xcode5 สามารถรวบรวม iOS SDK รุ่นเก่าได้ ฉันไม่แน่ใจว่า AppStore จะปฏิเสธแอพที่สร้าง Xcode4 แต่ (Xcode4! = iOS 6 SDK) ตามที่คุณพูด
marcelosalloum

หลังจากวันที่ 1 กุมภาพันธ์? ในวันนั้น Apple ได้บังคับใช้
Valerio

ไม่ได้แตะรหัสนั้นครั้งสุดท้ายเมื่อปีที่แล้วชาวบ้าน ไม่ทราบว่า Apple ได้บังคับใช้ (ไม่ยินดีที่จะทราบ) คุณช่วยโพสต์ลิงค์ที่ระบุไว้ที่นี่ได้ไหม ไชโย
marcelosalloum

1

ในขณะที่ใช้สิ่งนี้ทำให้presentViewController:animated:completion:สับสนwindow.rootViewController.viewฉันจึงต้องหาวิธีอื่นในการแก้ไขปัญหานี้ ในที่สุดฉันก็สามารถใช้งานโมดอลและการหมุนได้โดยการ subclassing UIView ของ rootViewController ของฉัน

.h

@interface RootView : UIView

@end

.m

@implementation RootView

-(void)setFrame:(CGRect)frame
{
    if (self.superview && self.superview != self.window)
    {
        frame = self.superview.bounds;
        frame.origin.y += 20.f;
        frame.size.height -= 20.f;
    }
    else
    {
        frame = [UIScreen mainScreen].applicationFrame;
    }

    [super setFrame:frame];
}

- (void)layoutSubviews
{
    self.frame = self.frame;

    [super layoutSubviews];
}

@end

ตอนนี้คุณมีวิธีแก้ปัญหาเบื้องต้นสำหรับภาพเคลื่อนไหว iOS7


1

ฉันมาสายสำหรับคำตอบนี้ แต่ฉันแค่อยากแบ่งปันสิ่งที่ฉันทำซึ่งโดยพื้นฐานแล้วเป็นวิธีแก้ปัญหาที่ง่ายที่สุด

ก่อนอื่น -> ไปที่info.plistไฟล์ของคุณและเพิ่มสไตล์แถบสถานะ -> สไตล์สีดำโปร่งใส (อัลฟา 0.5)

ตอนนี้มันไป: -

เพิ่มรหัสนี้ใน AppDelegate.m ของคุณ

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }

0

วิธีแก้ปัญหาที่ง่ายมากของฉัน (สมมติว่าคุณรองรับการวางแนวตั้งเท่านั้น) คือการกำหนดขอบเขตหน้าต่างแอปพลิเคชันใหม่สำหรับ iOS เวอร์ชันต่ำกว่า 7 ในวิธีการมอบหมายแอป didFinishLaunchingWithOptions:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
    // handling statusBar (iOS6) by leaving top 20px for statusbar.
    screenBounds.origin.y = 20;
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}

รหัสของคุณเพียงแค่เลื่อน 'y' จาก 0 เป็น 20 แต่ไม่ได้ปรับความสูงให้เหมาะสมดังนั้นคุณควรเพิ่ม screenBounds.size.height - = 20; หลังจาก screenBounds.origin.y = 20;
Amit C.

0

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

UIStatusBarStyleNone หรือตั้งค่าในการตั้งค่าเป้าหมาย


2
ที่ระบุ UIStatusbarstylenone
user4951

0

ขั้นตอนในการซ่อนแถบสถานะใน iOS 7:

1. ไปที่ไฟล์ info.plist แอปพลิเคชันของคุณ

2. และตั้งค่าดูลักษณะแถบสถานะตามตัวควบคุม: หมายเลขบูลีน

หวังว่าฉันจะแก้ไขปัญหาแถบสถานะ .....


0

ในการทำงานกับ setStatusBarHidden ต่อไป: ฉันใช้หมวดหมู่นี้:

@interface UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;

@end

@implementation UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
    if (!IOS7) {
        [self setStatusBarHidden:statusBarHidden];
        return;
     }

    if ([self isStatusBarHidden] == statusBarHidden) {
        return;
    }

    [self setStatusBarHidden:statusBarHidden];
    [self keyWindow].clipsToBounds = YES;
    CGFloat offset = statusBarHidden ? 0 : 20;
    [self keyWindow].frame =  CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
    [self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}

@end


0

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

นี่คือสิ่งที่ฉันพบว่าใช้ได้ผล

        self.navigationController?.navigationBar.clipsToBounds = true
        self.navigationController?.navigationBar.translucent = false
        self.navigationController?.navigationBar.barStyle = .Black
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

มันทำให้พื้นหลังแถบสถานะของฉันเป็นสีดำข้อความในแถบสถานะเป็นสีขาวและสีของแถบนำทางเป็นสีขาว

iOS 9.3, XCode 7.3.1

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