UINavigationBar 1px 결론을 숨기는 방법


443

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

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

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

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


이것을 검토하십시오 : stackoverflow.com/questions/19101361/…
Kuldeep

내비게이션 높이를 1px 높이는 방법?
Suresh Durishetti

답변:


738

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에게 감사드립니다!


103
UINavigationBar속성 의보기를 설정할 수도 있습니다.clipsToBounds = YES
cleverbit

3
@richarddas clipsToBounds = YES는 매력처럼 작동합니다! 감사!
romeouald

3
일부 레이아웃에서는 clipsToBounds가 항상 작동하지는 않습니다. 이 답변은 나에게 완벽했습니다. 오직 UINavigationBar 서브 클래스를 만들고 위의 코드를 사용하여 -layoutSubview 메소드에서 그림자 이미지를 숨겼습니다. 감사!
cgossain

7
iOS 상단 상태 표시 줄이 반투명하게되어 문제가 발생하여 UINavigationBar 뒤에서 테이블 뷰가 스크롤되는 것을 볼 수 있습니다. setTranslucent = NO를 설정하여이 문제를 해결했습니다.
Vlad

2
iOS 10에서는 viewWillAppear 호출 할 수없는 것 같습니다shadowImageView
xi.lin

241

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

빠른:

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

목표 C :

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

6
나는 Xcode 8과 iOS 8 용 개발자이며 위의 것을 제외하고는 위의 어느 것도 나를 위해 일하지 않았다.
Vakas

2
또한 XCode 8 및> iOS 8에서도 마찬가지입니다. 이것은 저에게 효과적이었습니다.
cloudcal

1
이것은 iOS 10 및 Xcode 8.3.1에서 나에게 도움이 된 유일한 짧고 간단한 대답입니다. 고마워요
Vishal Sonawane

1
목표 -C : self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos

1
iOS 13.3.1 버전 iPad에서는 이것이 나를 위해 일했습니다.
라비

145

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

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

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

2
이것은 코드베이스의 모든 탐색 막대에 대해 전역 적으로 설정합니다. 대부분 원하는 시간이 아닙니다.
Christoph

97

이 시도:

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

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

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

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

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


Serhii가 말했듯이 그림자 이미지를 허용하려면 사용자 정의 배경 이미지를 설정해야합니다.
akashivskyy

3
AppDelegate에서이 작업을 수행하십시오.
myusuf3

큰 대답 ... 내 하루를 저장 _ / \ _
Akshay

@RPM은 iOS 7,8,9,10에서 잘 작동합니다. 스위프트의 매체 에는 viewControlles의 네비게이션 바에 동일한 코드가 있습니다 .
Akhrameev 2012 년

64

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
    }
}

감사합니다! 이것이 답이되어야합니다.
PeiweiChen

navigationBar에서는 작동하지만 uitoolbar에서는 작동하지 않습니다.
TomSawyer

iOS 12에서 더 이상 작동하지 않습니다 . :(.
Chris Prince

위대한 iOS 13에서 작동
ttorbik

이것이 답이되어야합니다. 13 IOS에 매력처럼 작동
COVID19

63

빠른 방법 :

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

UINavigationBar.appearance().shadowImage = UIImage()

2
가장 세련된 답변을 찾기 전에 목록에서 아래로 내려가는 것은 매우 드 rare니다. +1!
sudo

3
/ : 그것은 상점 UINavigationBar의 전체 배경 숨 깁니다
user365314

잘못, 그것은 전체 배경을 숨 깁니다!
TomSawyer

3
참고 : navigationBar의 isTranslucent를 false로 설정해야합니다.
dmathewwws

19

신속한 간단한 솔루션

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

3
+1 모든 답변 중 이것이 마침내 나를 위해 일한 것입니다. 상태 표시 줄을 다른 답변으로 엉망으로 만들지 않았으며 프로젝트의 모든 탐색 모음이 아닌 탐색 컨트롤러 모음 중 하나만 변경하는 문제를 해결합니다.
JoeGalind

스위프트 4.2 버전 : navigationBar? .setBackgroundImage (UIImage (), for : UIBarPosition.any, barMetrics : UIBarMetrics.default) navigationBar? .shadowImage = UIImage ()
airowe

16

Serhil의 답변을 연구 한 후, 나는 헤어 라인을 쉽게 숨길 수 있는 포드 UINavigationBar + Addition 을 만들었습니다 .

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}

