programing

투명한 iOS 탐색 모음

powerit 2023. 6. 2. 21:21
반응형

투명한 iOS 탐색 모음

저는 앱을 만들고 인터넷을 검색했는데 어떻게 투명한 UINavigation Bar를 다음과 같이 만드는지 궁금합니다.

여기에 이미지 설명 입력

앱 대리인에게 다음과 같은 내용을 추가했습니다.

UINavigationBar.appearance().translucent = true

하지만 이것은 단지 다음과 같이 보이게 합니다.

여기에 이미지 설명 입력

탐색 모음을 첫 번째 이미지처럼 투명하게 만들려면 어떻게 해야 합니까?

반투명의 경우 아래와 같은 탐색 막대 이미지를 적용할 수 있습니다.

목표-C:

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                     forBarMetrics:UIBarMetricsDefault]; //UIImageNamed:@"transparent.png"
self.navigationController.navigationBar.shadowImage = [UIImage new];////UIImageNamed:@"transparent.png"
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];

스위프트 3:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) //UIImage.init(named: "transparent.png")
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = .clear
    

스위프트 솔루션

이것이 제가 찾은 가장 좋은 방법입니다.당신은 그것을 당신의 에 붙여넣을 수 있습니다. 대표자의 didFinishLaunchingWithOptions방법:

스위프트 3 / 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    // Sets background to a blank/empty image
    UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
    // Sets shadow (line below the bar) to a blank image
    UINavigationBar.appearance().shadowImage = UIImage()
    // Sets the translucent background color
    UINavigationBar.appearance().backgroundColor = .clear
    // Set translucent. (Default value is already true, so this can be removed if desired.)
    UINavigationBar.appearance().isTranslucent = true
    return true
}

스위프트 2.0

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    // Sets background to a blank/empty image
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
    // Sets shadow (line below the bar) to a blank image
    UINavigationBar.appearance().shadowImage = UIImage()
    // Sets the translucent background color
    UINavigationBar.appearance().backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
    // Set translucent. (Default value is already true, so this can be removed if desired.)
    UINavigationBar.appearance().translucent = true

    return true
}

출처: iOS 8.1에서 아래 이미지와 관련하여 탐색 모음을 투명하게 만듭니다.

현재 보기 컨트롤러에만 적용되는 Swift 5

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Make the navigation bar background clear
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.isTranslucent = true
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Restore the navigation bar to default
    navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    navigationController?.navigationBar.shadowImage = nil
}

Swift 3 : 투명 내비게이션 바용 확장

extension UINavigationBar {
    func transparentNavigationBar() {
    self.setBackgroundImage(UIImage(), for: .default)
    self.shadowImage = UIImage()
    self.isTranslucent = true
    }
}

Swift 4.2 솔루션:투명 배경의 경우:

  1. 일반적인 접근 방식의 경우:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
    
    }
    
  2. 특정 개체의 경우:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        navBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        navBar.shadowImage = UIImage()
        navBar.navigationBar.isTranslucent = true
    
    }
    

유용하길 바랍니다.

저는 이 문제를 해결하기 위해 노력해 왔고, 다른 사용자들이 여기에 제공한 응답을 사용하면서 문제에 직면했습니다.iOS 13+에서 내 내비게이션 바 투명 이미지 뒤에 있는 흰색 상자가 문제였습니다.

여기에 이미지 설명 입력

내 해결책은 이것입니다.

if #available(iOS 13, *) {
    navBar?.standardAppearance.backgroundColor = UIColor.clear
    navBar?.standardAppearance.backgroundEffect = nil
    navBar?.standardAppearance.shadowImage = UIImage()
    navBar?.standardAppearance.shadowColor = .clear
    navBar?.standardAppearance.backgroundImage = UIImage()
}

갱신하다

@Tmin 덕분에

이와 함께 테이블뷰/수집뷰를 사용하면 스크롤할 때 1점 그림자가 나타납니다.navBar를 추가하시겠습니까?scrollEdgeAppearance = 0을(를) 사용하여 이 그림자를 제거합니다.

이것이 같은 문제를 가진 모든 사람에게 도움이 되기를 바랍니다.

저는 다음과 같은 방법으로 신속하게 이를 달성할 수 있었습니다.

let navBarAppearance = UINavigationBar.appearance()
let colorImage = UIImage.imageFromColor(UIColor.morselPink(), frame: CGRectMake(0, 0, 340, 64))
navBarAppearance.setBackgroundImage(colorImage, forBarMetrics: .Default)

여기서 나는 다음과 같은 유틸리티 방법을 만들었습니다.UIColor범주:

imageFromColor(color: UIColor, frame: CGRect) -> UIImage {
  UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
  color.setFill()
  UIRectFill(frame)
  let image = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext()
  return image
}

내게 효과가 있었던 것:

    let bar:UINavigationBar! =  self.navigationController?.navigationBar
    self.title = "Whatever..."
    bar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    bar.shadowImage = UIImage()
    bar.alpha = 0.0 

