Thanh điều hướng hiển thị / ẩn


158

Tôi có một ứng dụng với một thanh điều hướng bao gồm 2 nút thanh. Tôi muốn ẩn và hiển thị thanh điều hướng này khi người dùng chạm hai lần vào màn hình.

Ban đầu, thanh điều hướng nên được ẩn. Khi người dùng chạm hai lần vào màn hình, thanh điều hướng sẽ xuất hiện hình động, giống như những gì có thể nhìn thấy trong thư viện ảnh của iPhone.

Làm thế nào tôi có thể làm một cái gì đó này? Gợi ý luôn được đánh giá cao.

Câu trả lời:


381

Đây không phải là thứ có thể phù hợp với một vài dòng mã, nhưng đây là một cách tiếp cận có thể phù hợp với bạn.

Để ẩn thanh điều hướng:

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

Để hiển thị nó:

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

Tài liệu cho phương pháp này có sẵn ở đây .

Để nghe "nhấp đúp" hoặc nhấn đúp, lớp con UIViewvà tạo một thể hiện của lớp con đó thuộc tính của trình điều khiển xem của bạn view.

Trong lớp con khung nhìn, ghi đè -touchesEnded:withEvent:phương thức của nó và đếm số lần chạm bạn nhận được trong một khoảng thời gian, bằng cách đo thời gian giữa hai lần chạm liên tiếp, có lẽ bằng CACurrentMediaTime(). Hoặc kiểm tra kết quả từ [touch tapCount].

Nếu bạn nhận được hai vòi, chế độ xem được phân lớp NSNotificationcủa bạn sẽ phát sinh trình điều khiển xem của bạn đã đăng ký để lắng nghe.

Khi trình điều khiển chế độ xem của bạn nghe thấy thông báo, nó sẽ kích hoạt bộ chọn ẩn hoặc hiển thị thanh điều hướng bằng cách sử dụng mã đã nói ở trên, tùy thuộc vào trạng thái hiển thị hiện tại của thanh điều hướng, được truy cập thông qua việc đọc thuộc isHiddentính của thanh điều hướng .

BIÊN TẬP

Phần câu trả lời của tôi để xử lý các sự kiện nhấn có lẽ hữu ích trở lại trước iOS 3.1. Các UIGestureRecognizerlớp học có lẽ là một cách tiếp cận tốt hơn để xử lý hai vòi nước, những ngày này.

CHỈNH SỬA 2

Cách Swift để ẩn thanh điều hướng là:

navigationController?.setNavigationBarHidden(true, animated: true)

Để hiển thị nó:

navigationController?.setNavigationBarHidden(false, animated: true)

Nếu đây là một ứng dụng xem ảnh, việc ẩn thanh điều hướng sẽ gây ra một bước nhảy khó chịu cho chế độ xem hình ảnh mà tôi không tìm thấy cách ngăn chặn. 3.2 cho phép bạn sử dụng UIGestureRecognizer cho vòi kép, đây là cách tiếp cận gọn gàng hơn nhiều (chỉ dành cho iPad atm).
Paul Lynch

Cảm ơn Alex rất nhiều, bạn đã cung cấp cho tôi rất nhiều thông tin, tôi sẽ làm theo hướng dẫn của bạn .. cảm ơn rất nhiều
Shishir.bobby

điều này có được áp dụng tương tự cho các thanh tab không ??? nếu tôi muốn ẩn / hiển thị thanh tab dan wat tôi hv phải làm gì? liên quan đến
shishir

1
Có cách nào để ngăn chặn 'cú nhảy' này mà Paul đã đề cập không? Tôi có cùng một vấn đề và tôi không biết, nguyên nhân của nó .... tôi cũng không nghĩ, không ai từng vấp phải nó.
Icky

Để ngăn 'nhảy' xảy ra, bạn phải đặt lại thuộc tính contentInset của scrollview như đề cập của jclee, sau khi ẩn / hiển thị thanh điều hướng. I E. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

Mã này sẽ giúp bạn.

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

