[iOS] 신속하게 navigationBar의 테두리를 제거하는 방법은 무엇입니까?
문제는 다음 두 줄에 있습니다.
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()
-------------------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)
-------------------이렇게하면 그림자 이미지가 모두 제거됩니다.
for parent in self.navigationController!.navigationBar.subviews {
for childView in parent.subviews {
if(childView is UIImageView) {
childView.removeFromSuperview()
}
}
}
-------------------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
}
}
-------------------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()
on the line은 iOS 10에서 작동하지 않으므로 알파를 0으로 설정하여이 통화가 모든 곳에서 호환됩니다.
Swift 3+의 UINavigationBar에서 테두리를 제거하려면 다음을 사용하십시오.
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
-------------------let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()
-------------------신속한 3
의 viewDidLoad
방법
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
-------------------이것 만이 나를 위해 일했습니다.
self.navigationController?.navigationBar.shadowImage = UIImage()
Ref
-------------------누군가 궁금해하는 경우 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는 뷰가 사라지는 것을 좋아하지 않습니다.
-------------------받아 들인 대답은 나를 위해 일했지만 뒤로 튀거나 다른 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
평화!
-------------------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
}
-------------------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()
-------------------사용자 정의 navigationController에 다음 줄을 추가하십시오.
self.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.layoutIfNeeded()
중요 사항
첫 번째 줄인 viewDidLoad () 메서드를 사용하는 경우 마지막 줄이 중요합니다. navigationController는 탐색 모음을 다시 그려야하기 때문이지만 탐색 모음을 그리기 전에 viewWillAppear () 메서드에서 layoutIfNeeded ()없이 쉽게 사용할 수 있습니다.
-------------------경계선은 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 %의 사람들에게 도움이 될 것입니다.
-------------------이것은 Nate Cook 답변의 신속한 3 기반의 답변입니다.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
-------------------iOS 11 및 Swift 4 테두리를 제거하고 싶지만 navigitonbar를 반투명하게 만들지 않으려면 다음을 시도해야합니다.
self.navigationBar.shadowImage = UIImage()
출처
https://stackoverflow.com/questions/39919993