[ios] 제목없는 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 탐색 모음 옵션

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 @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


답변

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];
}

이것이 당신에게 도움이되기를 바랍니다!


답변

할 일이 많지 않습니다. 스토리 보드 자체를 통해 동일한 결과를 얻을 수 있습니다.

루트 내비게이션 컨트롤러로 이동하여 공간을 확보하십시오. 제목이없는 뒤로 버튼을 원하는 컨트롤러가 아니라 루트 탐색 컨트롤러를 기억하십시오.

아래 이미지에 따라.  이것은 iOS 7 및 iOS 8에서 작동합니다.


답변

하지만 카일 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 앱”은 깜박임을 피하기 위해 더 미묘한 해킹을하는 것 같습니다.