แถบการนำทางแสดง / ซ่อน


158

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

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

ฉันจะทำสิ่งนี้ได้อย่างไร ข้อเสนอแนะได้รับการชื่นชมเสมอ

คำตอบ:


381

นี่ไม่ใช่สิ่งที่สามารถบรรจุลงในโค้ดไม่กี่บรรทัด แต่นี่เป็นวิธีการหนึ่งที่เหมาะกับคุณ

ในการซ่อนแถบนำทาง:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

ในการแสดง:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

เอกสารสำหรับวิธีนี้สามารถใช้ได้ที่นี่

ในการฟัง "ดับเบิลคลิก" หรือแตะสองครั้งUIViewให้ทำคลาสย่อยและทำอินสแตนซ์ของคลาสย่อยนั้นviewคุณสมบัติของตัวควบคุมมุมมองของคุณ

ในมุมมอง subclass แทนที่ของวิธีการและนับจำนวนสัมผัสคุณได้รับในระยะเวลาของเวลาโดยการวัดเวลาระหว่างสองก๊อกติดต่อกันอาจจะมี-touchesEnded:withEvent: หรือทดสอบผลจากCACurrentMediaTime()[touch tapCount]

หากคุณได้รับสองก๊อกมุมมองคลาสย่อยของคุณจะมีปัญหาNSNotificationซึ่งตัวควบคุมมุมมองของคุณได้ลงทะเบียนเพื่อฟังแล้ว

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

แก้ไข

ส่วนหนึ่งของคำตอบของฉันสำหรับการจัดการกิจกรรมการแตะน่าจะมีประโยชน์ก่อน iOS 3.1 UIGestureRecognizerชั้นน่าจะเป็นวิธีการที่ดีในการจัดการดับเบิลก๊อกวันเหล่านี้

แก้ไข 2

วิธีที่รวดเร็วในการซ่อนแถบนำทางคือ:

navigationController?.setNavigationBarHidden(true, animated: true)

ในการแสดง:

navigationController?.setNavigationBarHidden(false, animated: true)

หากนี่เป็นแอปพลิเคชั่นสำหรับดูภาพถ่ายการซ่อนแถบนำทางทำให้เกิดการกระโดดที่ไม่พึงประสงค์สำหรับมุมมองภาพซึ่งฉันไม่พบวิธีป้องกัน 3.2 ช่วยให้คุณใช้ UIGestureRecognizer สำหรับการแตะสองครั้งซึ่งเป็นวิธีการที่ใช้กันอย่างแพร่หลาย (สำหรับ iPad atm เท่านั้น)
พอลลินช์

ขอบคุณมากอเล็กซ์คุณให้ฉันมาก infoemation ฉันจะทำตามแนวทางของคุณ .. ขอบคุณตัน
Shishir.bobby

เป็นเช่นนี้ใช้กับแถบแท็บ ??? ถ้าฉันต้องการซ่อน / แสดงแถบแท็บและฉันต้องการทำอะไร ขอแสดงความนับถือ shishir
Shishir.bobby

1
มีวิธีใดบ้างที่จะป้องกันไม่ให้ 'กระโดด' เปาโลพูดถึง? ฉันมีปัญหาเดียวกันมากและฉันไม่รู้ว่าอะไรเป็นสาเหตุให้เกิด .... ฉันไม่คิดว่าจะไม่มีใครสะดุดกับมัน
Icky

หากต้องการหยุด 'ข้าม' ไม่ให้เกิดขึ้นคุณต้องรีเซ็ตคุณสมบัติ contentInset ของ scrollview เป็น jclee ระบุหลังจากซ่อน / แสดงแถบนำทาง กล่าวคือ self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

รหัสนี้จะช่วยคุณ

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16

ก่อนอ่านส่วนในคู่มือการเขียนโปรแกรมควบคุมมุมมองสำหรับ iOS เกี่ยวกับ 'การใช้เค้าโครงแบบเต็มหน้าจอสำหรับมุมมองการนำทาง' และส่วนที่เกี่ยวกับสิ่งเดียวกันสำหรับมุมมองที่กำหนดเอง หากคุณพยายามทำบางอย่างเช่น Photos.app คุณอาจกำลังใช้มุมมองเลื่อน โปรดทราบว่าความคิดเห็นที่แถบนำทางเพิ่มเนื้อหาการเลื่อนลงในมุมมองการเลื่อนของคุณโดยอัตโนมัติเพื่อความสูงของแถบนำทาง (และแถบสถานะ) ดังนั้นคุณต้องรีเซ็ตคุณสมบัติ contentInset ของมุมมองเลื่อนของคุณกลับไปเป็นศูนย์ทันที (UIEdgeInsetsZero) การตั้งค่าสถานะเริ่มต้นของ NavigationBar และก่อนที่จะมีมุมมองปรากฏขึ้น

