카테고리 없음

[iOS] 신속하게 navigationBar의 테두리를 제거하는 방법은 무엇입니까?

필살기쓰세요 2021. 1. 31. 22:35

문제는 다음 두 줄에 있습니다.

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

이름이없는 이미지가 없으므로를 UIImage(named: "")반환합니다 nil. 이는 기본 동작이 시작됨을 의미합니다.

nil이 아닌 경우 기본 그림자 이미지 대신 표시 할 사용자 지정 그림자 이미지입니다. 사용자 지정 그림자를 표시하려면 -setBackgroundImage : forBarMetrics :를 사용하여 사용자 지정 배경 이미지도 설정해야합니다 (기본 배경 이미지가 사용되는 경우 기본 그림자 이미지가 사용됨).

정말 빈 이미지가 필요하므로 다음으로 초기화하십시오 UIImage().

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
-------------------

Swift 4 및 Swift 5

테두리 제거 :

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

테두리 복원 :

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()
-------------------

Swift 2를 사용하면 다음과 같이 할 수 있습니다.

AppDelegate 파일

내부 func 응용 프로그램 (..., didFinishLaunchingWithOptions launchOptions : ...)

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

Swift 3 :

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
-------------------

이렇게하면 그림자 이미지가 모두 제거됩니다.

for parent in self.navigationController!.navigationBar.subviews {
 for childView in parent.subviews {
      if(childView is UIImageView) {
               childView.removeFromSuperview()
                    }
                     }
                     }
                     
-------------------

UINavigationBar의 확장에 이것을 작성하십시오.

extension UINavigationBar {

    func shouldRemoveShadow(_ value: Bool) -> Void {
            if value {
                        self.setValue(true, forKey: "hidesShadow")
                                } else {
                                            self.setValue(false, forKey: "hidesShadow")
                                                    }
                                                        }
                                                        }
                                                        

그리고 당신의 viewController에서 ...

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
        self.navigationController?.navigationBar.shouldRemoveShadow(true)        
        }
        

그리고 viewController에 대해 이것을 취소하려면 false를 전달하십시오.

-------------------

색조를 설정 barStyle하기 .Black전에로 설정 :

self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()
-------------------

스위프트 5

setBackgroundImage / shadowImage를 사용하여 헤어 라인을 숨기면 약간의 지연이 있습니다. 이 방법은 지연을 제거합니다. Chameleon Framework에 대한 크레딧 . 이것이 그들이 사용하는 방법입니다 (ObjC에서)


extension UINavigationController {
    func hideHairline() {
            if let hairline = findHairlineImageViewUnder(navigationBar) {
                        hairline.isHidden = true
                                }
                                    }
                                        func restoreHairline() {
                                                if let hairline = findHairlineImageViewUnder(navigationBar) {
                                                            hairline.isHidden = false
                                                                    }
                                                                        }
                                                                            func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
                                                                                    if view is UIImageView && view.bounds.size.height <= 1.0 {
                                                                                                return view as? UIImageView
                                                                                                        }
                                                                                                                for subview in view.subviews {
                                                                                                                            if let imageView = self.findHairlineImageViewUnder(subview) {
                                                                                                                                            return imageView
                                                                                                                                                        }
                                                                                                                                                                }
                                                                                                                                                                        return nil
                                                                                                                                                                            }
                                                                                                                                                                            }
                                                                                                                                                                            
                                                                                                                                                                            
-------------------

Luca Davanzo의 대답은 훌륭하지만 iOS 10에서는 작동하지 않습니다. iOS 10 이하에서 작동하도록 변경했습니다.

for parent in navigationController!.view.subviews {
    for child in parent.subviews {
            for view in child.subviews { 
                        if view is UIImageView && view.frame.height == 0.5 {
                                        view.alpha = 0
                                                    }
                                                            }
                                                                }
                                                                }
                                                                

UINavigationController를 확장하고 이것을 호출 할 수도 있습니다. removeFromSuperview()on the line은 iOS 10에서 작동하지 않으므로 알파를 0으로 설정하여이 통화가 모든 곳에서 호환됩니다.

-------------------

Swift 3+의 UINavigationBar에서 테두리를 제거하려면 다음을 사용하십시오.

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
-------------------
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()
-------------------

신속한 3

viewDidLoad방법

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
-------------------

이것 만이 나를 위해 일했습니다.

self.navigationController?.navigationBar.shadowImage = UIImage()

Ref

-------------------

누군가 궁금해하는 경우 Swift 4 업데이트

navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()

지금은 훨씬 덜 장황합니다.

-------------------

배경색을 변경하지 않고 수행하려는 경우 다음과 같습니다.

// Remove the border ImageView from the NavigationBar background
func hideBottomBorder() {
    for view in navigationBar.subviews.filter({ NSStringFromClass($0.dynamicType) == "_UINavigationBarBackground" }) as [UIView] {
            if let imageView = view.subviews.filter({ $0 is UIImageView }).first as? UIImageView {
                        imageView.removeFromSuperview()
                                }
                                    }
                                    }
                                    

