แถบการนำทางปรากฏเหนือมุมมองด้วย iOS7 SDK ใหม่


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

ในเวอร์ชันก่อนหน้านี้ทำงานได้อย่างถูกต้อง แถบค้นหาปรากฏด้านล่างstatusbarและแถบนำทาง tableviewปรากฏด้านล่างแถบค้นหา

แต่เมื่อฉันเปิดใช้งานXcode 5 sdk iOS 7แถบค้นหาจะไม่ปรากฏให้เห็น (ฉันคิดว่ามันวางอยู่ใต้แถบสถานะและแถบนำทาง) และแถบนำทางก็ปรากฏเหนือมุมมองตารางด้วย

จะได้รับการแก้ไขด้วยการiOS 7ปล่อยที่เสถียรหรือไม่?

หรือเป็นปัญหาของการเข้ารหัสของฉัน?

หรือเราควรจัดการโดยเพิ่ม(y = statubar height + nav bar height)ค่าy เพื่อiOS 7?

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

ใน viewDidLayoutSubviews ฉันพิมพ์ขอบเขตของมุมมอง:

{{0, 0}, {320, 568}}

ส่งผลให้เนื้อหาของฉันปรากฏใต้แถบนำทางและแถบสถานะ

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

มีใครประสบปัญหานี้อีกบ้าง?

UPDATE:

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

self.navigationController.navigationBar.translucent = NO;

การดำเนินการนี้จะแก้ไขมุมมองไม่ให้อยู่ในกรอบใต้แถบนำทางและแถบสถานะ

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


4
ซอฟต์แวร์เบต้า ฟอรัมนักพัฒนาของ Apple มีความเหมาะสมมากกว่า นอกจากนี้ปัญหายังถูกกล่าวถึงอย่างชัดเจนในคู่มือการเปลี่ยนแปลง
Sulthan

คำตอบ:


188

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

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

คุณต้องเพิ่มข้างต้นใน-(void)viewDidLoadวิธีการของคุณ

หมายเหตุ: คุณควรใช้ iOS 7 และ Xcode 5 เวอร์ชันล่าสุดของ GM ในขณะนี้เนื่องจาก API ได้เปลี่ยนจากเวอร์ชันเบต้า


ในรหัสของฉันมันเขียนว่า edgeForExtendedLayout การใช้ UIExtendedEdgeNone ตัวระบุที่ไม่ได้ประกาศ กรุณาช่วย.

6
เปลี่ยนเป็น UIRectEdgeNone
Simon

6
นั่นเป็นเหตุผลที่ไม่ควรถามหรือตอบคำถามดังกล่าวที่นี่
Sulthan

ฉันไม่แน่ใจว่าทำไมถ้าคุณต้องการรักษาความเข้ากันได้กับ ios6 คุณถูกบังคับให้แนะนำกรณีที่มีเงื่อนไขตามรหัสเพื่อตรวจสอบว่าคอนโทรลเลอร์มีคุณสมบัตินั้นหรือไม่ ..
jerrygdm

12
สิ่งนี้ดูเหมือนจะใช้ได้เฉพาะในกรณีที่มุมมองฝังอยู่ใน UINavigationController
pojo

37

ภาพหน้าจอจากสตอรี่บอร์ด

หากคุณกำลังทำงานใน Storyboard (ซึ่งฉันขอแนะนำอย่างยิ่ง!) นี่คือวิธีแก้ปัญหา: คุณสามารถปิดใช้งาน "Extend Edges" ของ ViewController ในสตอรี่บอร์ดได้ คุณต้องทำสิ่งนี้สำหรับแต่ละ viewController คุณสามารถปิดใช้งานขอบที่ขยายได้โดยคลิกที่ไอคอน viewController ใน stortyboard (นอกเหนือจาก productOwner ที่อยู่ใต้มุมมองนั้นเอง) จากนั้นเลือกตัวตรวจสอบแอตทริบิวต์ (เช่นเดียวกับภาพที่แสดง)

นอกจากนี้ยังจะกำหนดเส้นการจัดตำแหน่งเช่น iOS 6

เครื่องมือที่ยอดเยี่ยมอีกอย่างใน xCode 5 คือ "ดูตัวอย่าง": คลิกที่ปุ่มบัตเลอร์ (ตัวแก้ไขผู้ช่วย) แล้วเลือกดูตัวอย่าง คุณสามารถเลือก iOS 6 และดูว่าการออกแบบสตอรีบอร์ดของคุณจะเป็นอย่างไรบน iOS 6

มันยอดเยี่ยมมาก: D

[Update]

โปรดระวัง: การปิดใช้งาน "Extend Edges" อาจทำให้เกิดแสงสีดำบนแถบนำทางเมื่อแอปเข้าสู่พื้นหลังบน iOS7 เรืองแสงจะปรากฏให้เห็นในมุมมองมัลติทาสก์ด้วย (กดปุ่มโฮมสองครั้ง) ซึ่งสามารถแก้ไขได้โดยการตั้งค่าสีพื้นหลังของมุมมองแถบการนำทางเป็นสีขาว

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

ใช่นี่คือทางออกที่มาจากมุมมองของสตอรีบอร์ด ขอบคุณ.
jpittman

12

ตามที่ OP บอกมีวิธีง่ายๆในการตั้งค่าแถบนำทางให้ทึบแสง แทนที่จะทำในโค้ดเพียงแค่ยกเลิกการเลือก "โปร่งแสง" สำหรับแถบนำทางรูทของคุณ:

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


8

self.edgesForExtendedLayout=UIRectEdgeNone;

ทำงานบนโปรแกรมจำลอง iOS 7 (Xcode 5 DP5)


2
สิ่งนี้ใช้งานได้ดีใน ios7 แต่ถ้าฉันรันแอพบน ios 6 และก่อนหน้านี้อีกครั้งมุมมองจะถูกย้ายขึ้น วิธีแก้ปัญหานี้หรือไม่? นอกจากนี้เราต้องตั้งค่าคุณสมบัตินี้ในแต่ละ view controller viewdid load method?
loganathan

คุณสามารถตรวจสอบได้ตลอดเวลาว่า iOS ปัจจุบันคือ 7 หรือไม่ด้วยสิ่งนี้หาก:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross

2

คำตอบเหล่านี้ล้วนมีประโยชน์โดยเฉพาะ MQoder แต่สำหรับฉันฉันต้องตั้งค่าแถบด้านบนเริ่มต้นเป็น "การนำทางสีดำทึบแสง" ด้วย

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


1

คำตอบของ @One Man Crew นั้นถูกต้อง แต่:

ฉันอยากจะแนะนำให้ใช้รหัสนี้เพื่อหลีกเลี่ยงข้อผิดพลาดเมื่อเรียกใช้แอปในเวอร์ชันเก่า:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

และคุณต้องทำสิ่งนี้ในแอปพลิเคชัน AppDelegate #: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

มิฉะนั้นสีพื้นหลังของแถบนำทางจะเปลี่ยนเป็นสีเทา เนื่องจากแถบนำทางโปร่งใสซ้อนทับหน้าต่าง


0

หากคุณต้องการรักษาความโปร่งใสเมื่อผู้ใช้เลื่อนมุมมองตารางของคุณคุณสามารถตั้งค่า contentInset ของมันได้:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

ทางออกหนึ่งคือการใช้ตัวควบคุมการนำทาง วิธีนี้จะช่วยแก้ปัญหาโดยอัตโนมัติ ใช้ Xcode 5 แทน Xcode Preview เวอร์ชันเนื่องจากเป็นเวอร์ชันเบต้า

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