iOS 7에서 완전히 투명한 탐색 표시 줄을 만드는 방법


127

내 앱의 UINavigationBar가 완전히 투명하고 그 아래의 뷰 컨트롤러로 플러시되기를 원합니다. 그러나 내가 찾을 수있는 유일한 코드는 반투명하지만 투명하지는 않습니다. 노트 앱에서 사용되기 때문에 iOS 7 에서이 작업을 수행 할 수 있다는 것을 알고 있습니다. 내 질문은 그들이 사용했던 코드는 무엇입니까?

답변:


295

에서 이 답변

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                     forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

또한 Josh가 의견에서 제안한대로 막대를 기본값으로 다시 설정하십시오.

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];

6
또한 당신이 가지고 있지 않은지 확인하십시오self.edgesForExtendedLayout = UIRectEdgeNone;
daidai

25
이것을 되돌릴 방법이 있습니까?
Zorayr

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage : nil forBarMetrics : UIBarMetricsDefault]; 막대를 기본값으로 되돌립니다.
Josh

7
이 방법을 사용하여 탐색 모음의 투명도를 전환하는 방법이 있습니까?
JYC

3
이것을 scrollViewDidScroll에 구현하면 점프가 발생합니다. 어떻게 고치는 지?
onmyway133

77

Swift3 및 Swift4의 경우

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true

스위프트 2.2

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
 self.navigationController?.navigationBar.shadowImage = UIImage()
 self.navigationController?.navigationBar.translucent = true

오브젝티브 -C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;

1
감사합니다. 탐색 바를 완전히 투명하게 설정하는 쉬운 방법입니다.
Hong Zhou

39

Objective-C 카테고리로서의 자체 솔루션 :

UINavigationController + TransparentNavigationController.h

@interface UINavigationController (TransparentNavigationController)
- (void)presentTransparentNavigationBar;
- (void)hideTransparentNavigationBar;
@end

UINavigationController + TransparentNavigationController.m

#import "UINavigationController+TransparentNavigationController.h"

@implementation UINavigationController (TransparentNavigationController)

- (void)presentTransparentNavigationBar
{
  [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:YES];
  [self.navigationBar setShadowImage:[UIImage new]];
  [self setNavigationBarHidden:NO animated:YES];
}

- (void)hideTransparentNavigationBar
{
  [self setNavigationBarHidden:YES animated:NO];
  [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]];
  [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]];
}

@end

이제 카테고리를 UIViewController가져와 내비게이션 컨트롤러에서 메소드를 호출 할 수 있습니다 ( 예 :

#import "UINavigationController+TransparentNavigationController.h"

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

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

그리고 Swift 의 비슷한 솔루션 :

import Foundation
import UIKit

extension UINavigationController {

  public func presentTransparentNavigationBar() {
    navigationBar.setBackgroundImage(UIImage(), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = true
    navigationBar.shadowImage = UIImage()
    setNavigationBarHidden(false, animated:true)
  }

  public func hideTransparentNavigationBar() {
    setNavigationBarHidden(true, animated:false)
    navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImageForBarMetrics(UIBarMetrics.Default), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = UINavigationBar.appearance().translucent
    navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
  }
}

다시 표시하려면 어떻게해야합니까 (예 : NavigationController의 1보기에서만 투명하게 표시하려는 경우)-기본값으로 재설정 할 수 있습니까?
derdida

hideTransparentNavigationBar()다시 재설정해야합니다.
Zorayr

viewWillAppear / disappear에서 현재 / 숨기기 메소드를 호출하면 서로 다른 두 탐색 바 사이에서 잘못된 전환 애니메이션이 발생합니다! pushedViewController에서 스 와이프 제스처 (왼쪽에서 오른쪽으로)를 수행하면 아주 잘 볼 수 있습니다.
andreacipriani

viewDidHide부모 뷰 컨트롤러 에서 호출 해보십시오 .
Zorayr

1
투명 메뉴 바 숨기기 때 LargeTitle를 사용하는 경우 검은 색 배경은 아이폰 OS (11)에 표시됩니다
Vrutin Rathod에게

15

앨런 한 줄을 잊었다

self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

그래서 나는 가지고있다:

[self.navigationController.navigationBar setTranslucent:YES];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

5

@ Zorayr의 위대한 답변은 Swift 3로 개정되었습니다.

import Foundation
import UIKit

extension UINavigationController {

    public func presentTransparentNavigationBar() {
        navigationBar.setBackgroundImage(UIImage(), for:.default)
        navigationBar.isTranslucent = true
        navigationBar.shadowImage = UIImage()
        setNavigationBarHidden(false, animated:true)
    }

    public func hideTransparentNavigationBar() {
        setNavigationBarHidden(true, animated:false)
        navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:.default)
        navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent
        navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
    }
}

2

스위프트 4.2 및 iOS 12

실제로 필요한 것은 아래 코드입니다. 당신이 그것을 넣을 때 완벽하게 작동합니다 viewDidLoad().

// removes line at bottom of navigation bar
navigationController?.navigationBar.shadowImage = UIImage()

// makes navigation bar completely transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.isTranslucent = true


-4

[(UIView *) [self.navigationController.navigationBar.subviews objectAtIndex : 0] setAlpha : 0.0f];

그 한 줄은 나에게 완벽하게 작동하는 것처럼 보였습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.