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

운없이 navigationBars 테두리를 제거하려고했습니다. 나는 연구했고 사람들은 shadowImage와 BackgroundImage를 nil로 설정하라고 말하는 것 같지만 이것은 내 경우에는 작동하지 않습니다.

내 코드

    self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866")
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

삽화:

여기에 이미지 설명 입력



답변

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

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


답변

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

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


답변

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)


답변

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