제목없는 UINavigationBar 사용자 정의 뒤로 버튼
제목없이 iOS 7 이상에서 탐색 뒤로 버튼을 어떻게 사용자 정의 할 수 있습니까? (화살표 만)
self.navigationItem.leftBarButtonItem = self.editButtonItem;
나는 그들이 self.backButtonItem을 가지고 있는지 궁금합니다.
또는
이 같은?
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemBACK
target:self action:@selector(back)];
실제로는 매우 쉽습니다. 여기 내가하는 일이 있습니다.
목표 C
// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
스위프트 2
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
스위프트 3
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
이 행을 스택으로 밀고있는 뷰 컨트롤러 ( 이전 뷰 컨트롤러 )에 넣습니다 . 새로 푸시 된 뷰 컨트롤러 뒤로 버튼은 이제 initWithTitle에 넣은 모든 것을 보여줍니다 (이 경우 빈 문자열).
iOS 단일 화살표로 뒤로 버튼을 만드는 쉬운 방법을 찾았습니다.
네비게이션 컨트롤러가 ViewB에서 ViewA로 이동한다고 가정 해 봅시다. IB에서 ViewA의 탐색 모음을 선택하면 제목, 프롬프트 및 뒤로 버튼 옵션이 표시됩니다.
ViewA 탐색 모음 옵션

트릭은 이전 보기 컨트롤러 (보기 A) 의 옵션에서 운명보기 컨트롤러 뒤로 버튼 제목 (ViewB)을 선택하는 것입니다 . "뒤로 단추"옵션을 채우지 않으면 iOS는 이전 보기 컨트롤러의 제목 과 함께 제목을 "뒤로"자동으로 넣습니다 . 따라서이 옵션을 단일 공백으로 채워야합니다.
"뒤로 단추"옵션으로 공간 채우기

결과:

그냥 이미지를 사용하십시오!
OBJ-C :
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
style:UIBarButtonItemStylePlain
target:self.navigationController
action:@selector(popViewControllerAnimated:)];
self.navigationItem.leftBarButtonItem = backButton;
}
스위프트 4 :
let backBTN = UIBarButtonItem(image: UIImage(named: "Back"),
style: .plain,
target: navigationController,
action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self
Icon-Back.png
Icon-Back@2x.png
Icon-Back@3x.png

iOS7에는 새로운 인터페이스 규칙이 있으므로 UIView를 누를 때 최소한 뒤로 화살표를 유지하는 것이 좋습니다. 프로그래밍 방식으로 "뒤로"텍스트를 변경하는 것은 매우 쉽습니다. 보기를 푸시하기 전에이 코드를 추가하십시오 (StoryBoards를 사용중인 경우에는 PreparingForSegue).
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}
기본 "뒤로"텍스트가 변경되지만 iOS7 스타일의 뒤로 화살표는 유지됩니다. 보기를 누르기 전에 뒤로 화살표의 색조 색상을 변경할 수도 있습니다.
- (void)viewDidLoad{
//NavBar background color:
self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}
이것이 도움이 되길 바랍니다!
할 일이 많지 않습니다. 스토리 보드 자체를 통해 동일한 결과를 얻을 수 있습니다.
루트 내비게이션 컨트롤러로 이동하여 공간을 확보하십시오. 제목이없는 뒤로 버튼을 원하는 컨트롤러가 아니라 루트 탐색 컨트롤러를 기억하십시오.