Trước tiên, hãy đọc phần trong Hướng dẫn lập trình điều khiển xem cho iOS về 'Áp dụng bố cục toàn màn hình cho Chế độ xem điều hướng' và phần tương tự cho Chế độ xem tùy chỉnh. Nếu bạn đang cố gắng làm một cái gì đó như Photos.app thì có lẽ bạn đang sử dụng chế độ xem cuộn. Lưu ý nhận xét rằng Thanh điều hướng tự động thêm phần nội dung cuộn vào chế độ xem cuộn của bạn để tính chiều cao của thanh điều hướng (và thanh trạng thái) để bạn phải đặt lại thuộc tính contentInset của chế độ xem cuộn của bạn về 0 (UIEdgeInsetsZero) ngay sau đó thiết lập trạng thái ban đầu của navigationBar và trước khi khung nhìn xuất hiện.

Sau đó, nếu bạn có một lần nhấn để bật điều hướng và / hoặc thanh trạng thái để hiển thị hoặc ẩn, bạn cần thực hiện hai điều trong phương thức bật tắt. Đầu tiên dường như là lưu thuộc tính contentPackset của chế độ xem cuộn trước khi thay đổi thuộc tính ẩn NavigationBar và khôi phục giá trị đã lưu của bạn thành contentPackset ngay sau đó. Và thứ hai một lần nữa loại bỏ thuộc tính contentInset thành UIEdgeInsetsZero sau khi thay đổi thuộc tính navigationBarHidden. Ngoài ra, nếu bạn đang chuyển đổi thanh trạng thái, bạn cần thay đổi trạng thái trước khi thay đổi trạng thái của navigationBar.


1
Cảm ơn bạn rất nhiều về nội dung Offerset và contentInset. Bạn là anh hùng thực sự.
Altealice

Tôi đồng tình, bạn là anh hùng thực sự, ở đây! Cảm ơn rất nhiều.
Gaetan

9

Trong Swift hãy thử điều này,

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

hoặc là

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

7

Để ẩn thanh Điều hướng:

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

Để hiển thị thanh Điều hướng:

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

Trong iOS 7, tự động hoàn thành thực sự thúc đẩy giải pháp này trái ngược với giải thưởng được bình chọn cao nhất.
Alex Zavatone

7

Đây là một giải pháp rất nhanh chóng và đơn giản:

self.navigationController.hidesBarsOnTap = YES;

Điều này sẽ hoạt động trên một lần nhấn thay vì nhấn đúp. Ngoài ra, nó sẽ thay đổi hành vi cho bộ điều khiển điều hướng ngay cả sau khi đẩy hoặc bật bộ điều khiển xem hiện tại.

Bạn luôn có thể sửa đổi hành vi này trong bộ điều khiển của mình trong viewWillAppear: và viewWillDisappear: hành động nếu bạn muốn chỉ đặt hành vi cho một bộ điều khiển xem duy nhất.

Đây là tài liệu :


5

Một cách có thể là bằng cách bỏ chọn Hiển thị thanh "Hiển thị thanh điều hướng" trong Trình kiểm tra thuộc tính. Hy vọng điều này sẽ giúp ai đó.

nhập mô tả hình ảnh ở đây


2

Trong Swift 4.2 và Xcode 10

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

Nếu bạn không muốn chỉ hiển thị thanh Điều hướng trong VC thứ 1, nhưng bạn muốn hiển thị trong onword của VC thứ 2

Trong VC đầu tiên của bạn viết mã này.

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

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

2

Nếu bạn muốn phát hiện trạng thái của thanh điều hướng, nó sẽ bị ẩn / hiển thị. Bạn chỉ cần sử dụng mã sau đây để phát hiện -

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


-4

MÃ SWift: Điều này hoạt động hoàn toàn cho iOS 3.2 trở lên.

  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)

sau đó viết

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
Tôi tin rằng đây là một giải pháp kém, việc thêm cử chỉ nhấn có thể nếu không được định cấu hình chính xác sẽ xóa các cử chỉ trên các chế độ xem khác như UITableView hoặc UICollectionView. Ngoài ra, việc kiểm tra thời tiết boolean == true là không cần thiết và có thể khiến các lập trình viên khác nghĩ rằng đây là cách thực hành tốt. Bạn cũng đang sử dụng sai trường hợp lạc đà và thiếu một dấu ngoặc cuối trong ví dụ của bạn. Hãy ghi nhớ vì bộ chọn 2.2 nhanh chóng cũng đã được cập nhật. Last swift chỉ được hỗ trợ trên iOS 7 trở lên và chắc chắn sẽ không chạy trên iOS 3.2
David Rees
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.