탐색 막대의 배경 속성을 설정합니다(예:

navigationController?.navigationBar.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.5)

(내비게이션 컨트롤러가 없는 경우에는 이를 약간 변경해야 할 수도 있지만, 이를 통해 수행할 작업에 대한 정보를 얻을 수 있습니다.

또한 아래 보기가 실제로 막대 아래로 확장되는지 확인합니다.

동일한 뷰를 유지하면서 swift 4에서 프로그래밍 방식으로 이 작업을 수행할 수 있기를 원한다면,

if change {
        navigationController?.navigationBar.isTranslucent = false
        self.navigationController?.navigationBar.backgroundColor = UIColor(displayP3Red: 255/255, green: 206/255, blue: 24/255, alpha: 1)
        navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 255/255, green: 206/255, blue: 24/255, alpha: 1)
    } else {
        navigationController?.navigationBar.isTranslucent = true
        navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
        navigationController?.navigationBar.backgroundColor = .clear
        navigationController?.navigationBar.barTintColor = .clear
    }

하지만 기억해야 할 중요한 한 가지는 스토리보드에서 이 버튼을 클릭하는 것입니다.저는 점프 디스플레이에 오랫동안 문제가 있었습니다.다음을 설정해야 합니다.

그런 다음 탐색 막대의 반투명도를 변경하면 탐색 막대의 가시성에 관계없이 보기가 맨 위까지 확장될 때 보기가 점프하지 않습니다.

작업 부하에 추가합니다.

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.0)
//adjust alpha according to your need 0 is transparent 1 is solid

OBJC 솔루션을 찾는 사용자의 경우 App Delegate에 추가할 FinishingWithOptions 메서드:

[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[UINavigationBar appearance].shadowImage = [UIImage new];
[UINavigationBar appearance].backgroundColor = [UIColor clearColor];
[UINavigationBar appearance].translucent = YES;

사용해 보십시오. ios7도 지원해야 하는 경우 UItoolBar의 투명성을 기반으로 합니다.

[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];
    UIToolbar* blurredView = [[UIToolbar alloc] initWithFrame:self.navigationController.navigationBar.bounds];
    [blurredView setBarStyle:UIBarStyleBlack];
    [blurredView setBarTintColor:[UIColor redColor]];
    [self.navigationController.navigationBar insertSubview:blurredView atIndex:0];

iOS 13.0+에서는 UINavigation BarApearance를 도입했습니다. 이로 인해 iOS 13.0+에서 이 문제가 발생합니다.

이것을 사용하여 해결합니다.

탐색 막대 모양 변경 UI 탐색 막대 모양 및 UI 막대 단추 항목 모양을 사용하여 탐색 막대 모양을 변경합니다.

탐색 모음의 제목을 빨간색 텍스트로 만듭니다.

if #available(iOS 13, *) {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.backgroundColor = UIColor.systemRed
        appearance.titleTextAttributes = [.foregroundColor: UIColor.lightText] // With a red background, make the title more readable.
        navigationItem.standardAppearance = appearance
        navigationItem.scrollEdgeAppearance = appearance
        navigationItem.compactAppearance = appearance // For iPhone small navigation bar in landscape.
    }

네비게이션 컨트롤러를 전달하여 호출하는 유틸리티 메서드와 네비게이션 바에 설정할 색상입니다.투명하게 사용할 수 있습니다.clearColorUIColor학생들

목표 c -

