จะป้องกันไม่ให้ UINavigationBar ครอบคลุมมุมมองด้านบนใน iOS 7 ได้อย่างไร


99

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

เนื้อหาทั้งหมด เนื้อหาทั้งหมดบน Idle

ใครทราบว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร

แก้ไข: ฉันได้ลองคำแนะนำก่อนหน้านี้:

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

แต่ให้ผลลัพธ์ที่แปลกมาก

ความพยายามในการแก้ปัญหา

อาจเป็นเพราะฉันมี "เมนูสไลด์" ภายใต้ตัวควบคุมมุมมองนี้ซึ่งปรากฏขึ้นเนื่องจากความโปร่งใสของแถบนำทาง


นี่คือทางออกอื่นสำหรับปัญหานี้ stackoverflow.com/a/51491645/10148333
Afonso

คำตอบ:


235

ตั้งค่าคุณสมบัติโปร่งแสงของแถบนำทางเป็น NO :

self.navigationController.navigationBar.translucent = NO;

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

หากคุณต้องแสดงและซ่อนแถบนำทางให้ใช้

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

ในviewDidLoadวิธีการของคุณ


1
ฉันวางสิ่งนี้ไว้ภายใต้viewDidLoadอย่างไรก็ตามมันไม่ให้การเปลี่ยนแปลง
Sam D20

13
ทำให้มันอยู่ใน funtions viewDidLayoutSubviews
ฮินดู

1
การเพิ่มสิ่งนี้เข้ากับ viewDidLayoutSubviews เป็นเคล็ดลับ ขอขอบคุณที่ช่วยเหลือสุภาพบุรุษ!
Sam D20

สวัสดีคำถามใด ๆ ? หรือเป็นคำชม?
ฮินดู

1
self.edgesForExtendedLayout = UIRectEdgeNone; ช่วยด้วย
luky

32

ในiOS 7โดยค่าเริ่มต้นทั้งหมดควบคุมค่าคุณสมบัติโปร่งแสงคือใช่เพื่อให้คุณตั้งค่าคุณสมบัติโปร่งแสง NOสำหรับปัญหานี้

self.navController.navigationBar.translucent = NO;

2
ไม่มีคุณสมบัติ "navController" ใช้สิ่งนี้: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

ฉันสร้างวัตถุ navigtionbarcontroller ใน app delegate และตั้งชื่อ navController
Sumit Mundra

21

คุณสามารถปิดใช้งาน "ขยายขอบ" ในตัวตรวจสอบคุณสมบัติของ View Controller ของหน้าจอนี้ (ดังแสดงในภาพด้านล่าง):

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



8

หากคุณต้องการคงความโปร่งแสงไว้navigationBarในตอนท้ายของคุณviewDidLoadหรือในviewWillAppearโค้ดของคุณเพิ่มบรรทัดนี้:

[self.view sendSubviewToBack:self.tableView]

ยังไงก็เถอะถ้าคุณscrollViewsubclass ( UITableView, UICollectionViewฯลฯ ) ที่index0 ในมุมมองปัจจุบันของคุณก็จะปรับขุ่นอัตโนมัติตามที่คุณsubviews navigationBarและไม่ควรส่งผลกระทบต่อ UI ของคุณในเวอร์ชันก่อน iOS7 ด้วย


แก้ไข หากคุณเริ่มต้นด้วยUITableViewโปรแกรมของคุณคุณควรเพิ่มลงในมุมมองโดยใช้สิ่งนี้[self.view insertSubview:self.tableView atIndex:0];


นี่น่าจะเป็นคำตอบที่ถูกต้อง หากคุณกำลังเพิ่มมุมมองย่อยโดยใช้โปรแกรมคุณสามารถทำได้[self.view insertSubview:self.tableView atIndex:0];แทนที่จะส่งไปด้านหลังหลังจากที่คุณเพิ่มแล้ว
smitt04

แก้ไข. แต่ไม่รู้ว่าเขาเริ่มต้นคอนโทรลเลอร์อย่างไร (โดยทางโปรแกรมตัวสร้างอินเทอร์เฟซ) เราไม่สามารถสรุปได้ว่าเป็นทางออกที่ดีที่สุด แม้ว่าฉันจะแก้ไขคำตอบของฉันแล้ว
jbouaziz

ใช้งานได้ แต่ดูเหมือนแฮ็ค มีประกาศในเอกสารอย่างเป็นทางการเกี่ยวกับเรื่องนี้หรือไม่?
John Tracid

4

Swift 4 :

ตั้งค่าบรรทัดของโค้ดต่อไปนี้ในเมธอด viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

คุณสามารถเพิ่มวิธีนี้ลงในตัวควบคุมมุมมองของคุณตามที่แสดงในURLนี้:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

อีกวิธีหนึ่งคือการตั้งค่าself.automaticallyAdjustsScrollViewInsets = YES;บนตัวควบคุมมุมมองของคุณ เปิดใช้งานโดยค่าเริ่มต้น แต่ในกรณีของคุณ:

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


-1

หากคุณต้องการควบคุมมุมมองอย่างสมบูรณ์และหลีกเลี่ยงการปรับแต่ง iOS ที่ผิดพลาด UITableView ระดับย่อยและปรับการแทรก (ทั้งตัวเลื่อนและตัวบ่งชี้) ใน - (โมฆะ) willMoveToWindow: (UIWindow *) newWindow ใช้ได้ผลสำหรับฉัน


-4

อีกทางเลือกหนึ่งคือเปิดไฟล์ Info.plist ของคุณในโหมดซอร์สโค้ดและป้อนข้อมูลต่อไปนี้:

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

หวังว่านี่จะช่วยได้


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