16

스위프트 3.0

AppDelegate.swift응용 프로그램 기능에 다음 코드를 추가하여 편집하십시오 .

// Override point for customization after application launch.

// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

16

iOS 13부터 그림자를 설정하거나 제거하는 시스템 API가 있습니다.

UIKit은 shadowImage 및 shadowColor 속성을 사용하여 그림자의 모양을 결정합니다. shadowImage가 nil 인 경우 막대는 shadowColor 속성의 값에 따라 색조가 지정된 기본 그림자를 표시합니다. shadowColor가 0이거나 clearColor 색상을 포함하면 막대에 그림자가 표시되지 않습니다.

    let appearance = UINavigationBarAppearance()
    appearance.shadowImage = nil
    appearance.shadowColor = nil
    navigationController.navigationBar.standardAppearance = appearance

https://developer.apple.com/documentation/uikit/uibarappearance/3198009-shadowimage


shadowImage와 shadowColor는 UINavigationBarAppearance헤더에 문서화되어 있지 않습니다 !! 나는 그것을 찾지 못할 것이다. 감사합니다, 이것은 내 문제를 100 % 해결했습니다.
Roger Oba

1
예, iOS 13에서도 잘 작동합니다. @ glotcha 감사합니다.
Yogesh Patel

@glotcha 오른쪽 ....
Digvijay

감사. 나를 위해 일한 유일한 것
alionthego

13

스토리 보드에서 숨길 수도 있습니다 (Xcode 10.1에서 작동)

런타임 속성을 추가하여 : hidesShadow-부울-True

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


11

Swift 2.0 용 pxpgraphics 솔루션 업데이트

extension UINavigationBar {

    func hideBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = true
    }

    func showBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = false
    }

    private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

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

        return nil
    }

}

extension UIToolbar
{

    func hideHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = true
    }

    func showHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = false
    }

    private func hairlineImageViewInToolbar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

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

        return nil
    }

}

안녕하세요, iOS를 처음 사용하고 제 자신을 가르치려고합니다. 확장 프로그램은 어떻게 사용합니까? 뷰 컨트롤러 파일이 있으며 이러한 확장을 클래스 범위 외부에 넣습니다. 그러면 어떻게 hide / showHairline ()을 호출합니까? 확장 기능을 사용하는 방법을 이해하지 못하지만 너무 많은 솔루션에 사용되는 방법을 이해하지 못하지만 실제 코드에서 어떻게 구현되는지 이해하지 못합니다.
Tommy K

확장 기능은 기존 클래스에 기능을 추가합니다. 확장 클래스, 구조, 열거 형 등을 사용할 때마다 이러한 새로운 기능을 사용할 수 있습니다. 자세한 내용은 여기를 참조하십시오 : developer.apple.com/library/ios/documentation/Swift/Conceptual/...이
tf.alves

흠 그래서 그냥 사용할 수 있어야 UINavigationController().navigationBar/toolbar.hide/showBottomHairline()합니까? 나는 이것을 시도하고 있지만 소용이 없다. 올바르게 이해하지 못합니까?
Tommy K

11

스위프트 4 // 탐색 막대 그림자 선 숨기기

navigationController?.navigationBar.shadowImage = UIImage()

10

UIAppearance API를 사용하여 그림자를 숨기거나 표시하거나 스토리 보드 (또는 소스 코드)를 사용하여 해당 그림자를 숨기거나 표시해야 할 탐색 모음을 선택할 수있는 UINavigationBar 확장을 사용합니다. 확장명은 다음과 같습니다.

import UIKit

