sourcecode

첫 페이지에서만 iPhone 탐색 모음 숨기기

copyscript 2023. 4. 9. 22:17
반응형

첫 페이지에서만 iPhone 탐색 모음 숨기기

아래에 네비게이션 바를 숨기고 표시하는 코드가 있습니다.첫 번째 보기가 로드될 때 숨겨지고 "하위"가 호출될 때 숨겨집니다.문제는 루트 뷰로 돌아왔을 때 다시 숨기도록 트리거하는 이벤트/액션을 찾을 수 없다는 것입니다.

루트 페이지에 수동으로 조작하는 「테스트」버튼이 있습니다만, 예쁘지 않기 때문에 자동적으로 조작하고 싶습니다.

-(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님의 이러한 방법의 실장 및 매뉴얼에 따르면 구현 어딘가에 슈퍼바이저의 실장을 호출해야 합니다.

은 '' 입니다.NavigationController:

navigationController.delegate = self;

를 사용합니다.setNavigationBarHiddennavigationController: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모두 한곳에 모입니다.

다른 답변에서 수정해야 했던 한 가지 사항은 뷰에서 표시줄의 숨김을 해제하는 것 뿐입니다.표시되지 않는 이유가 내비게이션 항목을 누르는 것 때문인지 표시되지 않습니다.다른 이유로 보기가 사라질 수 있기 때문입니다.

따라서 이 보기가 더 이상 맨 위 보기가 아닌 경우에만 표시줄 숨기기를 해제합니다.

- (void) viewWillDisappear:(BOOL)animated
{
    if (self.navigationController.topViewController != self)
    {
        [self.navigationController setNavigationBarHidden:NO animated:animated];
    }

    [super viewWillDisappear:animated];
}

표시되는 각 뷰의 viewWillAple 위임자에 코드를 넣습니다.

다음과 같이 숨길 필요가 있습니다.

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject hideBar];
}

다음과 같이 표시할 필요가 있습니다.

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject showBar];
}

현재 수락된 답변이 질문에 설명된 의도된 동작과 일치하지 않습니다.이 질문에서는 루트 뷰 컨트롤러에서는 네비게이션바를 숨길지 여부를 묻지만, 받아들여진 답변은 특정 뷰 컨트롤러에서는 네비게이션바를 숨깁니다.첫 번째 뷰 컨트롤러의 다른 인스턴스가 스택에 푸시되면 어떻게 됩니까?루트 뷰 컨트롤러를 보고 있지 않아도 탐색 모음을 숨길 수 있습니다.

대신 @Chad M.의 사용 전략은UINavigationControllerDelegate이것이 좋은 방법입니다.그리고 여기 더 완전한 해결책이 있습니다. ★★★★

  1. '''UINavigationController
  2. 「 」의 실장-navigationController:willShowViewController:animated 뷰 여부에 .
  3. 초기화 메서드를 재정의하여 UINavigationController 하위 클래스를 자체 대리자로 설정합니다.

이 솔루션의 완전한 코드는 Gist에서 확인할 수 있습니다.여기 있습니다.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];
    }
}

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의 답변에 경의를 표합니다.

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. StoryBoard에서 UINavigationController 클래스를 MyNavigationController로 설정하세요. 바로 그거야!

차드-엠의 대답과 나의 대답의 차이:

  1. UINavigationController에서 상속하여 rootViewController를 오염시키지 않도록 합니다.

  2. self.viewControllers.firsthomeViewControllerStoryBoard 100 UINavigation Controller 100 입니다.

여러 번의 시련을 거쳐서 내가 원하는 대로 작동하게 된 방법이 여기 있다.- 이게 내가 하려던 거야 - 난 이미지를 가지고 있어이미지를 풀스크린으로 만들고 싶었다.-탭바가 달린 내비게이션 컨트롤러도 있어요.그래서 저도 그걸 숨길 필요가 있어요.-그리고 저의 주된 요구는 단순히 숨는 것이 아니라, 보여주고 숨기는 동안에도 희미해지는 효과를 내는 것이었습니다.

이렇게 해서 작동하게 된 거야

스텝 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 - 2.2 - 입력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 singleTap은 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 - 으로 3 - 텝 step에서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];
}

@fabb가 답변한 것처럼 고속 백스위프에 문제가 있는 사람이 아직 버그를 취소한 경우.

byidingidingidingidingidingiding를 이 문제를 할 수 .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)
}

내 경우 루트 뷰 컨트롤러(내비게이션이 숨겨져 있음)와 푸시 뷰 컨트롤러(내비게이션 표시)의 상태 표시줄 스타일(예: 어둡고 밝음)이 다르기 때문입니다.뷰 컨트롤러를 팝업하기 위해 백스위프를 시작하는 순간 상태 표시줄 컬러 애니메이션이 추가로 표시됩니다.상태 표시줄 애니메이션이 완료되지 않은 상태에서 인터랙티브 팝을 취소하기 위해 손가락을 떼면 탐색 막대가 영원히 사라집니다!

그러나 두 뷰 컨트롤러의 상태 표시줄 스타일이 동일한 경우에는 이 버그가 발생하지 않습니다.

네비게이션 바를 컨트롤러에서 완전히 숨기는 경우 루트 컨트롤러에서 다음과 같은 기능을 사용하는 것이 훨씬 깔끔합니다.

@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];
}

스토리보드를 통해서도 첫 페이지에서만 네비게이션 바를 숨길 수 있습니다.스토리보드에서 내비게이션 컨트롤러 씬(scene)-> 내비게이션 바를 선택합니다.속성 검사기에서 '숨김' 속성을 선택합니다.이렇게 하면 첫 번째 뷰 컨트롤러에서 시작하여 필요한 뷰 컨트롤러에 표시될 때까지 탐색 막대가 숨겨집니다.

탐색 막대는 ViewController의 ViewWillAppear 콜백에 표시되도록 다시 설정할 수 있습니다.

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}

Swift 4:

뷰 컨트롤러에서 탐색 모음을 숨길 수 있습니다.

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에 구현하면 이 효과를 얻을 수 있습니다.실제로 이 트릭은 컨트롤러가 실행될 때 네비게이션 바를 숨깁니다.

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [super viewWillAppear:animated];
}

사용자가 페이지를 떠날 때 네비게이션 바를 숨김 해제하는 것은 viewWillDisaple입니다.

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];
}

언급URL : https://stackoverflow.com/questions/845583/iphone-hide-navigation-bar-only-on-first-page

반응형