Nice programing

아이콘을 유지하면서 뒤로 버튼에서 텍스트 제거

nicepro 2020. 11. 2. 19:40
반응형

아이콘을 유지하면서 뒤로 버튼에서 텍스트 제거


뒤로 버튼에서 텍스트를 제거하고 싶지만 아이콘은 유지하고 싶습니다. 나는 시도했다

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

그러나 이렇게하면 텍스트와 아이콘이 완전히 제거됩니다.


@ rmd2의 방법은 거의 옳지 만 대신 뒤로 버튼이 가리키는 컨트롤러의 탐색 모음을 선택 " "하고 뒤로 버튼 필드에 입력해야 합니다.

여기에 이미지 설명 입력


이미 답이 있다는 것을 알고 있지만 코드로도 할 수 있습니다 (펜촉으로 작업하는 경우)

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

첫 번째 뷰 컨트롤러에 위를 추가하십시오.

푸시하는 각 뷰 컨트롤러에 대해이 작업을 수행해야합니다. 따라서 3 개의 뷰 컨트롤러가 있고 이들 모두에서 백 텍스트를 제거하려면 뷰 컨트롤러 1과 2에 줄을 추가해야합니다.


당신이 밀어 뷰 컨트롤러에서 뒤로 버튼의 제목을 제거하고 싶다면,의 말을하자 <Settings<subSettingsViewController에서 다음 설정했습니다 backBarButtonItem의 SettingsViewController의에서 제목을 viewWillDisappear () 방법.

목표 -C :

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}

빠른:

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

뒤로 버튼의 텍스트는 마스터보기의 제목에 따라 다릅니다.

요령은 마스터 뷰가 사라지면 제목을 지우고 다시 표시되면 다시 설정하는 것입니다.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "
}

override func viewWillAppear(_ animated: Bool) {

    super.viewWillAppear(animated)
    self.navigationItem.title = "My Title"
}

제 경우에는 사용자 정의 아이콘과 제목에 대해 이것이 트릭을 수행했습니다 (Swift 4).

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

뒤로 화살표를 원하면 다음 코드를 AppDelegate 파일에 didFinishLaunchingWithOptions 메서드에 넣습니다.

Swift 용

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

많이 검색 한 후 가장 좋고 간단한 해결책을 찾았습니다. 이것은 Swift 4.2로 작성된 모든 viewController에 영향을 미칩니다.

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

이전 ViewController의 StoryBoard Title에 ""를 추가하여이 문제를 해결했습니다. 공백이 아닌 단지 공백; D

여기에 이미지 설명 입력


마침내 완벽한 솔루션을 찾았습니다.

투명한 이미지 하나를 추가하고 AppDelegate에 다음 코드를 추가하기 만하면됩니다.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

들어 스위프트 4+ 이 줄을 넣어 AppDelegate에서didFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

신속한 4

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

ViewControllerA가 있고 ViewControllerB로 이동하려면 ViewControllerA에서 현재 navigationItem을 새 UIBarButtonItem으로 설정하고 제목을 공백이있는 문자열로 설정 한 후 다른보기 컨트롤러로 푸시해야합니다.

제목을 공백이있는 문자열로 설정하십시오. 기본값이 nil이므로 nil 또는 ""(빈 문자열)를 설정할 수 없습니다.

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) {

    // Your code
}

탐색 컨트롤러 스택의 모든 뷰 컨트롤러에서 제거하려면 :

UINavigationController 하위 클래스를 만들고 다음을 추가합니다.

override func show(_ vc: UIViewController, sender: Any?) {
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)
}

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    setEmptyBackButton(viewController)
    super.pushViewController(viewController, animated: animated)
}