private var flatAssociatedObjectKey: UInt8 = 0

/*
  An extension that adds a "flat" field to UINavigationBar. This flag, when
  enabled, removes the shadow under the navigation bar.
 */
@IBDesignable extension UINavigationBar {
    @IBInspectable var flat: Bool {
        get {
            guard let obj = objc_getAssociatedObject(self, &flatAssociatedObjectKey) as? NSNumber else {
                return false
            }
            return obj.boolValue;
        }

        set {
            if (newValue) {
                let void = UIImage()
                setBackgroundImage(void, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = void
            } else {
                setBackgroundImage(nil, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = nil
            }
            objc_setAssociatedObject(self, &flatAssociatedObjectKey, NSNumber(bool: newValue),
                    objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

이제 모든 탐색 모음에서 그림자를 비활성화하려면 다음을 사용해야합니다.

UINavigationBar.appearance().flat = true

또는 스토리 보드를 사용하여이 동작을 활성화 / 비활성화 할 수 있습니다.

네비게이션 바 스토리 보드


@ NunoGonçalves에서는 flatAssociatedObjectKey연결된 객체를 식별하는 고유 한 int (포인터로 취급)로 생각할 수 있습니다 . 여기는 개인 변수의 메모리 주소로 정의됩니다. 이 var를 추가하기 위해 응답을 업데이트했습니다. 자세한 정보는 nshipster.com/related-objects 를 참조하십시오 .
Alvivi

좋은 해결책이지만 탐색 모음이 translucentfalse 로 설정된 경우에만 작동
ZYiOS

9

스위프트 4 테스트 한 라인 솔루션

에서 Viewdidload() 키 "hidesShadow"에 대한 true로 설정 탐색 컨트롤러의 userdefault 값

override func viewDidLoad() {
    super.viewDidLoad()

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

}

1
완벽하게 작동 !!
Prashant Tukadiya

7

스위프트는 이것을 넣어

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

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool

그리고 배경색도 제거합니다.
TomSawyer

7

반투명도를 유지하고 UINavigationController앱에서 모든 서브 클래스를 원하지 않는 경우 다른 옵션 :

#import <objc/runtime.h>

@implementation UINavigationController (NoShadow)

+ (void)load {
    Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
    Method swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillAppear:));
    method_exchangeImplementations(original, swizzled);
}

+ (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }

    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }

    return nil;
}

- (void)swizzled_viewWillAppear:(BOOL)animated {
    UIImageView *shadow = [UINavigationController findHairlineImageViewUnder:self.navigationBar];
    shadow.hidden = YES;

    [self swizzled_viewWillAppear:animated];
}

@end

6
Slightly Swift Solution 
func setGlobalAppearanceCharacteristics () {
    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.white
    navigationBarAppearace.barTintColor = UIColor.blue
    navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBarAppearace.shadowImage = UIImage()

}

고마워 제임스! 왜 누군가가 귀하의 답변에 투표했는지 이해할 수 없습니다.
Dănuț Mihai Florian 2016

필요한 경우 self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navigationBar.backgroundColor = UIColor.blueColor를 추가 할 수도 있습니다. ()
Alessandro Ornano

5

Swift 4.2의 솔루션 :

private func removeHairlineFromNavbar() {
    UINavigationBar.appearance().setBackgroundImage(
        UIImage(),
        for: .any,
        barMetrics: .default)
    UINavigationBar.appearance().shadowImage = UIImage()
}

이 함수를 첫 번째 Viewcontroller에 넣고 호출하십시오. viewdidload


4

iOS8의에서 경우는 설정 UINavigationBar.barStyle.Black사용하여 테두리없이 무지로 바의 배경을 설정할 수 있습니다.

스위프트에서 :

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()

이것이 가장 깨끗한 솔루션이며이를 달성하는 가장 좋은 방법입니다. <iOS 8을 지원할 필요가 없다면이 답변을 사용하지 않을 이유가 없습니다. 감사.
user3344977

잘 작동합니다. 스토리 보드에서도 설정 했으므로 코드가 필요하지 않았습니다.
vikzilla

1
이렇게하면 표준 그림자 대신 매우 작은 흰색 선이 나타납니다.
Vegard

4

나를 위해 작동하는 두 줄 솔루션. 이것을 ViewDidLoad 메소드에 추가하십시오.

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

오직이 나를 위해 일한
오사마 빈 Attique에게

3

다음은 매우 간단한 해결책입니다.

self.navigationController.navigationBar.clipsToBounds = YES;

37
상태 표시 줄 영역도 잘립니다.
Fury

3

간단한 솔루션 – Swift 5

  1. 확장을 작성하십시오.

    extension UIImage {
    
        class func hideNavBarLine(color: UIColor) -> UIImage? {
    
            let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            context?.setFillColor(color.cgColor)
            context?.fill(rect)
    
    
            let navBarLine = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return navBarLine
        }
    }
  2. 이것을 다음에 추가하십시오 viewDidLoad():

    self.navigationController?.navigationBar.shadowImage = UIImage.hideNavBarLine(color: UIColor.clear)

2

iOS 9 사용자에게는 이것이 효과적이었습니다. 이것을 추가하십시오 :

UINavigationBar.appearance().shadowImage = UIImage()

2

배경 이미지 설정의 문제점은 흐릿함을 제거한다는 것입니다. 배경 이미지를 설정하지 않고 제거 할 수 있습니다. 여기에 내 답변을 참조 하십시오 .


2

UISearchBar의 맨 아래에 뷰를 추가해야합니다

let rect = searchController.searchBar.frame;
let lineView : UIView = UIView.init(frame: CGRect.init(x: 0, y: rect.size.height-1, width: rect.size.width, height: 1))
lineView.backgroundColor = UIColor.init(hexString: "8CC73E")
searchController.searchBar.addSubview(lineView)

나는 이것이 여전히 문제라고 믿을 수 없다-단지 그것을 다시 만났다! 그러나이 솔루션은 현재 최고의 솔루션입니다. 감사합니다 @ Socheat
RichAppz

1

나는 이것이 오래된 스레드라는 것을 알고 있지만 실제로 잘 작동하는 솔루션을 찾았습니다.

서브 클래스 UINavigationBar. UINavigationBar 서브 클래스에서 다음 코드로 didAddSubview를 대체하십시오.

- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}

1

방금 확장 프로그램을 만들었습니다 ... 형식이 잘못되었습니다 (이것이 첫 번째 대답입니다).

용법:

  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.hideShadow = true
}

