모든 탐색 모음 뒤로 버튼 제목을 제거하는 방법


81

UIViewController누르면 new에서 뒤로 버튼에 제목이 몇 개 있고 , 제목에 UIViewController글씨가 많으면 아이폰 4s에서는 잘 보이지 않아서 제거하고 싶습니다.

prepareForSegue함수에 코드를 추가 하면 문제가 될 것입니다.

이것을 달성하는 더 좋은 방법은?


뒤로 버튼의 제목을 변경할 수도 있습니다. 돌아가려면 뒤로 버튼이 필요합니다. 그래서 뒤로 버튼을 제거 할 필요가 없다고 생각합니다.
쇼크 Londhe

문제를 해결 한 후 알려주십시오.
쇼크 Londhe


이 문제에 대한 멋진 기사가 있습니다. sarunw.com/posts/…
user3672430

답변:


128

뒤로 화살표를 원하면 다음 코드를 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)

따라서 문제가 해결되었을 수 있습니다.

즐거운 코딩입니다.


8
setBackButtonTitlePositionAdjustment는 항상 작동하지 않습니다. 뒤로 버튼 제목이 매우 길지만 "뒤로"로 변경하기에 충분히 길지 않은 경우 중간의 제목이 오른쪽으로 이동합니다.
zgjie 2016-06-02

3
@zgjie 오프셋이 얼마나 큰지에 대한 주제입니다. 당신은 쉽게 '-6000'과 '-60'교체하고이 문제에 대해 잊을 수
slxl

9
여기에서 약간의 정밀도로 제목은 PREVIOUS 뷰 컨트롤러에 속합니다. 따라서 presentViewController 또는 pushViewController 메서드 전에 설정해야합니다.
Benjamin

1
음, 이것은 AppDelegate에서 작동하지 않습니다. "AppDelegate 유형의 값에 navigationItem 멤버가 없습니다."
Prabhu

3
@DominikBucher 앱의 모든 위치에서 뒤로 버튼 제목을 숨기는 카테고리를 만들었습니다.이 카테고리는 "해킹이 아님"방식 입니다. 프로젝트에 카테고리를 추가하기 만하면됩니다. setBackButtonTitlePositionAdjustment:forBarMetrics:사용자가 접근성 설정에서 버튼 모양을 활성화하면 모양이 추악한 탐색 모음으로 표시되는 위치를 설정하는 솔루션에 강력하게 동의하지 않습니다 .
Pratik Jamariya

71

작업은 Swift 3의 매력과 같습니다.

self.navigationController?.navigationBar.topItem?.title = " "

1
이것은 사용하는 경우 일 단 하나navigationController?.pushViewController(_, animated:)
D. 그렉

고마워, 친구 이것은 해결 된 유일한 사람이었습니다. 건배.
Felipe

3
나를 위해 일한도 스위프트 4
christijk

1
@MaksimKniazev, 그 문제에 대한 수정 사항이 있습니까? 에서 제목을 다시 업데이트하는 유일한 해결책을 찾았습니다 viewWillAppear:.
Hemang

4
이것은 이전보기의 제목을 제거
나세르 모하메드에게

50

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)

17
setBackButtonTitlePositionAdjustment는 항상 작동하지 않습니다. 뒤로 버튼 제목이 매우 길지만 "뒤로"로 변경하기에 충분히 길지 않은 경우 중간의 제목이 오른쪽으로 이동합니다.
zgjie 2016-06-02

이상적인 솔루션이 아닙니다. 왼쪽 탐색 모음 항목의 제목을 변경하지 않고 탐색 제목을 설정하면 왼쪽 탐색 모음 제목이 삽입되어 있으므로 제목이 오른쪽으로 이동합니다.
mathema

2
iOS 11에서는 뒤로 버튼 위치가 깨집니다. 원래 위치 아래로 떨어집니다
korgx9

어떻게 작동해야하나요? 텍스트는 여전히 VoiceOver를 통해 액세스 할 수 있습니다.
Lukasz Ciastko 2018

취소 imagepicker 또는 뭔가 제시했을 때의 barbuttonitem가 표시되지 않는 경우에 문제를 야기
누퍼 샤르마

16

다른 ViewController가 종속 된 부모 ViewController 로 이동하면 됩니다.

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}

15

