UINavigationBar를 투명하게 만들기


답변:


635

누구나 iOS 7 이상에서이를 달성하는 방법을 궁금해하는 경우 해결책이 있습니다 (iOS 6 호환 가능)

Objective-C에서

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

신속한 3 (iOS 10)

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

신속한 2

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

토론

설정 translucentYES탐색 모음에서 것은 인해 논의 행동에 트릭을 수행 UINavigationBar설명서를 참조하십시오. 여기에 관련 조각을보고하겠습니다.

YES불투명 한 사용자 정의 배경 이미지가있는 탐색 모음 에서이 속성을 설정 하면 탐색 모음이 시스템 불투명도가 1.0 미만인 이미지에 적용됩니다.


29
여기에 내 자신의 의견에 대답; 영향 시도를 취소하려면 :[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;
Johann Burgess

투명한 탐색 표시 줄을 만들려면 하나의 VC 만 있으면됩니다. 해당 VC를 종료 한 후 원래 스타일로 되돌리려면 어떻게해야합니까?
길 레르 메

2
ViewController 내에서 Swift에서 이것을 달성하려면 다음과 같이하십시오 : self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
datayeah

뿐만 아니라 (iOS7에 / 8) appeareance를 사용하여 작품을 참조하십시오 gist.github.com/mpycio/ddbdea1adb6b86cf02f6
Mahakala

1
나를 위해 효과를 취소하면 부분적으로 만 작동합니다. 이 작업을 수행 한 후 내 테이블 뷰에는 모두 너무 큰 헤더가 있습니다. 앱 전체에서 이상합니다. (나는 스택에 밀어 넣는 컨트롤러 하나에 만이 효과를 원합니다.)
Henning

29

iOS5에서는 탐색 모음을 투명하게 만들 수 있습니다.

nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];

[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault]; 
[img release];

6
iOS 6에서는 탐색 모음 그림자를 제거해야합니다. 그렇지 않으면 이상하게 보입니다. [[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Robert

23

IOS7에서 :

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

14

Swift 2.x에서이 작업을 수행하려는 사람은 :

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

또는 스위프트 3.x :

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

2
navigationController는 선택적 특성이므로 랩핑 해제해야합니다. self.navigationController? .navigationBar를 추가하기 만하면됩니다.
Daniel Galasko

10

이것은 작동하는 것 같습니다 :

@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

6
iOS 5 -drawRect:에서는 범주가 아닌 하위 클래스에서 재정 의 한 다음이 하위 클래스를 탐색 표시 줄로 사용해야합니다.
양 메이어

9

다른 사람들이 위에서 말한 것을 한 후 :

navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true

... 내 네비게이션 바는 여전히 흰색이었다 . 그래서 나는이 줄을 추가했다 :

navigationController?.navigationBar.backgroundColor = .clear

... et voila! 그 트릭을하는 것처럼 보였다.


7

최신 베타 iOS 13.4 및 XCode 11.4로 빌드하면 허용되는 답변이 더 이상 작동하지 않습니다. 다른 방법을 찾았습니다. 베타 소프트웨어의 버그 일 수도 있지만 경우에 따라 아래에 작성하고 있습니다.

(빠른 5)

import UIKit

class TransparentNavBar :UINavigationBar {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.setBackgroundImage(UIImage(), for: .default)
        self.shadowImage = UIImage()
        self.isTranslucent = true
        self.backgroundColor = .clear
        if #available(iOS 13.0, *) {
            self.standardAppearance.backgroundColor = .clear
            self.standardAppearance.backgroundEffect = .none
            self.standardAppearance.shadowColor = .clear
        }
    }
}

대박! 방금 수정을 찾고있었습니다! 잘 작동합니다! 감사!
Georg

5

나는이 주제가 오래되었다는 것을 알고 있지만 사람들이 drawRect 메소드를 오버로드하지 않고 어떻게 수행되는지 알고 싶다면.

이것이 당신이 필요로하는 것입니다 :

self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

1
죄송합니다. 올바르지 않습니다. 여전히 drawRect 메소드를 대체해야합니다
Sander

왜 이것이 잘못 되었습니까? IOS 6 sim에서 작동하는 것 같습니다. iOS 5에서 작동하지 않습니까? navigationBar.backgroundColor는 문서화되지 않은 것 같습니다.
Cristi

5

아래 코드는이 스레드에 선택된 최상위 답변을 확장하여 아래쪽 테두리를 제거하고 텍스트 색상을 설정합니다.

  1. 이 코드의 마지막 두 줄은 투명성을 설정합니다. 이 스레드에서 해당 코드를 빌려서 완벽하게 작동했습니다!

  2. "clipsToBounds"속성은 내가 찾은 코드로 투명도를 설정하지 않고 OR로 아래쪽 경계선을 제거했습니다 (따라서 단색 흰색 / 검정 등 배경으로 이동하기로 결정한 경우 여전히 경계선이 없습니다).

  3. "tintColor"라인 (2 번째 코드 라인)은 뒤로 버튼을 연한 회색으로 설정합니다.

  4. barTintColor를 백업으로 유지했습니다. 투명성이 왜 효과가 없는지 모르겠지만, 그렇지 않으면 bg 화이트를 원합니다.

    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.lightGray
    navigationBarAppearace.barTintColor = UIColor.white
    navigationBarAppearace.clipsToBounds = true
    navigationBarAppearace.isTranslucent = true
    navigationBarAppearace.setBackgroundImage(UIImage(), for: .default)
    navigationBarAppearace.shadowImage = UIImage()

3

스위프트 3.0 :

override func viewDidLoad() {
    super.viewDidLoad()

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

3

C # / Xamarin 솔루션

NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;

2

다음 코드를 사용해보십시오.

self.navigationController.navigationBar.translucent = YES;

1

나를 위해 일한 또 다른 방법은 UINavigationBar를 서브 클래스 화하고 drawRect 메소드를 비워 두는 것입니다!

@IBDesignable class MONavigationBar: UINavigationBar {


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
    // Drawing code
}}

1

스위프트 4.2

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

(viewWillAppear에서) 그런 다음 viewWillDisappear에서 실행 취소하려면

self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false

0

완전히 투명하거나 사진 앱에서 볼 수있는 반투명 검정색 스타일을 사용하십니까? 후자는 barStyle속성을 로 설정하여 수행 할 수 있습니다 UIBarStyleBlackTranslucent. 전자 ... 확실하지 않습니다. 항목을 계속 표시하려면 막대의보기 계층 구조를 파고 배경이 포함 된보기를 제거해야 할 수도 있습니다.


2
나는 전자를 의미한다. 범주를 만들고 UINavigationBar의 drawRect 메서드를 재정의하려고 시도했지만 (CGContextClearRect 호출) 완전히 검은 색으로 만들었습니다. 그래도 항목은 볼 수있었습니다.
quano

0

이것은 Swift 2.0에서 작동합니다.

navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController!.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.translucent = true

0

UINavigation 막대 모양 관리 전용 인 RRViewControllerExtension을 확인하십시오 .

프로젝트에서 RRViewControllerExtension을 사용하면 재정의해야합니다.

-(BOOL)prefersNavigationBarTransparent;

당신이 viewcontroller에서.

네비게이션 바 투명


-2
extension UINavigationBar {
var isTransperent: Bool {
        get {
            return false // Just to satisfy property
        }
        set {
            if newValue == true {
                self.shadowImage   = UIImage()
                self.isTranslucent = true
                self.setBackgroundImage(UIImage(), for: .default)
            }else{
                self.shadowImage   = UIImage()
                self.isTranslucent = false
                self.setBackgroundImage(nil, for: .default)
            }
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.