func setEmptyBackButton(_ viewController: UIViewController) {
    viewController.navigationItem.backBarButtonItem =
        UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

이 코드를 각 VC에 넣으십시오.

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

제목이 긴 경우 제목 색상 만 변경하는 경우가 있습니다. 탐색 모음 제목이 왼쪽으로 이동할 수 있기 때문입니다. 따라서이를 방지하려면 바 버튼 제목을 투명하게 만드는 것 외에도 가로로 이동해야 할 수 있습니다.

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

나를 위해 이것은 트릭을했습니다.

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

backBarButtonItem 을 수정하지 않고 제목 만 설정하면 작동하는 것처럼 보입니다 . 그러나 제스처를 사용하여 돌아 가려고 시도하고 취소 하고 푸시 된 뷰 컨트롤러에 머무르면 뒤로 제목이 다시 표시됩니다.

Swift 4 에서 작업하기


뒤로 버튼이 가리키는 컨트롤러의 탐색 모음을 선택하고 뒤로 버튼 필드에 ""를 입력해야합니다.

예를 들어 A 컨트롤러를 B 컨트롤러로 밀어 넣는 경우 A 컨트롤러 탐색 모음에 공백을 넣으십시오.


Xcode 10, Swift 4+

여기에있는 다른 사람들과 비슷한 대답이지만 텍스트가 여전히 지워지지 않으면 Space를 클릭 한 다음 Enter를 클릭해야한다는 점에 주목할 가치가 있습니다.

여기에 이미지 설명 입력


Swift가있는 Xcode 9.2에서는 다음과 같이 작동했습니다.

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

이전 뷰 컨트롤러를 전혀 제어 할 수없는 경우 (즉, 프레임 워크에서 작업하는 경우) 다음과 같이 뒤로 버튼의 제목을 삭제할 수 있습니다.

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

이 기능은 탐색 스택의 마지막 항목으로 이동하여 뒷면 제목을 삭제합니다. 뷰 컨트롤러가 나타날 때 원본을 저장하십시오.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...
}

그런 다음 앱의 일부를 중단하지 않도록 다시 할당합니다.

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}

이렇게하면 문제가 해결됩니다.

    import UIKit

    extension UINavigationController{

    func customizeBackArrow(){
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    }
}

몇 가지 답변을 시도했지만 모든 경우에 작동하도록 할 수는 없습니다. 따라서 이것은 설정된 경우 탐색 모음의 제목에 영향을주지 않는 해결 방법입니다.

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }

세부

  • Xcode 버전 10.2.1 (10E1001), Swift 5

해결책

1. UINavigationController의 사용자 지정 클래스 만들기

import UIKit

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

2. UIViewController 확장 추가

import UIKit

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

3. ViewController 클래스 업데이트

import UIKit

class ViewController: UIViewController {
    override var navigationItemBackButtonTextIsHidden: Bool { return true }
}

전체 샘플

import UIKit

// MARK: - ViewController

class ViewController: UIViewController {

    var screenCounter = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationItem()
    }

    override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}

extension ViewController {

    private func setupNavigationItem() {
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    }

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
        guard let navigationController = navigationController else { return }
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    }
}

// MARK: - NavigationController

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

// MARK: - UIViewController extension

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

결과

여기에 이미지 설명 입력


Appdelegate의 didFinishLaunchingWithOptions 함수에서이 코드를 사용했습니다.

if #available(iOS 11, *) {
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .highlighted)
        } else {
            UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0,
                                                                                           -60), for:UIBarMetrics.default)
        }

이것은 나를 위해 일하고 있습니다

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

참고 URL : https://stackoverflow.com/questions/33025239/remove-text-from-back-button-keeping-the-icon

반응형

'Nice programing' 카테고리의 다른 글

만드는 방법  (0) 2020.11.03
SQL 다중 결합 문  (0) 2020.11.03
PHP Composer가 왜 그렇게 느린가요?  (0) 2020.11.02
INTENT 인터넷 연결 확인  (0) 2020.11.02
Java 컴파일 속도 대 Scala 컴파일 속도  (0) 2020.11.02