sourcetip

UI 탐색 모음 1px 맨 아래 줄을 숨기는 방법

fileupload 2023. 5. 28. 21:00
반응형

UI 탐색 모음 1px 맨 아래 줄을 숨기는 방법

저는 콘텐츠와 조화를 이루기 위해 때때로 탐색 모음이 필요한 앱을 가지고 있습니다.

이 짜증나는 작은 술집을 없애거나 색을 바꾸는 방법을 아는 사람이 있습니까?

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

여기에 이미지 설명 입력

iOS 13의 경우:

속성 사용

이 속성이 0이거나 선명한 색을 포함하는 경우 막대에 그림자가 표시되지 않습니다.

예를 들어:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearance

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. 아래에 설명된 '해키' 방법을 사용합니다.그것은 또한 막대를 반투명하게 유지할 수 있습니다.

바를 투명하게 유지하는 방법은?##

투명성을 유지하기 위해서는 다른 접근법이 필요합니다. 해킹처럼 보이지만 잘 작동합니다. 우리가제그는림헤자니다입인어라는거.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에게 감사드립니다!

여기 해킹이 있습니다.이것은 주요 경로에서 작동하기 때문에 나중에 깨질 수 있습니다.하지만 지금은 예상대로 작동합니다.

스위프트:

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

목표 C:

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

, 이▁your▁in▁code▁this▁if다▁use▁and,니▁coloration▁bar합사board▁this▁a용▁in▁want▁up▁navig단▁your에 사용하세요.AppDelegate모양 프록시를 통해 1픽셀 경계를 제거하는 클래스:

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

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

사용해 보십시오.

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

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

아래 이미지에는 다음과 같은 설명이 있습니다(iOS7 내비게이션 바).

여기에 이미지 설명 입력

그리고 이 SO 질문을 확인하십시오: iOS7 - UI 탐색 모음 테두리 색 변경

신속한 방법:

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

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

간단한 솔루션을 신속하게 제공

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

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

런타임 특성 추가: Shadow - Boolean - True 숨김

여기에 이미지 설명 입력

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

UIKit는 섀도 이미지 및 섀도 색상 속성을 사용하여 섀도의 모양을 결정합니다.shadowImage가 0인 경우 막대는 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

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

저는 Serhil의 답변을 공부한 후 헤어라인을 쉽게 숨길 수 있는 UINavigation Bar+Addition 포드를 만들었습니다.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

Swift 4 //탐색 막대 그림자 라인 숨기기

navigationController?.navigationBar.shadowImage = UIImage()

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
    }

}

Swift 4 테스트를 거친 한 줄 솔루션

Viewdidload()HidesShadow 키에 대한 Navigation 컨트롤러의 사용자 기본값 true 설정

override func viewDidLoad() {
    super.viewDidLoad()

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

}

UIApearance API를 사용하여 그림자를 숨기거나 표시하거나 Storyboard(또는 소스 코드)를 사용하여 그림자를 숨기거나 표시할 탐색 모음을 선택할 수 있는 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

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

탐색 모음 스토리보드

iOS 13+의 경우

중요한 것은 초기화하는 것입니다.'UINavigationBarAppearance'와 함께TransparentBackground그러면 탐색 모음의 수평선을 쉽게 제거할 수 있습니다.

let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
appearance.backgroundColor = .green // Required background color

마지막으로, 애플이 제안한 대로 내비게이션 항목에 모양 변경 사항을 추가합니다.

self.navigationItem.standardAppearance = appearance
self.navigationItem.scrollEdgeAppearance = appearance
self.navigationItem.compactAppearance = appearance

스위프트가 이걸 넣었습니다.

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

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

투명성을 유지하고 하위 분류를 원하지 않는 경우 다음과 같은 다른 옵션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
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()

}

저에게 맞는 두 줄 솔루션입니다.ViewDidLoad 메서드에 추가해 보십시오.

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

다음은 매우 간단한 솔루션입니다.

self.navigationController.navigationBar.clipsToBounds = YES;

iOS8에서 다음을 설정하면UINavigationBar.barStyle.Black막대의 배경을 테두리 없이 일반 색상으로 설정할 수 있습니다.

Swift에서:

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

Swift 4.2의 솔루션:

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

이 이 기 첫 번 째 컨 러 롤 에 트 넣 기 됩 만 니 다 하 하 면 호 출 고 능 을 ▁it ▁just ▁put 다 니 됩 ▁at ▁and ▁function ▁in ▁call ▁this 이 ▁view ▁first controller ▁the 하 면 기viewdidload

간단한 솔루션 – 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)
    

iOS 9 사용자의 경우, 이것은 저에게 효과가 있었습니다. 다음과 같이 추가하십시오.

UINavigationBar.appearance().shadowImage = UIImage()

배경 이미지 설정의 문제는 흐림을 제거한다는 것입니다.배경 이미지를 설정하지 않고 제거할 수 있습니다.여기서 제 대답을 보세요.

스위프트 3.0에 대한 pxpgraphics의 답변입니다.

import Foundation
import UIKit

extension UINavigationBar {

  func hideBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = false
  }

  private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView? {
    if view is UIImageView && view.bounds.height <= 1.0 {
      return (view as! UIImageView)
    }

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInNavigationBar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}

extension UIToolbar {

  func hideHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = false
  }

  private func hairlineImageViewInToolbar(view: UIView) -> UIImageView? {
    if view is UIImageView && view.bounds.height <= 1.0 {
      return (view as! UIImageView)
    }

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInToolbar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}

UIS 검색 표시줄의 아래쪽에 보기를 추가해야 합니다.

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)

내가 방금 이것에 대한 확장을 만들었습니다...포맷해서 죄송합니다(첫 번째 답변입니다).

용도:

  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
    }


}

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

언급URL : https://stackoverflow.com/questions/19226965/how-to-hide-uinavigationbar-1px-bottom-line

반응형