신장:

 UINavigationController.swift
//  Created by Ricardo López Rey on 16/7/15.

import Foundation


struct UINavigationControllerExtension {
    static var hideShadowKey : String = "HideShadow"
static let backColor = UIColor(red: 247/255, green: 247/255, blue: 248/255, alpha: 1.0)
}

extension UINavigationController {

    var hideShadow : Bool {
        get {
            if let ret =  objc_getAssociatedObject(self, &UINavigationControllerExtension.hideShadowKey) as? Bool {
                return ret
            } else {
                return false
            }


        }
        set {
            objc_setAssociatedObject(self,&UINavigationControllerExtension.hideShadowKey,newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))

            if newValue {


            self.navigationBar.setBackgroundImage(solidImage(UINavigationControllerExtension.backColor), forBarMetrics: UIBarMetrics.Default)

                self.navigationBar.shadowImage = solidImage(UIColor.clearColor())
            } else {
                self.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)
            }
        }
    }

    private func solidImage(color: UIColor, size: CGSize = CGSize(width: 1,height: 1)) -> UIImage {
        var rect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }


}

1

AppDelegate 내 에서 이것은 NavBar의 형식을 전체적으로 변경했습니다.

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barTintColor = UIColor.redColor()
    UINavigationBar.appearance().translucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().backgroundColor = UIColor.redColor()
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

특정 VC에서 다른 것을 구현하지 못했지만 90 %의 사람들에게 도움이됩니다.


1
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.