를 UIViewController
누르면 new에서 뒤로 버튼에 제목이 몇 개 있고 , 제목에 UIViewController
글씨가 많으면 아이폰 4s에서는 잘 보이지 않아서 제거하고 싶습니다.
prepareForSegue
함수에 코드를 추가 하면 문제가 될 것입니다.
이것을 달성하는 더 좋은 방법은?
를 UIViewController
누르면 new에서 뒤로 버튼에 제목이 몇 개 있고 , 제목에 UIViewController
글씨가 많으면 아이폰 4s에서는 잘 보이지 않아서 제거하고 싶습니다.
prepareForSegue
함수에 코드를 추가 하면 문제가 될 것입니다.
이것을 달성하는 더 좋은 방법은?
답변:
뒤로 화살표를 원하면 다음 코드를 AppDelegate
파일에 넣습니다 didFinishLaunchingWithOptions
.
For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
다른 옵션은 아래에 제공됩니다.
에 Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
에 Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
업데이트 :
let BarButtonItemAppearance = UIBarButtonItem.appearance()
let attributes: [NSAttributedStringKey: Any] = [
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
SWIFT 4.1 업데이트 :
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
오프셋 사용
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
따라서 문제가 해결되었을 수 있습니다.
즐거운 코딩입니다.
setBackButtonTitlePositionAdjustment
는 항상 작동하지 않습니다. 뒤로 버튼 제목이 매우 길지만 "뒤로"로 변경하기에 충분히 길지 않은 경우 중간의 제목이 오른쪽으로 이동합니다.
setBackButtonTitlePositionAdjustment:forBarMetrics:
사용자가 접근성 설정에서 버튼 모양을 활성화하면 모양이 추악한 탐색 모음으로 표시되는 위치를 설정하는 솔루션에 강력하게 동의하지 않습니다 .
작업은 Swift 3의 매력과 같습니다.
self.navigationController?.navigationBar.topItem?.title = " "
navigationController?.pushViewController(_, animated:)
viewWillAppear:
.
backbutton을 제거하기 위해 메서드 에 AppDelegate
파일 의이 코드 줄을 사용 didFinishLaunchingWithOptions
하고 title
있습니다.
스위프트 2.x
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)
스위프트 3.x
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
스위프트 4.x
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
setBackButtonTitlePositionAdjustment
는 항상 작동하지 않습니다. 뒤로 버튼 제목이 매우 길지만 "뒤로"로 변경하기에 충분히 길지 않은 경우 중간의 제목이 오른쪽으로 이동합니다.
이 코드를 복사하십시오. didFinishLaunchingWithOptions launchOptions
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
UIViewController
이 동작을 원하는 모든 에 대한 하위 클래스와 하위 클래스의 viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(
title: "", style: .plain, target: nil, action: nil)
}
이렇게하면 코드를 복제하지 않고도 동작을 원하는 컨트롤러를 선택할 수 있습니다. 컨트롤러가 이전 컨트롤러의 제목보다 "뒤로"라고 말하는 것을 선호하므로 여기에서 제목을 설정했습니다.
에서 영감을 촬영 rordulu의 대답은 여기 까다로운 문제의 모든 경우를 처리하는 것으로 보이는 사용자 지정 UINavigationController 및 UINavigation 막대를 만들었습니다.
1) UINavigationController
사용자 정의로 새로 초기화 하십시오 UINavigationBar
.
class CustomNavigationController: UINavigationController {
convenience init() {
self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
}
}
2) backItem.title
뷰가 레이아웃 될 때마다 탐색 모음 의 속성을 빈 문자열로 설정합니다.
class CustomNavigationBar: UINavigationBar {
override func layoutSubviews() {
backItem?.title = ""
super.layoutSubviews()
}
}
이제이 내비게이션 컨트롤러와 바 조합을 사용할 때마다 뒤로 버튼 텍스트가 표시되지 않습니다! 🎉
참고 : 스토리 보드를 사용하는 경우에도 제대로 작동합니다. 사용자 지정 탐색 모음 구성 요소를보기에 놓으십시오.
일반적으로 UIViewController의 viewDidLoad에서 뒤로 버튼을 추가하거나 변경합니다.
다음과 같이 작동합니다.
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton
뷰를 닫기 위해 호출되는 함수를 변경하고 구현하는 것을 잊지 마십시오.
더 쉽게 제목을 변경하면됩니다.
self.navigationItem.leftBarButtonItem.title = "Back"
여기에 두 번째 답변을 추가하면 첫 번째가 부분적으로 만 작동합니다. 이 메서드는 응용 프로그램의 각 뷰에서 메서드를 호출해야한다는 점에서 덜 우아하지만 부작용없이 작동합니다.
따라서 먼저 뒤로 버튼 텍스트를 제거하고 사용자 정의 뒤로 버튼을 추가하는 함수가있는 UIViewController 확장 클래스를 만듭니다.
extension UIViewController {
func setBackButton() {
navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
둘째, viewDidLoad
필요한 각 뷰 컨트롤러 에서이 함수를 간단히 호출 할 수 있습니다 .
간단한 솔루션 :
첫 번째 컨트롤러에서 두 번째 컨트롤러를 푸시하는 동안 첫 번째 컨트롤러의 viewWillDisappear 에 self.navigationItem.title = "" 를 입력 합니다. 두 번째 컨트롤러에서 뒤로 버튼 제목을 숨 깁니다.
위의 문구는 첫 번째 컨트롤러 제목을 숨기므로 다시 돌아 왔을 때 첫 번째 컨트롤러의 제목을 원합니다. 이를 위해 첫 번째 컨트롤러의 viewWillAppear 메서드에서 첫 번째 컨트롤러에 대한 제목 을 추가했습니다 .
다음 방법 참조 (첫 번째 컨트롤러)
override func viewWillDisappear(_ animated: Bool) {
self.navigationItem.title = ""
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.title = "Title"
}
Swift 4.2에 대한 업데이트 된 답변
작업 UIAppearance
은 문제를 더 깔끔하게 해결하는 방법이지만 모든 UIBarButtonItem
사용자가 명확한 텍스트를 갖게됩니다. 이 솔루션의 개선 된 버전이 있는지 확인하는 수 UIBarButtonItem
에 포함되어 있습니다 UINavigationBar
.
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
다른 뷰 컨트롤러에서 유사한 코드를 복제하거나 방법을 사용하고 싶지 않은 사람들을위한 간단한 솔루션이 있습니다.
뒤로 버튼 제목을 제거하려면 UINavigationController 하위 클래스를 만들고 pushViewController (_, animated :) 메서드를 재정의합니다.
final class CustomNavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
let backBarButtonItem = UIBarButtonItem()
backBarButtonItem.title = nil
viewController.navigationItem.backBarButtonItem = backBarButtonItem
}
}
이것을 사용하십시오 :
func removeBackButton(vc:UIViewController) {
let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named:""), for: .normal)
let leftBarButton = UIBarButtonItem.init(customView: button)
vc.navigationItem.leftBarButtonItem = leftBarButton
}
따라서 viewDidLoad에서이 메서드를 호출합니다.
override func viewDidLoad() {
super.viewDidLoad()
removeBackButton(vc:self)
}
이 확장을 UIViewController에 추가 한 다음 모든 viewDidLoad ()에서이 함수를 다음과 같이 호출 할 수 있습니다. self.updateBackButton ()
extension UIViewController {
func updateBackButton(){
if self.navigationController != nil {
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
}
}}
저에게 맞는 솔루션을 공유하고 싶습니다. 또한 필요와 요구 사항에 따라 조정할 수 있습니다.
제 경우에는 스토리 보드를 사용하여 CustomNavigationBar를 지정합니다.
스위프트 4.2
class CustomNavigationBar: UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
guard let topItem = topItem else { return }
removeBackButtonTitle(for: topItem)
}
override func pushItem(_ item: UINavigationItem, animated: Bool) {
removeBackButtonTitle(for: item)
super.pushItem(item, animated: animated)
}
func removeBackButtonTitle(for item: UINavigationItem) {
item.backBarButtonItem = UIBarButtonItem()
}
}
Swift 4.2에서 작동
AppDelegate
파일 의 코드 줄을 사용하여didFinishLaunchingWithOptions
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
Swift 4.2 및 5
나중에 코드에서 이미지 선택기를 사용하는 경우 부작용이있는 탐색 모음 색조 색상을 사용하는 대신.
아래 코드를 사용하십시오.
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
첫 번째 ViewController에서 호출하십시오.
self.awakeFromNib()
단지의 확장 만들 UIViewController
오버라이드 기능 awakeFromNib()
과 메이크업을 UIBarButtonItem
빈 제목과에 제공 navigation backBarButtonItem
.
extension UIViewController {
open override func awakeFromNib() {
let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backBarBtnItem
}
}
iOS 14에서는 이제 클래스에 backButtonDisplayMode
속성이 UINavigationItem
있습니다. 따라서 뒤로 버튼 제목을 제거하려면
navigationItem.backButtonDisplayMode = .minimal
viewDidLoad
제거하려는 viewController 의 기능에서.
모든 navigationBar에서 제거하기 위해 회전 기법을 사용했습니다.
import UIKit
private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
extension UIViewController {
static func swizzle() {
let originalSelector1 = #selector(viewDidLoad)
let swizzledSelector1 = #selector(swizzled_viewDidLoad)
swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
}
@objc open func swizzled_viewDidLoad() {
if let _ = navigationController {
if #available(iOS 14.0, *) {
navigationItem.backButtonDisplayMode = .minimal
} else {
// Fallback on earlier versions
navigationItem.backButtonTitle = ""
}
}
swizzled_viewDidLoad()
}
}
그리고 application(_:didFinishLaunchingWithOptions:)
전화
UIViewController.swizzle()