참고 : 프로덕션 앱에서 충돌이 발생할 수 있습니다. 분명히 NavigationBar는 뷰가 사라지는 것을 좋아하지 않습니다.

-------------------

받아 들인 대답은 나를 위해 일했지만 뒤로 튀거나 다른 vc로 앞으로 밀 때 그림자 이미지가 다시 나타나기를 원할 때 탐색 모음에서 눈에 띄는 깜박임이 있음을 알았습니다.

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") viewWillAppear 에서이 메서드 사용 하면 현재 보이는 뷰 컨트롤러에서 섀도우 바가 숨겨집니다.

이 두 가지 방법 사용

navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")

viewWillDisappear에서 깜박임은 여전히 ​​발생하지만 그림자 이미지가 다시 나타날 때만 발생하고 탐색 모음 자체는 표시되지 않습니다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
        // 1. hide the shadow image in the current view controller you want it hidden in
            navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
                navigationController?.navigationBar.layoutIfNeeded()
                }
                
                override func viewWillDisappear(_ animated: Bool) {
                    super.viewWillDisappear(true)
                    
                        // 2. show the shadow image when pushing or popping in the next view controller. Only the shadow image will blink
                            navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
                                navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
                                    navigationController?.navigationBar.layoutIfNeeded()
                                    }
                                    
-------------------

맨 아래 줄만 제거하고 navigationBar의 단색을 유지하려면 viewDidLoad : Swift 3, 4에 다음 코드 줄을 추가합니다.

navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false

평화!

-------------------

Jack Chen의보다 신속한 방법 :

extension UINavigationController {

    var isHiddenHairline: Bool {
            get {
                        guard let hairline = findHairlineImageViewUnder(navigationBar) else { return true }
                                    return hairline.isHidden
                                            }
                                                    set {
                                                                if let hairline = findHairlineImageViewUnder(navigationBar) {
                                                                                hairline.isHidden = newValue
                                                                                            }
                                                                                                    }
                                                                                                        }
                                                                                                        
                                                                                                            private func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
                                                                                                                    if view is UIImageView && view.bounds.size.height <= 1.0 {
                                                                                                                                return view as? UIImageView
                                                                                                                                        }
                                                                                                                                        
                                                                                                                                                for subview in view.subviews {
                                                                                                                                                            if let imageView = self.findHairlineImageViewUnder(subview) {
                                                                                                                                                                            return imageView
                                                                                                                                                                                        }
                                                                                                                                                                                                }
                                                                                                                                                                                                
                                                                                                                                                                                                        return nil
                                                                                                                                                                                                            }
                                                                                                                                                                                                            }
                                                                                                                                                                                                            

사용 :

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
                navigationController?.isHiddenHairline = true
                    }
                    
                        override func viewWillDisappear(_ animated: Bool) {
                                super.viewWillDisappear(animated)
                                        navigationController?.isHiddenHairline = false
                                            }
                                            
-------------------

swift3의 경우 약간 다른 방식으로 작성해야합니다.

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
    for: UIBarMetrics.default)
       self.navigationController?.navigationBar.shadowImage = UIImage()
       
-------------------

이것은 Gaurav Chandarana 의 대답을 간소화 한 버전입니다 .

extension UINavigationBar {

    func hideShadow(_ value: Bool = true) {
            setValue(value, forKey: "hidesShadow")
                }
                }
                
-------------------

앱 델리게이트

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
-------------------

사용자 정의 navigationController에 다음 줄을 추가하십시오.

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

중요 사항

첫 번째 줄인 viewDidLoad () 메서드를 사용하는 경우 마지막 줄이 중요합니다. navigationController는 탐색 모음을 다시 그려야하기 때문이지만 탐색 모음을 그리기 전에 viewWillAppear () 메서드에서 layoutIfNeeded ()없이 쉽게 사용할 수 있습니다.

-------------------

경계선은 UIImageView이고 imageView 인 하위보기를 제거하면 UIImageView와 함께 barButtonItems가 제거됩니다. 아래 코드는 제거하는 데 도움이됩니다. 이것이 나와 같은 문제에 직면 한 사람에게 도움이되기를 바랍니다.

for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
                    if childView.frame.height == 0.5 {
                                    childView.removeFromSuperview()
                                                }
                                                        }
                                                            }
                                                            

테두리 UIImageView는 높이가 0.5에 불과하므로이 코드는이를 제거합니다.

-------------------

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 %의 사람들에게 도움이 될 것입니다.

-------------------

이것은 Nate Cook 답변의 신속한 3 기반의 답변입니다.

   self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    
-------------------

iOS 11 및 Swift 4 테두리를 제거하고 싶지만 navigitonbar를 반투명하게 만들지 않으려면 다음을 시도해야합니다.
self.navigationBar.shadowImage = UIImage()



출처
https://stackoverflow.com/questions/39919993