iPhone은 첫 페이지에서만 탐색 표시 줄을 숨 깁니다
-
21-08-2019 - |
문제
아래에 코드가 숨겨져 있고 내비게이션 막대를 보여줍니다. 첫 번째 뷰가로드 될 때 숨겨져 있고 "어린이"가 불러지면 숨겨져 있습니다. 문제는 루트보기로 돌아올 때 다시 숨기도록 이벤트/액션을 찾을 수 없다는 것입니다 ....
루트 페이지에 "테스트"버튼이있어 동작을 수동으로 수행하지만 예쁘지 않으며 자동이되기를 원합니다.
-(void)hideBar
{
self.navController.navigationBarHidden = YES;
}
-(void)showBar
{
self.navController.navigationBarHidden = NO;
}
해결책
내가 찾은 가장 좋은 해결책은 다음과 같은 일을하는 것입니다. 첫 번째보기 컨트롤러.
대상 c
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
빠른
override func viewWillAppear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
이렇게하면 다음을 밀 때 내비게이션 바가 다음 뷰와 함께 왼쪽에서 애니메이션됩니다. UIViewController
스택에서, 왼쪽으로 애니메이션 (이전보기와 함께)에서 뒤로 버튼을 누르면 UINavigationBar
.
또한 이것들은 대의원이 아니며, 당신은 우선하고 있습니다. UIViewController
이러한 방법의 구현 및 문서에 따라 구현 어딘가에서 Super의 구현을 호출해야합니다..
다른 팁
내가 찾은 또 다른 방법은 NavigationController
:
navigationController.delegate = self;
그리고 사용 setNavigationBarHidden
안에 navigationController:willShowViewController:animated:
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
// Hide the nav bar if going home.
BOOL hide = viewController != homeViewController;
[navigationController setNavigationBarHidden:hide animated:animated];
}
각각의 동작을 사용자 정의하는 쉬운 방법 ViewController
모두 한 곳에서.
내가 다른 답변에서해야 할 약간의 조정은 사라지는 이유가 내비게이션 항목이 밀려나는 경우 ViewWillDisAppear의 막대 만 막을 수없는 것입니다. 이것은 다른 이유로 견해가 사라질 수 있기 때문입니다.
그래서이보기가 더 이상 가장 큰 견해가 아니라면 바를 막을 수 있습니다.
- (void) viewWillDisappear:(BOOL)animated
{
if (self.navigationController.topViewController != self)
{
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
[super viewWillDisappear:animated];
}
나는 코드를 넣을 것이다 ViewWillAppear 표시되는 각보기에 대의원 :
숨겨야 할 곳과 같이 :
- (void)viewWillAppear:(BOOL)animated
{
[yourObject hideBar];
}
이렇게 보여줄 필요가 있습니다.
- (void)viewWillAppear:(BOOL)animated
{
[yourObject showBar];
}
Swift 3에서 :
override func viewWillAppear(_ animated: Bool) {
navigationController?.navigationBar.isHidden = true
super.viewWillAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
if (navigationController?.topViewController != self) {
navigationController?.navigationBar.isHidden = false
}
super.viewWillDisappear(animated)
}
현재 인정 된 답변은 질문에 설명 된 의도 된 행동과 일치하지 않습니다. 이 질문은 루트보기 컨트롤러에 내비게이션 바가 숨겨져 있지만 다른 곳에서는 볼 수 있지만 허용 된 답변은 특정 뷰 컨트롤러의 탐색 표시 줄을 숨 깁니다. 첫 번째 뷰 컨트롤러의 다른 인스턴스가 스택에 밀려 나면 어떻게됩니까? 루트 뷰 컨트롤러를보고 있지 않더라도 내비게이션 막대를 숨 깁니다.
대신 @chad M. 전략 사용 UINavigationControllerDelegate
좋은 것이며 여기에 더 완전한 솔루션이 있습니다. 단계 :
- 아강
UINavigationController
- 구현
-navigationController:willShowViewController:animated
루트보기 컨트롤러를 표시하는지 여부에 따라 탐색 표시 줄을 표시하거나 숨기는 메소드 - UinaVigationController 서브 클래스를 자체 대의원으로 설정하기위한 초기화 방법을 무시합니다.
이 솔루션에 대한 완전한 코드는 찾을 수 있습니다 이 요점. 여기에 있습니다 navigationController:willShowViewController:animated
구현:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
/* Hide navigation bar if root controller */
if ([viewController isEqual:[self.viewControllers firstObject]]) {
[self setNavigationBarHidden:YES animated:animated];
} else {
[self setNavigationBarHidden:NO animated:animated];
}
}
여러 번의 시험 후에 내가 원하는 것을 위해 어떻게 작동하게했는지입니다. 이것이 제가 시도한 것입니다. - 이미지가있는 뷰가 있습니다. 그리고 이미지를 전체 화면으로 만들고 싶었습니다. - 탭 바가있는 탐색 컨트롤러도 있습니다. 그래서 나도 숨겨야합니다. - 또한 내 주요 요구 사항은 숨어있는 것이 아니라 보여주고 숨기는 동안 페이딩 효과도 갖는 것이 었습니다.
이것이 내가 작동하는 방법입니다.
1 단계 - 해당 이미지에 이미지와 사용자 탭이 있습니다. 나는 그 제스처를 포착하고 그것을 새로운 imageViewController
, 그 안에 imageViewController
, 전체 화면 이미지를 원합니다.
- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"Single tap");
ImageViewController *imageViewController =
[[ImageViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];
godImageViewController.imgName = // pass the image.
godImageViewController.hidesBottomBarWhenPushed=YES;// This is important to note.
[self.navigationController pushViewController:godImageViewController animated:YES];
// If I remove the line below, then I get this error. [CALayer retain]: message sent to deallocated instance .
// [godImageViewController release];
}
2 단계 - 아래의 모든 단계는 ImageViewController에 있습니다.
2.1 단계 - ViewDidload에서 Navbar를 표시하십시오
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"viewDidLoad");
[[self navigationController] setNavigationBarHidden:NO animated:YES];
}
2.2 단계 - IN viewDidAppear
, 지연으로 타이머 작업을 설정합니다 (1 초 지연으로 설정되어 있음). 지연 후 페이딩 효과를 추가하십시오. 알파를 사용하여 페이딩을 사용하고 있습니다.
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear");
myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}
- (void)fadeScreen
{
[UIView beginAnimations:nil context:nil]; // begins animation block
[UIView setAnimationDuration:1.95]; // sets animation duration
self.navigationController.navigationBar.alpha = 0.0; // Fades the alpha channel of this view to "0.0" over the animationDuration of "0.75" seconds
[UIView commitAnimations]; // commits the animation block. This Block is done.
}
2.3 단계 - 아래 viewWillAppear
, 싱글 랩 제스처를 이미지에 추가하고 Navbar 반투명을 만듭니다.
- (void) viewWillAppear:(BOOL)animated
{
NSLog(@"viewWillAppear");
NSString *path = [[NSBundle mainBundle] pathForResource:self.imgName ofType:@"png"];
UIImage *theImage = [UIImage imageWithContentsOfFile:path];
self.imgView.image = theImage;
// add tap gestures
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.imgView addGestureRecognizer:singleTap];
[singleTap release];
// to make the image go full screen
self.navigationController.navigationBar.translucent=YES;
}
- (void)handleTap:(UIGestureRecognizer *)gestureRecognizer
{
NSLog(@"Handle Single tap");
[self finishedFading];
// fade again. You can choose to skip this can add a bool, if you want to fade again when user taps again.
myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}
3 단계 - 마지막으로 viewWillDisappear
, 모든 물건을 뒤로 두십시오
- (void)viewWillDisappear: (BOOL)animated
{
self.hidesBottomBarWhenPushed = NO;
self.navigationController.navigationBar.translucent=NO;
if (self.navigationController.topViewController != self)
{
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
[super viewWillDisappear:animated];
}
@chad-m의 답변에 대한 신용을 제공하십시오.
Swift 버전은 다음과 같습니다.
- 새 파일을 만듭니다
MyNavigationController.swift
import UIKit
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController == self.viewControllers.first {
self.setNavigationBarHidden(true, animated: animated)
} else {
self.setNavigationBarHidden(false, animated: animated)
}
}
}
Chad-M의 답변과 광산의 차이점 :
uinavigationcontroller에서 상속되므로 rootViewController를 오염시키지 않습니다.
사용
self.viewControllers.first
보다는homeViewController
, 당신은 1 스토리 보드에서 100 개의 uinavigationcontrollers에 대해 100 번하지 않을 것입니다.
누구나 여전히 문제가있는 경우 빠른 백 스웨이프 취소 버그 @fabb가 수락 된 답변에 댓글을 달았습니다.
나는 이것을 재정의함으로써 이것을 고칠 수 있습니다 viewDidLayoutSubviews
, 그 외에 viewWillAppear/viewWillDisappear
아래 그림과 같이:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.navigationController?.setNavigationBarHidden(false, animated: false)
}
제 경우에는 루트보기 컨트롤러 (NAV가 숨겨져 있음)와 푸시 뷰 컨트롤러 (NAV가 표시됨) 때문입니다. 상태 표시 줄 스타일이 다릅니다 (예 : 어둡고 가벼운). Backswipe를 시작하여 View Controller를 팝업하면 추가 상태 표시 줄 색상 애니메이션이 있습니다. 대화 형 팝을 취소하기 위해 손가락을 풀면 상태 표시 줄 애니메이션이 완료되지 않았습니다, 내비게이션 바는 영원히 사라졌습니다!
그러나 두 뷰 컨트롤러의 상태 표시 줄 스타일이 동일하면이 버그가 발생하지 않습니다.
원하는 것은 컨트롤러에 내비게이션 바를 완전히 숨기는 것이라면 루트 컨트롤러에서 다음과 같은 것이 더 깨끗합니다.
@implementation MainViewController
- (void)viewDidLoad {
self.navigationController.navigationBarHidden=YES;
//...extra code on view load
}
컨트롤러에서 자식보기를 밀면 내비게이션 막대가 숨겨져 있습니다. 아이에게만 표시하려면 표시를위한 코드를 추가 할 것입니다. it(self.navigationController.navigationBarHidden=NO;)
에서 viewWillAppear
콜백 및 마찬가지로 숨어있는 코드 viewWillDisappear
가장 간단한 구현은 각보기 컨트롤러만으로도 내비게이션 막대가 숨겨져 있는지 여부를 지정하는 것입니다. viewWillAppear:animated:
방법. 동일한 접근 방식은 도구 모음을 숨기거나 표시하는 데 효과적입니다.
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setToolbarHidden:YES/NO animated:animated];
[super viewWillAppear:animated];
}
첫 페이지에서만 내비게이션 표시 줄을 숨기는 것도 스토리 보드를 통해서도 달성 할 수 있습니다. 스토리 보드에, Goto 탐색 컨트롤러 장면-> 탐색 표시 줄. 그리고 선택 '숨겨진'재산 속성 검사관. 이렇게하면 첫 번째 ViewController에서 필요한 ViewController가 표시 될 때까지 내비게이션 막대가 숨겨집니다.
Navigation Bar는 ViewController의 ViewWillAppear 콜백에서 Visible으로 다시 설정할 수 있습니다.
-(void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
스위프트 4 :
View Controller에서 내비게이션 표시 줄을 숨길 수 있습니다.
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
ViewController 에서이 코드를 구현하면 실제로이 효과를 얻을 수 있습니다. 실제로 트릭은 해당 컨트롤러가 시작될 때 NavigationBar를 숨 깁니다.
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:YES];
[super viewWillAppear:animated];
}
그리고 사용자가 그 페이지를 떠날 때 내비게이션 바를 해제 해제합니다.
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:YES];
[super viewWillDisappear:animated];
}