programing

UINavigation Bar를 투명하게 하다

yellowcard 2023. 4. 10. 21:33
반응형

UINavigation Bar를 투명하게 하다

UINavigation Bar를 투명하게 만들려면 어떻게 해야 합니까?하지만 바 아이템이 보이는 상태로 유지되길 원합니다.

iOS 7+에서 이를 실현하는 방법을 알고 싶다면 다음과 같은 해결책을 제시합니다(iOS 6 호환).

목표-C에서

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

In swift 3 (iOS 10)

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

인스위

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

논의

설정translucent로.YES설명서에서 설명하는 동작 때문에 네비게이션바에서 문제가 해결됩니다.여기에 관련 내용을 보고하겠습니다.

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

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

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

최신 베타 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
        }
    }
}

Swift 2.x에서 이 작업을 수행하고자 하는 사용자:

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

또는 Swift 3.x:

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

이것은 효과가 있는 것 같습니다.

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

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

다른 모든 사람이 위에서 말한 대로 한 후:

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

내 내비게이션 바는 여전히 흰색이었어그래서 이 행을 추가했습니다.

navigationController?.navigationBar.backgroundColor = .clear

... et voila!그게 효과가 있는 것 같았어.

이 토픽이 오래된 것은 알지만, drawRect 메서드를 오버로드하지 않고 어떻게 처리되는지 알고 싶다면.

필요한 것은 다음과 같습니다.

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

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

  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()
    

솔루션 - Swift 5 - iOS 13 이상

매뉴얼에 따르면 UIViewController 서브클래스에서 다음 작업을 수행합니다.

override func viewDidLoad()
{
    super.viewDidLoad()
    
    let appearance = UINavigationBarAppearance()
    appearance.configureWithTransparentBackground()
    //appearance.backgroundColor = UIColor.clear
    
    navigationItem.compactAppearance = appearance
    navigationItem.scrollEdgeAppearance = appearance
    navigationItem.standardAppearance = appearance
    
    //...
}

하자면, 이 에, 「이러다」, 「이러다」가.UINavigationBar 완전히 투명합니다.바 버튼 항목은 아직 표시되며 올바르게 동작합니다.

무엇이 효과가 없었습니까?

override func viewDidLoad()
{
    super.viewDidLoad()
    
    navigationController?.navigationBar.isTranslucent = true
    navigationController?.navigationBar.isOpaque = false

    //...
}

이를 통해 저는 투명 RIP와 반투명 RIP의 차이를 잘 몰랐다는 것을 깨달았습니다.

레퍼런스

https://developer.apple.com/documentation/uikit/uinavigationcontroller/customizing_your_app_s_navigation_bar

https://www.lexico.com/en/definition/transparent

https://www.lexico.com/en/definition/translucent

2021년 8월 10일 갱신

의 변경navigationItem바 버튼을 클릭하면 아피아란스가 리셋되고 다시 해야 합니다.

Swift 3.0의 경우:

override func viewDidLoad() {
    super.viewDidLoad()

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

C# / Xamarin 솔루션

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

다음의 코드를 시험해 보겠습니다.

self.navigationController.navigationBar.translucent = YES;

또 다른 방법은 UINavigation Bar를 Subclass하고 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
}}

Swift 4.2의 경우

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

(viewWillApear에서), 그런 다음 viewWillDisplay에서 실행 취소하려면

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

이것은 Swift 5에서 작동했습니다.

// Clear the background image.
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)

// Clear the shadow image.
navigationController?.navigationBar.shadowImage = UIImage()

// Ensure the navigation bar is translucent.
navigationController?.navigationBar.isTranslucent = true

완전 투명인가요, 아니면 포토 앱에서 볼 수 있는 반투명 블랙 스타일인가요?는 '다'를 '다'로 설정하면 .barStyle을 property property로 설정합니다.UIBarStyleBlackTranslucent잘 모르겠어요.해당 항목을 계속 표시하려면 표시줄의 보기 계층에서 탐색을 수행하고 배경을 포함하는 보기를 제거해야 할 수 있습니다.

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

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

UINavigation 바아피아란스 관리 전용 RRViewController Extension을 체크합니다.

RRViewControllerExtension을 프로젝트에 포함시키면

-(BOOL)prefersNavigationBarTransparent;

뷰 컨트롤러에 표시됩니다.

네비게이션 바 투명

extension UINavigationBar {
var isTransperent: Bool {
        get {
            return false // Just to satisfy property
        }
        set {
            if newValue {
                self.shadowImage = UIImage()
                self.isTranslucent = true
                self.setBackgroundImage(UIImage(), for: .default)
            } else {
                self.shadowImage = UIImage()
                self.isTranslucent = false
                self.setBackgroundImage(nil, for: .default)
            }
        }
    }
}

언급URL : https://stackoverflow.com/questions/2315862/make-uinavigationbar-transparent

반응형