จากนั้นหากคุณมีการแตะเพียงครั้งเดียวเพื่อสลับแถบนำทางและ / หรือแถบสถานะเพื่อแสดงหรือซ่อนคุณต้องทำสองสิ่งในวิธีการสลับ ครั้งแรกที่ดูเหมือนว่าจะบันทึกคุณสมบัติ contentOffset มุมมองเลื่อนก่อนที่จะเปลี่ยนคุณสมบัติที่ซ่อน NavigationBar และเรียกคืนค่าที่บันทึกไว้ของคุณเพื่อ contentOffset ทันทีหลังจากนั้น และอย่างที่สองเป็นศูนย์อีกครั้งจากคุณสมบัติ contentInset เป็น UIEdgeInsetsZero หลังจากเปลี่ยนคุณสมบัติ navigationBarHidden นอกจากนี้หากคุณสลับแถบสถานะคุณจะต้องเปลี่ยนสถานะก่อนที่จะเปลี่ยนสถานะของแถบนำทาง


1
ขอบคุณมากสำหรับ contentOffset และ contentInset note คุณคือฮีโร่ตัวจริง
Altealice

ฉันเห็นด้วยคุณเป็นฮีโร่ตัวจริงที่นี่! ขอบคุณมาก.
Gaetan

9

ในSwiftลองสิ่งนี้

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

หรือ

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

ในการซ่อนแถบนำทาง:

[self.navigationController setNavigationBarHidden:YES animated:YES];

วิธีแสดงแถบนำทาง:

[self.navigationController setNavigationBarHidden:NO animated:YES];

ใน iOS 7 การทำให้สมบูรณ์อัตโนมัติจะส่งเสริมโซลูชันนี้ซึ่งตรงข้ามกับที่ได้รับการโหวตสูงสุด
Alex Zavatone

7

นี่เป็นวิธีแก้ปัญหาที่ง่ายและรวดเร็วมาก:

self.navigationController.hidesBarsOnTap = YES;

วิธีนี้จะใช้การแตะครั้งเดียวแทนการแตะสองครั้ง นอกจากนี้มันจะเปลี่ยนลักษณะการทำงานของตัวควบคุมการนำทางแม้หลังจากการกดหรือ popping ตัวควบคุมมุมมองปัจจุบัน

คุณสามารถแก้ไขพฤติกรรมนี้ได้ในคอนโทรลเลอร์ของคุณภายใน viewWillAppear: และ viewWillDisappear: การกระทำหากคุณต้องการตั้งค่าพฤติกรรมสำหรับคอนโทรลเลอร์มุมมองเดียวเท่านั้น

นี่คือเอกสาร :


5

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

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


2

ใน Swift 4.2 และ Xcode 10

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

หากคุณไม่ต้องการแสดงแถบการนำทางเฉพาะใน 1st VC แต่คุณต้องการแสดงใน onword ของ VC ที่ 2

ใน VC แรกของคุณเขียนรหัสนี้

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}

2

หากคุณต้องการตรวจสอบสถานะของแถบนำทางก็จะถูกซ่อน / แสดง คุณสามารถใช้รหัสต่อไปนี้เพื่อตรวจจับ -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

SWIFT CODE: ใช้งานได้กับ iOS 3.2 และใหม่กว่า

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

จากนั้นเขียน

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}

1
ฉันเชื่อว่านี่เป็นวิธีการแก้ปัญหาที่แย่การเพิ่มรูปแบบการแตะสามารถทำได้หากไม่ได้กำหนดค่าอย่างถูกต้องลบรูปแบบลายเส้นบนมุมมองอื่นเช่น UITableView หรือ UICollectionView นอกจากนี้การตรวจสอบว่าบูลีน == จริงนั้นซ้ำซ้อนและสามารถนำโปรแกรมเมอร์คนอื่น ๆ ให้คิดว่านี่เป็นวิธีปฏิบัติที่ดี คุณกำลังใช้กรณีอูฐในทางที่ผิดและขาดวงเล็บปีกกาท้ายในตัวอย่างของคุณ โปรดทราบตั้งแต่ตัวเลือก swift 2.2 ได้รับการอัปเดตเช่นกัน ล่าสุด swift รองรับเฉพาะใน iOS 7 ขึ้นไปและจะไม่ทำงานบน iOS 3.2 แน่นอน
David Rees
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.