2 개의 바 버튼으로 구성된 내비게이션 바가있는 앱이 있습니다. 사용자가 화면을 두 번 탭할 때이 탐색 모음을 숨기고 표시하고 싶습니다.
처음에는 탐색 모음이 숨겨져 있어야합니다. 사용자가 화면을 두 번 탭하면 내비게이션 막대에 iPhone의 사진 갤러리에서 볼 수있는 것과 같은 애니메이션이 표시됩니다.
어떻게해야하나요? 제안은 항상 감사합니다.
2 개의 바 버튼으로 구성된 내비게이션 바가있는 앱이 있습니다. 사용자가 화면을 두 번 탭할 때이 탐색 모음을 숨기고 표시하고 싶습니다.
처음에는 탐색 모음이 숨겨져 있어야합니다. 사용자가 화면을 두 번 탭하면 내비게이션 막대에 iPhone의 사진 갤러리에서 볼 수있는 것과 같은 애니메이션이 표시됩니다.
어떻게해야하나요? 제안은 항상 감사합니다.
답변:
이것은 몇 줄의 코드에 맞출 수있는 것이 아니지만 이것은 당신에게 적합한 접근 방식입니다.
탐색 모음을 숨기려면 :
[[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)
이 코드가 도움이 될 것입니다.
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];
}
}
먼저 iOS 용보기 컨트롤러 프로그래밍 가이드에서 '탐색보기에 전체 화면 레이아웃 채택'에 대한 섹션과 사용자 지정보기에 대한 동일한 섹션을 읽어보십시오. Photos.app과 같은 작업을하려는 경우 스크롤보기를 사용하고있을 것입니다. 내비게이션 바가 내비게이션 바 (및 상태 표시 줄)의 높이를 고려하기 위해 스크롤 뷰에 스크롤 내용 삽입을 자동으로 추가하므로 스크롤 뷰의 contentInset 속성을 즉시 0 (UIEdgeInsetsZero)으로 재설정해야합니다. navigationBar의 초기 상태를 설정하고보기가 나타나기 전에.
그런 다음 navigationBar 및 / 또는 상태 표시 줄을 표시하거나 숨기도록 전환하는 한 번의 탭이있는 경우 전환 방법에서 두 가지 작업을 수행해야합니다. 첫 번째는 NavigationBar 숨겨진 속성을 변경하기 전에 스크롤 뷰의 contentOffset 속성을 저장하고 저장 한 값을 나중에 contentOffset으로 복원하는 것 같습니다. 두 번째로 navigationBarHidden 속성을 변경 한 후 contentInset 속성을 UIEdgeInsetsZero로 0으로 만듭니다. 또한 상태 표시 줄을 토글하는 경우 navigationBar의 상태를 변경하기 전에 상태를 변경해야합니다.
에서 스위프트 ,이 시도
navigationController?.isNavigationBarHidden = true //Hide
navigationController?.isNavigationBarHidden = false //Show
또는
navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show
탐색 표시 줄 숨기기 :
[self.navigationController setNavigationBarHidden:YES animated:YES];
탐색 모음을 표시하려면 :
[self.navigationController setNavigationBarHidden:NO animated:YES];
다음은 매우 빠르고 간단한 솔루션입니다.
self.navigationController.hidesBarsOnTap = YES;
이것은 두 번 탭하는 대신 한 번 탭할 때 작동합니다. 또한 현재 뷰 컨트롤러를 밀거나 터뜨린 후에도 내비게이션 컨트롤러의 동작을 변경합니다.
단일 뷰 컨트롤러에 대해서만 동작을 설정하려는 경우 항상 viewWillAppear : 및 viewWillDisappear : 작업 내에서 컨트롤러에서이 동작을 수정할 수 있습니다.
다음은 문서입니다 .
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
}
내비게이션 바가 숨겨 지거나 표시되는지 여부를 감지하려는 경우. 다음 코드를 사용하여 감지 할 수 있습니다.
if self.navigationController?.isNavigationBarHidden{
print("Show navigation bar")
} else {
print("hide navigation bar")
}
hidesBarsOnTap
UINavigationController 속성에서 iOS8 SDK로이를 처리하기 위해 나옵니다.
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
}
}