때로는 콘텐츠와 혼합하기 위해 탐색 막대가 필요한 앱이 있습니다.
이 성가신 작은 막대의 제거 또는 색상 변경 방법을 아는 사람이 있습니까?
아래 이미지에서 나는 가지고있다-나는 “루트 뷰 컨트롤러”아래의 1px 높이 라인에 대해 이야기하고있다.
답변
iOS 13의 경우 :
.shadowColor
속성을 사용하십시오
이 속성이 nil이거나 선명한 색상을 포함하면 막대에 그림자가 표시되지 않습니다
예를 들어 :
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
iOS 12 이하의 경우 :
이렇게하려면 사용자 지정 그림자 이미지를 설정해야합니다. 그러나 그림자 이미지를 표시하려면 Apple 문서에서 인용 한 사용자 정의 배경 이미지도 설정해야합니다.
사용자 정의 그림자 이미지를 표시하려면 사용자 정의 배경 이미지도 setBackgroundImage (_ : for 🙂 메소드로 설정해야합니다. 기본 배경 이미지가 사용되는 경우이 속성 값에 관계없이 기본 그림자 이미지가 사용됩니다.
그래서:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
위의 유일한 “공식적인”방법은 그것을 숨길 수 있습니다. 불행하게도, 그것은 바의 반 투명성을 제거합니다.
나는 배경 이미지를 원하지 않고 단지 색상을 원합니다.
다음과 같은 옵션이 있습니다.
-
단색, 반투명 없음 :
navigationBar.barTintColor = UIColor.redColor() navigationBar.isTranslucent = false navigationBar.setBackgroundImage(UIImage(), for: .default) navigationBar.shadowImage = UIImage()
-
색으로 채워진 작은 배경 이미지를 만들어 사용하십시오.
-
아래 설명 된 ‘hacky’방법을 사용하십시오. 또한 막대를 반투명하게 유지합니다.
바를 반투명하게 유지하는 방법?
반 투명성을 유지하려면 다른 접근 방식이 필요합니다. 해킹처럼 보이지만 잘 작동합니다. 제거하려는 그림자는 UIImageView
아래 의 헤어 라인 UINavigationBar
입니다. 필요한 경우 찾아서 숨기거나 표시 할 수 있습니다.
아래 지침에서는 UINavigationController
계층 구조의 한 컨트롤러에만 숨겨진 헤어 라인이 필요하다고 가정합니다 .
-
인스턴스 변수를 선언하십시오.
private var shadowImageView: UIImageView?
-
이 그림자 (헤어 라인)를 찾는 방법 추가
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 }
-
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"];
답변
견고한 탐색 막대 색상 만 사용하고 스토리 보드에서이를 설정하려면 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 NavigationBar).
그리고이 SO 질문을 확인하십시오 :
iOS7-UINavigationBar 테두리 색상 변경
답변
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
}
}
답변
빠른 방법 :
UINavigationBar.appearance().setBackgroundImage(
UIImage(),
forBarPosition: .Any,
barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()
답변
신속한 간단한 솔루션
let navigationBar = self.navigationController?.navigationBar
navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
navigationBar?.shadowImage = UIImage()