문제

아래에 코드가 숨겨져 있고 내비게이션 막대를 보여줍니다. 첫 번째 뷰가로드 될 때 숨겨져 있고 "어린이"가 불러지면 숨겨져 있습니다. 문제는 루트보기로 돌아올 때 다시 숨기도록 이벤트/액션을 찾을 수 없다는 것입니다 ....

루트 페이지에 "테스트"버튼이있어 동작을 수동으로 수행하지만 예쁘지 않으며 자동이되기를 원합니다.

-(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 좋은 것이며 여기에 더 완전한 솔루션이 있습니다. 단계 :

  1. 아강 UINavigationController
  2. 구현 -navigationController:willShowViewController:animated 루트보기 컨트롤러를 표시하는지 여부에 따라 탐색 표시 줄을 표시하거나 숨기는 메소드
  3. 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 버전은 다음과 같습니다.

  1. 새 파일을 만듭니다 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)
        }
    }

}
  1. 스토리 보드에서 UinavigationController의 클래스를 MyNavigationController로 설정하십시오MyNavigationController 그게 다야!

Chad-M의 답변과 광산의 차이점 :

  1. uinavigationcontroller에서 상속되므로 rootViewController를 오염시키지 않습니다.

  2. 사용 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];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top