이 코드를 복사하십시오. didFinishLaunchingWithOptions launchOptions

스위프트 5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

스위프트 4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

11

이건 간단하다. 뒤로 버튼의 제목에 공백을 넣고 준비하십시오. 텍스트를 제거하려는 이전보기에 있어야합니다.

여기에 이미지 설명 입력


최고의 솔루션 IMO. 텍스트 barbuttonitems를 사라지게하는 부작용이있을 수있는 특정 명확한 스타일로 전체 앱을 설정할 필요가 없습니다. 컨트롤러가 없다면 navigationItem을 컨트롤러로 드래그해야한다고 언급하면 ​​답변이 더 나아질 수 있습니다.
TheJeff

7

xcode 8 및 swift 3.0을 사용할 수 있습니다.

self.navigationController?.navigationBar.backItem?.title = " "

3
이렇게하면 이전 뷰 컨트롤러에서 제목이 모두 제거되지 않습니까?
NRitH

1
네, 모두의 제목 제거 ViewController에서 밀려들self.navigationController
예븐 두비 닌

7

UIViewController이 동작을 원하는 모든 에 대한 하위 클래스와 하위 클래스의 viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(
        title: "", style: .plain, target: nil, action: nil)
}

이렇게하면 코드를 복제하지 않고도 동작을 원하는 컨트롤러를 선택할 수 있습니다. 컨트롤러가 이전 컨트롤러의 제목보다 "뒤로"라고 말하는 것을 선호하므로 여기에서 제목을 설정했습니다.


6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

swift 3.0에서이 코드 줄을 사용했습니다.


1
(가) UISearchController에 대한 취소 버튼을 영향을줍니다
JAHelia

5

에서 영감을 촬영 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()
    }
}

이제이 내비게이션 컨트롤러와 바 조합을 사용할 때마다 뒤로 버튼 텍스트가 표시되지 않습니다! 🎉

참고 : 스토리 보드를 사용하는 경우에도 제대로 작동합니다. 사용자 지정 탐색 모음 구성 요소를보기에 놓으십시오.


정말 감사합니다! 이 :) 그것을 할 수있는 최선의 방법이며, 정확한 답해야한다
GameDev

3
내비게이션 항목 제목을 완전히 지우는 부작용이 있다는 것을 깨달았습니다. 따라서 이전보기가 표시되면 제목이 없습니다! 나는이 성가신 문제에 대한 완벽한 해결책을 찾기 위해 계속 노력할 것입니다.
Harry Bloom

젠장 당신 말이 맞아요. 나는 그것을 어떻게 놓칠 수 있습니까! 이 문제의 해결 방법을 찾으면 알려주세요. 감사
GameDev

@HarryBloom에서 완벽한 솔루션을 찾을 수 있습니까?
Hemang

@Hemang 완벽한 솔루션은 아니지만 작동하는 것을 찾았습니다. 여기에 두 번째 답변을 추가했습니다. stackoverflow.com/a/49094282/1532838
Harry Bloom

3

일반적으로 UIViewController의 viewDidLoad에서 뒤로 버튼을 추가하거나 변경합니다.

다음과 같이 작동합니다.

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

뷰를 닫기 위해 호출되는 함수를 변경하고 구현하는 것을 잊지 마십시오.

더 쉽게 제목을 변경하면됩니다.

self.navigationItem.leftBarButtonItem.title = "Back"

7
이로 인해 왼쪽에서 오른쪽으로 스 와이프하여 뒤로 이동하는 iOS의 내장 지원이 중단되며,이를 중단하는 앱인 IMHO는 정말 짜증납니다.
NRitH

2

스위프트 3 :

self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)

2

여기에 두 번째 답변을 추가하면 첫 번째가 부분적으로 만 작동합니다. 이 메서드는 응용 프로그램의 각 뷰에서 메서드를 호출해야한다는 점에서 덜 우아하지만 부작용없이 작동합니다.

따라서 먼저 뒤로 버튼 텍스트를 제거하고 사용자 정의 뒤로 버튼을 추가하는 함수가있는 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필요한 각 뷰 컨트롤러 에서이 함수를 간단히 호출 할 수 있습니다 .


2

간단한 솔루션 :

