UINavigation 컨트롤러에서 뒤로 버튼 텍스트를 숨기려면 어떻게해야합니까? "<뒤로"가 아닌 "<"만 표시됩니다.
UINavigation 컨트롤러에서 뒤로 버튼 텍스트를 숨기려면 어떻게해야합니까? "<뒤로"가 아닌 "<"만 표시됩니다.
답변:
인터페이스 빌더 에서 이전 컨트롤러의 탐색 항목을 선택 Back Button
하고 뒤로 버튼을 표시 할 문자열로 변경할 수 있습니다. 예를 들어 공백을 원하면 공백을 넣으십시오.
다음 코드 줄로 변경할 수도 있습니다 .
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
또는 Swift에서 :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
IB에 이미 공백이있는 경우 탑승 할 공간을 추가 Back
하고 화살표 만 표시하면됩니다.
스토리 보드를 통해서도 가능합니다. 이전 컨트롤러 탐색 항목의 속성 검사기에서 에서 뒤로 버튼 필드에 ""를 설정할 수 있습니다. 아래 이미지를 참조하십시오. "여기에 제목"을 ""로 바꿉니다. 이렇게하면 원하는 결과를 얻을 수 있습니다. 더 이상 '제목'을 엉망으로 만들 필요가 없습니다.
프로그래밍 방식으로 사용할 수 있습니다.
[self.navigationItem.backBarButtonItem setTitle:@" "];
여기서 self 는 원하는 뷰 컨트롤러를 푸시하는 컨트롤러를 나타냅니다.
탐색 모음 이전, 이후 샘플
전에
후
backBarButtonItem
프로그래밍 방식으로 설정이 작동하지 않지만 스토리 보드를 통해 설정하면 작동합니다.
다음 UINavigationControllerDelegate
과 같이 구현할 수 있습니다 .
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem
이다 nil
기본적으로 당신은 단지 모든 컨트롤러로 설정 있도록 다음, 컨트롤러를 밀어 영향을
뒤로 버튼의 제목을로 설정 @""
하거나 nil
작동하지 않습니다. 전체 버튼을 비워 두어야합니다 (제목이나 이미지 제외).
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
이 작업은 탐색 스택의 뷰 컨트롤러 상단에있는 뷰 컨트롤러에서 수행해야합니다 (즉, pushViewController
메서드 를 통해 VC로 이동하는 위치에서 ).
뷰 컨트롤러가 많은 상황에서이 문제에 대한 또 다른 해결책은 UIAppearance
프록시를 사용하여 다음과 같이 뒤로 버튼 제목 텍스트를 효과적으로 숨기는 것입니다.
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
이 솔루션은 뒤로 버튼 제목을 수동으로 설정하는 것과 유사하게 텍스트를 작은 명확한 점으로 렌더링합니다. @" "
모든 탐색 모음 버튼에 영향을 준다는 점을 제외하고 합니다.
모든 탐색 모음 버튼에 영향을 미치기 때문에이 문제에 대한 일반적인 해결책은 아닙니다. 제목 을 숨길 때가 아니라 버튼 제목 을 표시 할 때를 선택할 수 있도록 패러다임을 뒤집습니다 .
제목을 표시 할시기를 선택하려면 필요에 따라 제목 텍스트 속성을 수동으로 복원하거나 UIBarButtonItem
동일한 작업을 수행 하는 특수 하위 클래스를 만듭니다 (잠재적으로 다른 UIAppearance
프록시 사용).
대부분의 뒤로 버튼 제목을 숨겨야하는 앱이 있고 탐색 버튼 중 일부 (또는 아예 없음) 만 제목이있는 시스템 버튼 인 경우 이것이 적합 할 수 있습니다!
(참고 : 긴 제목으로 인해 중앙 탐색 모음 제목이 이동하지 않도록하려면 텍스트 색상이 명확하더라도 글꼴 크기를 변경해야합니다.)
viewDidLoad 또는 loadView에 다음 코드를 추가합니다.
self.navigationController.navigationBar.topItem.title = @"";
iOS 9가 설치된 iPhone 및 iPad에서 테스트했습니다.
이 Objective-C 카테고리를 추가하여 내비게이션 컨트롤러에 의해 생성 된 모든 "뒤로"버튼에 텍스트가 없도록 할 수 있습니다. 방금 AppDelegate.m 파일에 추가했습니다.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
추신-(이 확장 기능을 Swift와 함께 사용하는 방법을 모르겠습니다. 이상한 오류가 발생했습니다. Swift 버전 추가를 환영합니다.)
override
신속하게 처리 하는 방법 . 매우 흥미로운 질문
위아래로 시도했지만 작동하지 않았습니다. 이것은 나를 위해 일했습니다.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
부작용없이 작동하는 유일한 방법은 사용자 지정 뒤로 버튼을 만드는 것입니다. 사용자 지정 동작을 제공하지 않는 한 슬라이드 제스처도 작동합니다.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
안타깝게도의 모든 뒤로 버튼에 제목이 없도록하려면 모든 뷰 컨트롤러에서이 맞춤 뒤로 버튼을 설정해야합니다.
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
공백 문자열이 아닌 제목으로 공백을 설정하는 것이 매우 중요합니다.
프로그래밍 방식으로 뒤로 버튼에서 텍스트를 제거하려면 코드 아래에서 사용하면 xcode7 이상에서 작동합니다.
self.navigationController.navigationBar.topItem.title = @ "";
또는
스토리 보드에서 수동으로보기 컨트롤러의 탐색 모음을 선택하고 뒤로 단추 텍스트에 ""를 입력합니다.
작동합니다. 감사
self.navigationController?.navigationBar.topItem?.title = " "
Xcode 9에서 일했습니다!
현재 답변은 작동하지 않았습니다. 제목 을 제거하고 싶었습니다. 완전히 "뒤로"라는 텍스트는 사라지지 않았습니다.
이전 뷰 컨트롤러로 돌아가서 제목 속성을 설정합니다.
self.title = @" ";
이전 View Controller에 제목이 없을 때만 작동합니다.
@""
.
다른 방법-사용자 정의 NavigationBar 클래스를 사용하십시오.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
즉, 이것은 전체 프로젝트 제목을 제거합니다. UINavigationController에 대한 사용자 정의 클래스를 설정하십시오.
NavigationController
재정의 하는 사용자 지정 사용pushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
이미 많은 답변이 있습니다. 여기에 주제에 대한 2 센트가 있습니다. 이 접근 방식이 정말 강력하다는 것을 알았습니다. segue 전에 이것을 viewController에 넣어야합니다.
스위프트 4 :
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
이 게시물에서 모든 것을 시도했습니다. 유일한 해결책은 @VoidLess의
여기에 같은 대답이지만 더 완벽합니다.
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
이것은 iOS11에 대한 내 해상도이며 applicationDidFinishLaunchingWithOptions에서 UIBarButtonItem의 모양을 변경합니다.
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Y 오프셋은 iOS11에서도 백바 버튼의 위치를 변경하므로 변경할 수 없지만 iOS10 이하에서는 괜찮습니다.
Swift3에서는
글로벌 설정을하는 경우
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Swift 3.1 UINavigationController의 delegate 메소드를 구현하여이를 수행 할 수 있습니다.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
뒤로 버튼 제목을 전체적으로 숨기려는 사람들을 위해.
당신은 스위 즐링 (swizzle) 수 viewDidLoad
의 UIViewController
이 같은.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
용법:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
iOS 13 이상을 대상으로 하는 경우이 새로운 API 를 사용 하여 전체적으로 뒤로 버튼 제목 을 숨길 수 있습니다 .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
커스텀 내비게이션 컨트롤러가 있었기 때문에이 문제로 어려움을 겪었습니다. 내 사용자 지정 탐색 컨트롤러 클래스에서이 코드를 사용하여 모든 뷰 컨트롤러에서 뒤로 항목 텍스트를 제거 할 수있었습니다.
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
이렇게하면이 사용자 지정 탐색 컨트롤러를 사용하여 뒤로 항목 제목이 모두 제거됩니다.
iOS 11에서 UIBarButtonItem
모양의 텍스트 글꼴 / 색상을 매우 작은 값 또는 명확한 색상으로 설정하면 다른 막대 항목이 사라지는 것을 발견했습니다 (시스템이 더 이상 UIBarButton 항목의 클래스를 따르지 않고으로 변환 됨 _UIModernBarButton
). 또한 뒷면 텍스트의 오프셋을 오프 스크린으로 설정하면 대화 형 팝 중에 플래시가 발생합니다.
그래서 우리는 addSubView
:
+ (void)load {
if (@available(iOS 11, *)) {
[NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
}
}
- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
view.alpha = 0;
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (id)view;
[button setTitle:@" " forState:UIControlStateNormal];
}
[self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}
백 텍스트는 지난보기 컨트롤러의 출신 navigationItem.title
과 navigationItem.title
를 automaticly에 의해 설정된다 self.title
. 문제를 해결하는 쉬운 방법은 후크입니다 setTitle:
.navigationItem.title = @""
이 코드를 넣으면 AppDelegate.m
괜찮습니다。
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
자세한 내용은 https://www.jianshu.com/p/071bc50f1475(Simple Chinease)에서
내 솔루션 :-XCode : 10.2.1-Swift : 5
XCode 11.5 스위프트 5
사용자 정의 뒤로 버튼이 필요하지 않은 경우 프로그래밍 방식으로 수행하는 매우 간단한 방법은 아마도 약간의 해키가 있지만 다음과 같이 호출하여 스택에 푸시하는 뷰 컨트롤러에서 글꼴 크기를 0으로 설정하는 것입니다. viewDidLoad에서
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
마침내 전체 앱에서 기본 백 텍스트를 숨기는 완벽한 솔루션을 찾았습니다.
투명한 이미지 하나를 추가하고 AppDelegate에 다음 코드를 추가하기 만하면됩니다.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
다음 방법은 iOS 11에서 작동하며 다른 iOS 버전에서 충돌하지 않는 것이 안전합니다. 이렇게하면 UIModernBarButton 및 UIBackButtonContainerView가 모두 비공개 API이기 때문에 앱 스토어 검토에서 앱이 거부 될 수 있습니다. AppDelegate에 배치합니다.
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Swift 버전은 전 세계적으로 완벽하게 작동합니다.
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
return true
}
solution
. @limfinity가 지적했듯이,이 앱을 통해 모든 UIBarButtonItem의를 위해 보편적으로 변경됩니다