IT

신속하게 navigationBar에서 제거

lottoking 2020. 8. 18. 07:56
반응형

신속하게 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()

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

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)

스위프트 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는 취소 요청을 거짓으로 전달하십시오.


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

를 색조 설정 barStyle하기 .Black전에로 설정하십시오.

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

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()iOS 10에서 작동하지 않는 알파를 0으로 설정하여 모든 곳에서 호환됩니다.


Swift 3+의 UINavigationBar에서 사용을 선택하십시오.

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

신속한 3

viewDidLoad방법

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

누군가 궁금해하는 경우 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는 뷰가 사라지는 것을 좋아하지 않습니다.


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

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

Ref


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

받아 들인 대답은 나를 위해 일했지만 뒤로 튀어 나오거나 다른 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

평화!


스위프트 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
    }
}


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


이것은 네이트 쿡 답변의 수단 3 기반의 답변입니다.

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

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


앱 델리게이트

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 ()없이 쉽게 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/26390072/remove-border-in-navigationbar-in-swift

반응형