하지만 카일 Begeman의 대답은 완전히 트릭을 수행, 가능한 컨트롤러 모든보기에서이 코드가 꽤 성가신입니다. 나는 간단한 UINavigationItem범주로 끝났다 . 조심하십시오, 여기 용입니다! 죄송합니다.
#import <objc/runtime.h>
@implementation UINavigationItem (ArrowBackButton)
static char kArrowBackButtonKey;
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
method_exchangeImplementations(m1, m2);
});
}
- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
if (item) {
return item;
}
item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
if (!item) {
item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return item;
}
@end
편집 : 2014-04-09 : 명성을 얻었을 때 더 이상이 트릭을 사용하지 않기 때문에 미안합니다. 카일의 대답을 추천합니다. 또한 selfof self.navigationItem.backBarButtonItem는 뷰 컨트롤러 뒤로 버튼이 표시되지 않지만 이전 뷰 컨트롤러는 되돌아갑니다.
이전 뷰 컨트롤러에 제목 텍스트가 필요하지 않은 경우 제목을 빈 문자열로 채 웁니다.
self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];
이렇게하면 푸시 뷰 컨트롤러에서 갈매기 형 표시기가 "뒤로"표시되지 않습니다.
편집 : 빈 제목이 아닌 제목 텍스트를 사용하더라도 viewWillAppear:뷰 컨트롤러가 팝업 될 때 제목이 깜박 거리는 것을 제외하고는 이전 뷰 컨트롤러의 제목을 설정하십시오 . "twitter 앱"은 깜박임을 피하기 위해 더 미묘한 해킹을하는 것 같습니다.
이것은 작동하지만 다시 팝업해도 이전 항목의 제목이 제거됩니다.
self.navigationController.navigationBar.topItem.title = @"";
viewDidLoad푸시 된 View Controller 에서이 속성을 설정하기 만하면됩니다 .
이것이 내가하는 방법이며 가장 간단하고 작동하며 가장 명확한 방법입니다.
임베드시 작동합니다. Navigation Controller
스위프트 3
에서 viewDidLoad내가보기 컨트롤러이 추가 당신은 뒤로 버튼 그냥 화살표가되고 싶어요.
if let topItem = self.navigationController?.navigationBar.topItem {
topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
@Kyle Begeman의 대답과의 차이점은 푸시 스택보기 컨트롤러가 아니라 뒤로 버튼이 화살표가되도록하려는보기 컨트롤러에서 이것을 호출한다는 것입니다.
원하는 방식으로 탐색 backButtonItem에 액세스 할 수 없으므로 아래와 같이 자신의 뒤로 버튼을 만들어야합니다.
- (void)loadView
{
[super loadView];
UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
[backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}
그리고 오프 코스 :
- (void) popVC{
[self.navigationController popViewControllerAnimated:YES];
}
iOS6의 간단한 해킹은 iOS7에서도 작동합니다.
[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
편집 : 이 핵을 사용하지 마십시오. 자세한 내용은 의견을 참조하십시오.
대상 : 모든 뒤로 버튼을UINavigationBar흰색 아이콘으로 맞춤 설정
단계 : 1. AppDelete의 "didFinishLaunchingWithOptions"메소드에서 :
UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
[UINavigationBar appearance].tintColor = [UIColor whiteColor];
[UINavigationBar appearance].backIndicatorImage = backBtnIcon;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{
UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}
viewDidLoad공통 수퍼 ViewController클래스 의 방법에서 2 .
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[self.navigationItem setBackBarButtonItem:backItem];
}else{
//do nothing
}
스위프트 4
사용자 정의 뒤로 버튼을 만들고 제목을 제거하려는 경우 뷰 컨트롤러 내에서 새 코드를 푸시하는 다음 코드를 사용하십시오.
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
보다 보편적으로 사용하려면 다음을 수행하십시오.
다음과 같이 범용 함수를 작성하십시오.
func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) { navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close") navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close") navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }그런 다음 다음과 같이 뷰 컨트롤러에서 사용하십시오.
addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
이것을 사용할 수 있습니다. 이것은에 UIButton대한 custumview로 추가하여 나에게 완벽하게 작동 합니다 UIBarButtonItem.
아래 코드를 사용해보십시오
self.navigationItem.leftBarButtonItem=[self backButton];
- (UIBarButtonItem *)backButton
{
UIImage *image = [UIImage imageNamed:@"back-btn.png"];
CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);
UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
[button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
[button setImage:image forState:UIControlStateNormal];
UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
모든 답변으로 문제가 해결되지는 않습니다. 모든 뷰 컨트롤러에서 버튼 제목을 뒤로 설정하는 것은 허용되지 않으며 타이틀에 오프셋을 추가하면 다음 뷰 컨트롤러 제목이 오른쪽으로 이동합니다.
다음은 메소드 스위 즐링을 사용하는 메소드입니다. UINavigationItem에 대한 새 확장을 작성하십시오.
import UIKit
extension UINavigationItem {
public override class func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
// make sure this isn't a subclass
if self !== UINavigationItem.self {
return
}
dispatch_once(&Static.token) {
let originalSelector = Selector("backBarButtonItem")
let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
// MARK: - Method Swizzling
struct AssociatedKeys {
static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}
func noTitleBackBarButtonItem() -> UIBarButtonItem? {
if let item = self.noTitleBackBarButtonItem() {
return item
}
if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
return item
} else {
let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return newItem
}
}
}
UILabel루트 뷰 컨트롤러에 원하는 제목으로를 생성하고 뷰 컨트롤러에 할당하십시오 navigationItem.titleView.
이제 제목을 빈 문자열로 설정하면 다음에 볼 컨트롤러에 텍스트가없는 뒤로 버튼이 있습니다.
self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
// add left bar button item
try this code:
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
CGRect backframe = CGRectMake(250, 9, 15,21);
UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
[backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
[backbutton addTarget:self action:@selector(Btn_back:)
forControlEvents:UIControlEventTouchUpInside];
[backbutton setShowsTouchWhenHighlighted:YES];
UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
self.navigationItem.leftBarButtonItem=backbarbutton;
[backbutton release];
}
-(IBAction)Btn_back:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
UINavigationController를 서브 클래 싱하고 자신을 대리자로 설정하고 대리자 메서드에서 backBarButtonItem을 설정할 수 있습니다. navigationController:willShowViewController:animated:
@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>
@end
@implementation Custom_NavigationController
- (void)viewDidLoad
{
[super viewDidLoad];
self.delegate = self;
}
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
제목을 비우기
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];
이미지 변경
UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;
iOS 5부터 문제 없이이 솔루션을 사용하고 있습니다. 뷰 컨트롤러에서 호출하는 유틸리티 기능을 만들었습니다. viewDidLoad 또는 그 이후의 지점에서 수행해야합니다.
void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
if(! viewController.navigationItem.backBarButtonItem)
{
viewController.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:text
style:UIBarButtonItemStylePlain
target:nil action:nil];
}
else
{
viewController.navigationItem.backBarButtonItem.title = text;
}
}
어떤 경우에는 탐색 항목이 이미 존재하고 다른 경우에는 탐색 항목을 작성해야합니다. 탐색 항목 제목을 망설이지 않고 두 경우 모두를 설명합니다. 단순히 전달하여 제목을 제거 할 수 있습니다 @"".
viewDidLoad에 다음 코드를 적용했으며 작동합니다.
// this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";
// this line set the back button and default icon color
//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];
this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];
업데이트하려면 Vector Icon을 사용하십시오.
나를 위해 일한 유일한 방법은 다음과 같습니다.
navigationController?.navigationBar.backItem?.title = ""
최신 정보:
segue 애니메이션 플래그를 true로 변경했을 때 (이전에는 false였습니다), 나를 위해 일한 유일한 방법은 다음과 같습니다.
navigationController?.navigationBar.topItem?.title = ""
Navigation Controller에 두 개의 ViewController (FirstVC, SecondVC)가 포함되어 있고 SecondVC에는 뒤로 화살표 만있는 경우
FirstVC의 ViewDidLoad에서 시도해 볼 수 있습니다.
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
그런 다음 SecondVC를 누르면 뒤로 화살표 만 나타납니다.
NavigationBar의 tintColor를 설정 한 경우 제목없이 사용자 정의 뒤로 버튼 이미지를 추가하면 색조 색상에 이미지 색상이 반영됩니다. 이 사과 문서 링크를 따르십시오.
UINavigationItem *navItem = [[UINavigationItem alloc] init];
navBar.tintColor = self.tintColor;
UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
myImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
navItem.leftBarButtonItem = leftButton;
navBar.items = @[ navItem ];
이 답변을 확인
UINavigationController 뒤로 버튼 이름을 변경하는 방법은 무엇입니까?
아래와 같이 하나의 공백으로 title텍스트를 설정 하십시오string
title = " "
의견을 추가 할만큼 평판이 충분하지 않습니다 :)
이것을 쉽게하기 위해 확장 기능을 작성했습니다.
extension UIViewController {
/// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
@objc var backButtonTitle: String? {
get {
return navigationItem.backBarButtonItem?.title
}
set {
if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
existingBackBarButtonItem.title = newValue
}
else {
let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
navigationItem.backBarButtonItem = newNavigationItem
}
}
}
}
viewWillDisappear에서 제목을 현재 ViewController의 @ ""로 변경할 수 있으며 제목이 다시 표시 될 때 제목을 이전의 내용으로 재설정하십시오.
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.title = @"Previous Title";
}
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.title = @"";
}
첫 번째 ViewController의 PreparingForSegue : 메소드에서 뷰 제목을 @ ""로 설정하므로 다음 뷰를 누르면 이전 ViewController 제목 인 @ ""가 표시됩니다.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
이것의 유일한 문제는 뒤로 버튼을 눌렀을 때 이전보기에 제목이 없으므로 viewWillAppear에 다시 추가 할 수 있다는 것입니다.
-(void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
나는이 솔루션을별로 좋아하지 않지만 작동하지만 다른 방법을 찾지 못했습니다.
위 의 Thomas C의 답변에 추가하기 위해 때로는 단일 공백을 넣는 것이 효과가 없으므로 공백을 계속 추가해야합니다.

"탐색 항목"아래에 "바 단추 항목-"이 표시되면 성공한 것입니다. 그것은 문서 개요 (편집기-> 문서 개요 표시)에 있습니다. 위의 그림이 보이면 몇 개의 공백을 삭제하고 여전히 작동하는지 확인할 수 있습니다.
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Custom initialization
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
return self;
}
Kyle Begeman과 마찬가지로 루트 뷰 컨트롤러에서 위의 코드를 추가합니다. 모든 서브 뷰 컨트롤러가 적용됩니다. 또한 이것을 initWithCoder : 메소드에 추가하면 xib, 스토리 보드 또는 코드 기반 접근 방식의 루트 뷰 컨트롤러 스타일을 적용 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/18870128/uinavigationbar-custom-back-button-without-title
'development' 카테고리의 다른 글
| Swift에서 UILabel의 글꼴 크기를 어떻게 변경합니까? (0) | 2020.04.17 |
|---|---|
| “코드” (0) | 2020.04.17 |
| XML에서 C # 클래스 생성 (0) | 2020.04.17 |
| rvm 설치가 작동하지 않습니다 :“RVM이 기능하지 않습니다” (0) | 2020.04.17 |
| Windows 개발 시스템을 사용하여 iPhone 용으로 개발하려면 어떻게해야합니까? (0) | 2020.04.17 |