탐색 표시 줄 표시 / 숨기기


159

2 개의 바 버튼으로 구성된 내비게이션 바가있는 앱이 있습니다. 사용자가 화면을 두 번 탭할 때이 탐색 모음을 숨기고 표시하고 싶습니다.

처음에는 탐색 모음이 숨겨져 있어야합니다. 사용자가 화면을 두 번 탭하면 내비게이션 막대에 iPhone의 사진 갤러리에서 볼 수있는 것과 같은 애니메이션이 표시됩니다.

어떻게해야하나요? 제안은 항상 감사합니다.

답변:


382

이것은 몇 줄의 코드에 맞출 수있는 것이 아니지만 이것은 당신에게 적합한 접근 방식입니다.

탐색 모음을 숨기려면 :

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

표시하려면 :

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

이 방법에 대한 문서는 여기에서 볼 수 있습니다 .

"더블 클릭"또는 두 번 탭을 수신하려면 하위 클래스 UIView를 만들고 해당 하위 클래스의 인스턴스를 뷰 컨트롤러의 view속성으로 만듭니다.

뷰 하위 클래스에서 -touchesEnded:withEvent:메서드를 재정의하고 .NET을 사용하여 두 개의 연속 탭 사이의 시간을 측정하여 일정 기간 동안 터치 한 횟수를 계산합니다 CACurrentMediaTime(). 또는에서 결과를 테스트합니다 [touch tapCount].

두 번 탭하면 서브 클래 싱 된 뷰 NSNotification가 뷰 컨트롤러가 수신하도록 등록한를 발행합니다 .

뷰 컨트롤러가 알림을 수신하면 탐색 모음의 isHidden속성 을 읽어 액세스하는 탐색 모음의 현재 표시 상태에 따라 앞서 언급 한 코드를 사용하여 탐색 모음을 숨기거나 표시하는 선택기를 실행 합니다.

편집하다

탭 이벤트 처리에 대한 답변의 일부는 아마도 iOS 3.1 이전에 유용했을 것입니다. 이 UIGestureRecognizer클래스는 요즘 더블 탭을 처리하는 데 더 나은 접근 방식 일 것입니다.

2 편집

탐색 모음을 숨기는 Swift 방법은 다음과 같습니다.

navigationController?.setNavigationBarHidden(true, animated: true)

표시하려면 :

navigationController?.setNavigationBarHidden(false, animated: true)

이것이 사진 뷰어 응용 프로그램의 경우 탐색 모음을 숨기면 이미지보기에 대한 불쾌한 점프가 발생하여 방지하는 방법을 찾지 못했습니다. 3.2를 사용하면 UIGestureRecognizer를 더블 탭에 사용할 수 있습니다. 이는 훨씬 깔끔한 접근 방식입니다 (iPad 전용 atm).
Paul Lynch

고마워요 Alex, u는 나에게 많은 정보를 제공했습니다. 저는 지침을 따를 것입니다. .. 감사합니다
Shishir.bobby

이것은 탭 바에도 동일하게 적용됩니까 ??? 탭 바를 숨기거나 표시하려면 어떻게해야하나요? 안부 shishir
Shishir.bobby

1
Paul이 언급 한 '점프'를 방지 할 수있는 방법이 있습니까? 나는 똑같은 문제를 가지고 있으며, 그 원인이 무엇인지 모르겠습니다. ... 나도 생각하지 않습니다.
Icky

'점프'가 발생하지 않도록하려면 탐색 모음을 숨기거나 표시 한 후 jclee가 언급 한대로 scrollview의 contentInset 속성을 재설정해야합니다. 즉. 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 속성을 즉시 0 (UIEdgeInsetsZero)으로 재설정해야합니다. navigationBar의 초기 상태를 설정하고보기가 나타나기 전에.

그런 다음 navigationBar 및 / 또는 상태 표시 줄을 표시하거나 숨기도록 전환하는 한 번의 탭이있는 경우 전환 방법에서 두 가지 작업을 수행해야합니다. 첫 번째는 NavigationBar 숨겨진 속성을 변경하기 전에 스크롤 뷰의 contentOffset 속성을 저장하고 저장 한 값을 나중에 contentOffset으로 복원하는 것 같습니다. 두 번째로 navigationBarHidden 속성을 변경 한 후 contentInset 속성을 UIEdgeInsetsZero로 0으로 만듭니다. 또한 상태 표시 줄을 토글하는 경우 navigationBar의 상태를 변경하기 전에 상태를 변경해야합니다.


1
contentOffset 및 contentInset 메모에 감사드립니다. 당신은 진정한 영웅입니다.
Altealice

동의합니다. 당신은 진정한 영웅입니다. 감사합니다.
개탄

9

에서 스위프트 ,이 시도

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;

이것은 두 번 탭하는 대신 한 번 탭할 때 작동합니다. 또한 현재 뷰 컨트롤러를 밀거나 터뜨린 후에도 내비게이션 컨트롤러의 동작을 변경합니다.

단일 뷰 컨트롤러에 대해서만 동작을 설정하려는 경우 항상 viewWillAppear : 및 viewWillDisappear : 작업 내에서 컨트롤러에서이 동작을 수정할 수 있습니다.

다음은 문서입니다 .


5

한 가지 방법은 Attribute Inspector에서 Bar Visibility "Shows Navigation Bar"를 선택 취소하는 것입니다. 누군가에게 도움이되기를 바랍니다.

여기에 이미지 설명 입력


2

Swift 4.2 및 Xcode 10에서

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

첫 번째 VC에만 내비게이션 바를 표시하지 않고 두 번째 VC onword에 표시하려는 경우

첫 번째 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와 같은 다른보기에서 제스처를 올바르게 구성하지 않으면 제거 할 수 있습니다. 또한 boolean == true인지 확인하는 것은 중복되며 다른 프로그래머가 이것이 좋은 방법이라고 생각하게 만들 수 있습니다. 또한 낙타 케이스를 오용하고 예제에서 끝 중괄호가 누락되었습니다. 신속한 2.2 선택 자도 업데이트되었으므로 명심하십시오. 마지막으로 SWIFT는 아이폰 OS 7 이상 지원 확실히 아이폰 OS 3.2에서 실행되지 않습니다
데이빗리스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.