+ (void)setNavigationBarColor:(UINavigationController *)navigationController 
                               color:(UIColor*) color {
   [navigationController setNavigationBarHidden:false animated:false];
   [navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
   [navigationController.navigationBar setShadowImage:[UIImage new]];
   [navigationController.navigationBar setTranslucent:true];
   [navigationController.view setBackgroundColor:color];
   [navigationController.navigationBar setBackgroundColor:color];
}

Swift 3.0의 경우 -

class func setNavigationBarColor(navigationController : UINavigationController?, 
                                 color : UIColor) {
    navigationController?.setNavigationBarHidden(false, animated: false)
    navigationController?.navigationBar .setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.translucent = true
    navigationController?.view.backgroundColor = color
    navigationController?.navigationBar.backgroundColor =  color
}

다음 두 줄을 작성합니다.

 navigationController?.navigationBar.isTranslucent = true
 navigationController?.navigationBar.backgroundColor = .clear

iOS 13에서 제 밑에서 일했습니다.

여기 있는 어떤 대답도 저에게 완전히 효과가 없었습니다.따라서 iOS 14 및 iOS 11(목표 C)에서 테스트한 탐색 모음이 완전히 투명해집니다.

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

버전을 이라면, 저에게 가 있었던 입니다. 15+에 대한 예전 처럼 말입니다. 예전의 기술처럼.setBackgroundImage/shadowImage더 이상 작동하지 않았습니다.

투명하게 표시하기

func setTransparent() {
    backgroundColor = .clear
    isTranslucent = true

    standardAppearance.shadowColor = .clear
    standardAppearance.backgroundColor = .clear
    standardAppearance.backgroundEffect = nil
    scrollEdgeAppearance = standardAppearance
}

투명도 제거하기

func removeTransparent() {
    setBackgroundImage(nil, for: .default)
    shadowImage = nil
    backgroundColor = .white
    isTranslucent = false

    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    standardAppearance = appearance
    scrollEdgeAppearance = standardAppearance
}

iOS 15 및 이전 버전에서 반투명 및 기본 상태로 전환하는 내비게이션 바 구성 구현:

extension UINavigationBar {
    static let defaultBackgroundColor = UIColor.red
    static let defaultTintColor = UIColor.white
    
    func setTranslucent(tintColor: UIColor, titleColor: UIColor) {
        if #available(iOS 15, *) {
            let appearance = UINavigationBarAppearance()
            appearance.configureWithTransparentBackground()
            appearance.titleTextAttributes = [.foregroundColor: titleColor]
            standardAppearance = appearance
            scrollEdgeAppearance = appearance
        } else {
            titleTextAttributes = [.foregroundColor: titleColor]
            setBackgroundImage(UIImage(), for: UIBarMetrics.default)
            shadowImage = UIImage()
        }
        isTranslucent = true
        self.tintColor = tintColor
    }
    
    func setDefaultState() {
        isTranslucent = false
        clipsToBounds = false
        
        if #available(iOS 15, *) {
            let appearance = UINavigationBarAppearance()
            appearance.configureWithOpaqueBackground()
            appearance.backgroundColor = UINavigationBar.defaultBackgroundColor
            appearance.titleTextAttributes = [.foregroundColor: UINavigationBar.defaultTintColor]
            
            UINavigationBar.appearance().standardAppearance = appearance
            UINavigationBar.appearance().scrollEdgeAppearance = appearance
        } else {
            setBackgroundImage(UIImage(), for: UIBarPosition.any, barMetrics: UIBarMetrics.defaultPrompt)
            shadowImage = UIImage()
            barTintColor = UINavigationBar.defaultBackgroundColor
            titleTextAttributes = [.foregroundColor: UINavigationBar.defaultTintColor]
        }
        
        tintColor = UINavigationBar.defaultTintColor
    }
}

이 기능은 빠른 4/5 사용자에게 기본적으로 작동합니다.

func setUpNavBar(){
    navigationItem.title = "Flick"
    navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.view.backgroundColor = UIColor.clear
    navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}

IOS15 버전

extension UIViewController {

    func clearNavigationBar(clear: Bool) {
        if clear {
            let appearance = UINavigationBarAppearance()
            appearance.configureWithTransparentBackground()
            self.navigationController?.navigationBar.standardAppearance = appearance
            self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
        } else {
            let appearance = UINavigationBarAppearance()
            appearance.configureWithOpaqueBackground()
            self.navigationController?.navigationBar.standardAppearance = appearance
            self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
        }
    }
}


class ViewController: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
         super.viewWillAppear(animated)
         clearNavigationBar(clear: true)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
         super.viewWillDisappear(animated)
         clearNavigationBar(clear: false)
    }
}

무엇보다도 iOS 버전에 적합

if #available(iOS 15.0, *) {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.backgroundImage = UIColor.clear.imageWithColor(width: UIScreen.main.bounds.size.width, height: 84)
        appearance.shadowImage = UIImage()
        appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black ,NSAttributedString.Key.font : UIFont(name: "SF UI Display Semibold", size: 18) ?? UIFont()]
        appearance.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: 2)
        self.navigationBar.standardAppearance = appearance
    } else {
        self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        self.navigationBar.shadowImage = UIImage()
        self.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black ,NSAttributedString.Key.font : UIFont(name: "SF UI Display Semibold", size: 18) ?? UIFont()]
        self.navigationBar.setTitleVerticalPositionAdjustment(2, for: UIBarMetrics.default)
    }


func imageWithColor(width: CGFloat, height: CGFloat) -> UIImage {
    let size = CGSize(width: width, height: height)
    return UIGraphicsImageRenderer(size: size).image { rendererContext in
        self.setFill()
        rendererContext.fill(CGRect(origin: .zero, size: size))
    }
}

응용 프로그램 대리자 내부에 아래 코드 줄을 추가하기만 하면 됩니다.

       UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

       // Sets shadow (line below the bar) to a blank image
       UINavigationBar.appearance().shadowImage = UIImage()

       // Sets the translucent background color
       UINavigationBar.appearance().backgroundColor = .clear
       // Set translucent. (Default value is already true, so this can be removed if desired.)

       UINavigationBar.appearance().isTranslucent = true

그런 다음 뷰 컨트롤러 내부의 사용자 지정 탐색 모음을 재정의하고 사라지면 재설정하십시오.

언급URL : https://stackoverflow.com/questions/25845855/transparent-ios-navigation-bar

반응형