programing

탐색 막대의 테두리를 신속하게 제거하는 방법은 무엇입니까?

starjava 2023. 4. 22. 08:21
반응형

탐색 막대의 테두리를 신속하게 제거하는 방법은 무엇입니까?

네비게이션 바의 테두리를 제거하려고 했지만 잘 안 됐어요조사해보니 섀도우이미지와 배경이미지를 0으로 설정하라고 하는 것 같았는데, 제 경우는 잘 되지 않습니다.

내 코드

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

그림:

여기에 이미지 설명 입력

이 문제는 다음 2개의 회선에 있습니다.

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

에, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」UIImage(named: "")nil과 같이 됩니다.

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

빈 하니까, 그냥 전전 、 izeize 、 음음음 、 음음ize음izeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeizeize로 .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 어플리케이션(...did Finish Launching With Options launch Options:...)

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

그리고 뷰컨트롤러에서...

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

모든 viewController에서 이 작업을 취소하려면 false를 전달하십시오.

이렇게 하면 그림자 이미지가 완전히 제거됩니다.

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

스위프트 5

setBackgroundImage / shadowImage를 사용하여 헤어라인을 숨길 경우 약간의 지연이 발생합니다.이 방법을 사용하면 지연이 제거됩니다.카멜레온 프레임워크의 공로를 인정합니다.이것이 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
    }
}

let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()

★★barStyle로로 합니다..Black「CHANGE MARGE:」

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

iOS 13+의 경우:

let appearance = UINavigationBarAppearance()
appearance.shadowColor = .clear

를 에 할당합니다.UINavigationBar:

navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
navigationController?.navigationBar.compactAppearance = appearance

★★shadowImage = UIImage()나한테는 통하지 않았어

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

UINavigation Controller(UINavigation Controller)는 UINavigation Controller(UINavigation Controller). removeFromSuperview()회선은 하지 않기 에, 이 되도록, 으로 설정했을 뿐입니다.iOS 10에서는 동작하지 않기 때문에, 이 1개의 콜이 어디에서나 호환되도록 알파를 0으로 설정했습니다.

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

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().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
    }

난 이것만 먹혔어쨌든

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

참조

swift 3을 위해

viewDidLoad 법 method

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

궁금하신 분들을 위해 Swift 4용으로 업데이트 되었습니다.

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

지금은 훨씬 덜 장황하다.

받아들여진 답변은 효과가 있었지만, 팝업백이나 다른 VC에 푸시 할 때 섀도 이미지를 다시 표시하고 싶을 때 네비게이션 바에 눈에 띄게 깜박임이 있음을 알게 되었습니다.

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")view섀도 막대가 현재 표시 가능한 뷰 컨트롤러에 숨겨져 있는지 확인합니다.

다음 2가지 방법 사용

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

viewShadow 이미지가 다시 나타날 때만 깜박임이 계속 발생하며 탐색 모음 자체는 표시되지 않습니다.

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

하단만 삭제하고 탐색 막대의 단색을 유지하려면 viewDidLoad: Swift 3, 4에서 다음 코드 행을 추가하십시오.

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

피스!

배경색을 변경하지 않고 다음과 같이 작업을 수행할 수 있습니다.

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

메모: 프로덕션 앱에서 충돌할 수 있습니다.네비게이션 바는 뷰가 사라지는 것을 좋아하지 않는 것 같습니다.

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%의 사람들이 이 방법을 사용할 수 있습니다.

custom navigation Controller에서 다음 행을 추가합니다.

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

중요사항

첫 번째 줄 viewDidLoad() 메서드를 사용하는 경우 navigationController는 네비게이션 바를 다시 그려야 하지만 쉽게 viewWillAppear() 메서드에서 layoutIfNeeded() 없이 사용할 수 있습니다.

AppDelegate의 didFinishLaunchingWithOptions 메서드에서 이 코드를 사용하여 앱 전체에 도달합니다.

 let barAppearance = UINavigationBar.appearance()
    
 if #available(iOS 13, *) {
     let appearance = UINavigationBarAppearance()
     appearance.configureWithTransparentBackground()
     barAppearance.standardAppearance = appearance
     barAppearance.scrollEdgeAppearance = appearance
 } else {
     barAppearance.setBackgroundImage(UIImage(), for: UIBarPosition.any, barMetrics: UIBarMetrics.defaultPrompt)
     barAppearance.shadowImage = UIImage()
 }

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

경계선은 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에 불과하기 때문에 이 코드는 그것만 삭제합니다.

이것은 네이트 쿡의 빠른 3단계 답변이다.

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

iOS 11 Swift 4 테두리를 제거하고 싶지만 탐색 막대를 반투명하게 만들지 않으려면 다음을 수행해야 합니다.
self.navigationBar.shadowImage = UIImage()

Xcode 14.2를 사용하고 있습니다.Xcode UI를 사용하여 이 작업을 수행하려면 탐색 컨트롤러를 선택한 다음 탐색 막대, 특성 검사기 및 스크롤 가장자리 모양에서 섀도 색상을 지우도록 설정합니다.

여기에 이미지 설명 입력

문제를 해결하기 위해 액티비티 인스펙터에서 네비게이션 바의 섀도 색상을 Clear로 변경했습니다.

[네비게이션 섀도 색상 변경****강 텍스트][1]

[1]: https://i.stack.imgur.com/i3Kdo.png***strong 텍스트 보기

언급URL : https://stackoverflow.com/questions/26390072/how-to-remove-border-of-the-navigationbar-in-swift

반응형