태그 보관물: uinavigationbar

uinavigationbar

UINavigationBar 1px 결론을 숨기는 방법 막대의 제거 또는 색상 변경

때로는 콘텐츠와 혼합하기 위해 탐색 막대가 필요한 앱이 있습니다.

이 성가신 작은 막대의 제거 또는 색상 변경 방법을 아는 사람이 있습니까?

아래 이미지에서 나는 가지고있다-나는 “루트 뷰 컨트롤러”아래의 1px 높이 라인에 대해 이야기하고있다.

여기에 이미지 설명을 입력하십시오



답변

iOS 13의 경우 :

.shadowColor속성을 사용하십시오

이 속성이 nil이거나 선명한 색상을 포함하면 막대에 그림자가 표시되지 않습니다

예를 들어 :

let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence

iOS 12 이하의 경우 :

이렇게하려면 사용자 지정 그림자 이미지를 설정해야합니다. 그러나 그림자 이미지를 표시하려면 Apple 문서에서 인용 한 사용자 정의 배경 이미지도 설정해야합니다.

사용자 정의 그림자 이미지를 표시하려면 사용자 정의 배경 이미지도 setBackgroundImage (_ : for 🙂 메소드로 설정해야합니다. 기본 배경 이미지가 사용되는 경우이 속성 값에 관계없이 기본 그림자 이미지가 사용됩니다.

그래서:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

위의 유일한 “공식적인”방법은 그것을 숨길 수 있습니다. 불행하게도, 그것은 바의 반 투명성을 제거합니다.

나는 배경 이미지를 원하지 않고 단지 색상을 원합니다.

다음과 같은 옵션이 있습니다.

  1. 단색, 반투명 없음 :

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. 색으로 채워진 작은 배경 이미지를 만들어 사용하십시오.

  3. 아래 설명 된 ‘hacky’방법을 사용하십시오. 또한 막대를 반투명하게 유지합니다.

바를 반투명하게 유지하는 방법?

반 투명성을 유지하려면 다른 접근 방식이 필요합니다. 해킹처럼 보이지만 잘 작동합니다. 제거하려는 그림자는 UIImageView아래 의 헤어 라인 UINavigationBar입니다. 필요한 경우 찾아서 숨기거나 표시 할 수 있습니다.

아래 지침에서는 UINavigationController계층 구조의 한 컨트롤러에만 숨겨진 헤어 라인이 필요하다고 가정합니다 .

  1. 인스턴스 변수를 선언하십시오.

    private var shadowImageView: UIImageView?
  2. 이 그림자 (헤어 라인)를 찾는 방법 추가 UIImageView:

    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
    
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }
    
  3. viewWillAppear/viewWillDisappear메소드 추가 / 편집 :

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        shadowImageView?.isHidden = false
    }
    

UISearchBar헤어 라인 에도 동일한 방법이 적용되어야 하며 (거의) 숨길 필요가있는 모든 것 🙂

독창적 인 아이디어에 대한 @Leo Natan에게 감사드립니다!


답변

아래는 간단하게 도움이 될 수 있습니다!

빠른:

self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

목표 C :

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];


답변

견고한 탐색 막대 색상 만 사용하고 스토리 보드에서이를 설정하려면 AppDelegate클래스 에서이 코드를 사용 하여 모양 프록시를 통해 1 픽셀 테두리를 제거하십시오.

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];


답변

이 시도:

[[UINavigationBar appearance] setBackgroundImage: [UIImage new]
                                   forBarMetrics: UIBarMetricsDefault];

[UINavigationBar appearance].shadowImage = [UIImage new];

아래 이미지에는 설명이 있습니다 (iOS7 NavigationBar).

여기에 이미지 설명을 입력하십시오

그리고이 SO 질문을 확인하십시오 :
iOS7-UINavigationBar 테두리 색상 변경


답변

Serhii의 답변의 Swift 버전을 추가하고 싶었습니다. 나는 UIBarExtension.swift다음과 같이 만들었습니다 :

import Foundation
import UIKit

extension UINavigationBar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIToolbar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIView {
    fileprivate var hairlineImageView: UIImageView? {
        return hairlineImageView(in: self)
    }

    fileprivate func hairlineImageView(in view: UIView) -> UIImageView? {
        if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 {
            return imageView
        }

        for subview in view.subviews {
            if let imageView = self.hairlineImageView(in: subview) { return imageView }
        }

        return nil
    }
}


답변

빠른 방법 :

UINavigationBar.appearance().setBackgroundImage(
    UIImage(),
    forBarPosition: .Any,
    barMetrics: .Default)

UINavigationBar.appearance().shadowImage = UIImage()


답변

신속한 간단한 솔루션

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()