첫 번째 컨트롤러에서 두 번째 컨트롤러를 푸시하는 동안 첫 번째 컨트롤러의 viewWillDisappearself.navigationItem.title = "" 를 입력 합니다. 두 번째 컨트롤러에서 뒤로 버튼 제목을 숨 깁니다.

위의 문구는 첫 번째 컨트롤러 제목을 숨기므로 다시 돌아 왔을 때 첫 번째 컨트롤러의 제목을 원합니다. 이를 위해 첫 번째 컨트롤러의 viewWillAppear 메서드에서 첫 번째 컨트롤러에 대한 제목추가했습니다 .

다음 방법 참조 (첫 번째 컨트롤러)

    override func viewWillDisappear(_ animated: Bool) {
    self.navigationItem.title = ""
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}

2

스위프트 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

취소 imagepicker의 완료 버튼이 방법에 사라된다
누퍼 샤르마

2

Swift 4.2에 대한 업데이트 된 답변

작업 UIAppearance은 문제를 더 깔끔하게 해결하는 방법이지만 모든 UIBarButtonItem사용자가 명확한 텍스트를 갖게됩니다. 이 솔루션의 개선 된 버전이 있는지 확인하는 수 UIBarButtonItem에 포함되어 있습니다 UINavigationBar.

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

1

Swift 5 에서 작동합니다 .

        self.navigationItem.backBarButtonItem?.title = ""

디스플레이의 현재 뷰 컨트롤러가 아닌 다음 푸시 된 뷰 컨트롤러에 효과적이므로 매우 혼란 스럽습니다!

또한 스토리 보드를 확인하고 이전 뷰 컨트롤러 의 탐색 항목을 선택한 다음 뒤로 버튼 (Inspector)에 무언가를 입력합니다 .


1

다른 뷰 컨트롤러에서 유사한 코드를 복제하거나 방법을 사용하고 싶지 않은 사람들을위한 간단한 솔루션이 있습니다.

뒤로 버튼 제목을 제거하려면 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
    }
}

0

이유는 모르겠지만 iPhone plus에서 뒤로 버튼 제목을 숨기는 데 문제가 있지만 plus가없는 기기에서는 올바르게 표시됩니다.

leftBarButtonItem.title = ""

그래서 간단한 방법을 찾았습니다. Autolayout에서 NavigationViewController의 NavigationBar에서 지워지는 색조 색상으로 설정됩니다. 색조가있는 아이콘이나 텍스트 타일을 사용하면 문제가 될 수 있습니다. 그러나 제 경우에는 그것을 전부 사용하지 않습니다.


0

이것을 사용하십시오 :

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

0

이 확장을 UIViewController에 추가 한 다음 모든 viewDidLoad ()에서이 함수를 다음과 같이 호출 할 수 있습니다. self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

0

저에게 맞는 솔루션을 공유하고 싶습니다. 또한 필요와 요구 사항에 따라 조정할 수 있습니다.

제 경우에는 스토리 보드를 사용하여 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()
    }
}

0

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)

이렇게하면 뒤로 표시 줄 단추 텍스트가 숨겨 지지만 안타깝게도 탐색 표시 줄 제목이 중앙에 표시되지 않습니다
Giorgio

0

Swift 4.2 및 5

나중에 코드에서 이미지 선택기를 사용하는 경우 부작용이있는 탐색 모음 색조 색상을 사용하는 대신.

아래 코드를 사용하십시오.

extension UIViewController {
        open override func awakeFromNib() {
            navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }  
}

첫 번째 ViewController에서 호출하십시오.

self.awakeFromNib()

0

신속한 4,5

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

0

단지의 확장 만들 UIViewController오버라이드 기능 awakeFromNib()과 메이크업을 UIBarButtonItem빈 제목과에 제공 navigation backBarButtonItem.

extension UIViewController {

  open override func awakeFromNib() {
    let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarBtnItem
  }

}

0

아래 코드를 입력하면 UIViewcontroller extension모든 UIViewcontroller뒷면 텍스트 가 숨겨집니다.

open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }

0

viewDidLoad()

    let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarButtonItem

0

간단한 해결책을 찾았습니다.

PersingtingViewController's viewWillDisappearjsut put 방법 에서

self.title = ""

및 설정 title에 대한 PersingtingViewController's에 대한 viewWillAppear방법. 그리고 마지막 viewControllersnavigationStack제외한 모든 것에 대해 이것을 반복하십시오 .


0

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.