web-dev-qa-db-ja.com

タイトルなしのUINavigationBarカスタム戻るボタン

IOS 7以上でタイトルなしでナビゲーションの戻るボタンをカスタマイズする方法を教えてください。 (矢印のみ)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Self.backButtonItemがあるのか​​と思います。

OR

このようなもの?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];
224
Kiddo

それは実際にはかなり簡単です、ここに私がしていることがあります:

目標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)

この行をスタックにプッシュしているView Controllerに入れます( 前のView Controller )。新しく押したView Controllerの戻るボタンは、initWithTitleに何を入れても表示されます。この場合は空の文字列です。

304
Kyle Begeman

私はiOSの単一の矢印で戻るボタンを作る簡単な方法を見つけました。

ViewBからViewAに移動するナビゲーションコントローラがあるとしましょう。 IBでは、ViewAのナビゲーションバーを選択すると、これらのオプションが表示されます:タイトル、プロンプト、戻るボタン。

ViewAのナビゲーションバーのオプション

ViewA navigate bar options

トリックは previous view controller(View A)のオプションであなたの運命のView Controllerの戻るボタンのタイトル(ViewB)を選ぶことです。 「戻るボタン」オプションを入力しないと、iOSは自動的に「戻る」というタイトルを previous View Controllerのタイトルにします。そのため、このオプションを1つのスペースで埋める必要があります。

「戻るボタン」オプションのスペースを埋める

Fill space in "Back Button" option

結果:

The Result:

195
Tom Calmon

画像を使うだけ!

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

[email protected]

Icon-Back@2x

[email protected]

Icon-Back@23x

64
mt81

iOS7には新しいインターフェース規則があるので、UIViewをプッシュするときは少なくとも戻る矢印を付けた方がいいでしょう。プログラムで「戻る」テキストを変更するのはとても簡単です。ビューをプッシュする前にこのコードを追加するだけです(StoryBoardsを使用している場合はprepareForSegue)。

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

これがお役に立てば幸いです。

28
Anibal Itriago

あなたがする必要があることは何もありません。ストーリーボード自体で同じことができます。

ルートナビゲーションコントローラに行き、スペースを空けるだけです。タイトルなしで戻るボタンが欲しいコントローラではなく、ルートナビゲーションコントローラに忘れないでください。

As per the image below. This works for iOS 7 and iOS 8

26
Swaroop S

Kyle Begemanの答え 完全にトリックを行いますが、すべてのView Controllerでこのコードを使用できるようにするのは非常に面倒です。私は簡単な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
22
Nicky

編集:2014-04-09:私は評判を得たので、私はこれ以上このトリックを使わないので申し訳ありません。カイルの答えをお勧めします。また、self.navigationItem.backBarButtonItemselfは戻るボタンが表示されるView Controllerではなく、戻る前のView Controllerです。

前のView Controller用のタイトルテキストが不要な場合は、タイトルを空白の文字列で埋めます。

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

これにより、プッシュされたView Controllerにシェブロンで「戻る」と表示されなくなります。

編集:空白以外のタイトルテキストを使用しても、View Controllerがポップされたときにタイトルが点滅して点滅する可能性がある場合を除き、前のView ControllerのタイトルをviewWillAppear:に設定することはできます。私は「Twitterアプリ」がちらつきを避けるためにもっと微妙なハックをするように思われる。

21
hiroshi

これは動作しますが、前の項目のタイトルを削除しても、元の項目に戻っても同じです。

self.navigationController.navigationBar.topItem.title = @"";

このプロパティはプッシュされたView ControllerのviewDidLoadに設定するだけです。

20
Guto Araujo

これが私のやり方であり、最も簡単で効果的なやり方です。

Navigation Controllerに埋め込むとこれは機能します。

スイフト3

viewDidLoadでは、これをView Controllerに追加して、戻るボタンを単なる矢印にします。

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

これと@Kyle Begemanの答えとの違いは、プッシュボタンのView Controllerではなく、戻るボタンを単なる矢印にしたいというView Controllerでこれを呼び出すことです。

9
r_19

IOS 6からの単純なハックはiOS 7でも動作します。

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

編集: /このハックを使わないでください。詳細はコメントを見てください。

6
zh.

あなたが望む方法でナビゲーション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];
}
6
null

ターゲット: 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];
}

2.一般的なスーパーviewDidLoadクラスのViewControllerメソッドで:

 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
    }
6
Jagie

すべての答えが問題を解決するわけではありません。すべてのView Controllerでボタンのタイトルを元に戻しても、タイトルにオフセットを追加しても、次のView Controllerのタイトルは右に移動します。

これは、swizzlingメソッドを使用したメソッドです。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
    }
}
}
3
jakub wolanski

あなたはこれを使うことができます。これは私にとってはUIButtonのカスタムビューとして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;
}

スイフト4

カスタムの戻るボタンを作成したり、タイトルを削除したい場合は、新しいボタンを押しているView Controller内の次のコードを使用してください。

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)

より普遍的な使用のために、以下をしてください:

  1. 次のようにしてユニバーサル関数を作成します。

    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)
    }
    
  2. その後、以下のようにView Controllerで使用します。

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
    
3
Nino Bouchedid
 // 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];

}
2
Paresh Hirpara

UINavigationControllerをサブクラス化し、それ自体をデリゲートとして設定し、デリゲートメソッドnavigationController:willShowViewController:animated:でbackBarButtonItemを設定することができます。

@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
2
Nate Potter

タイトルを空に戻す

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;
2
warriorg

ルートView Controllerに付けるタイトルを付けてUILabelを作成し、それをView ControllerのnavigationItem.titleViewに割り当てます。

タイトルを空の文字列に設定すると、次に押すView Controllerにはテキストのない戻るボタンが表示されます。

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
2
rounak

私にとってうまくいった唯一の方法は次のとおりです。

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

更新:

私がsegueアニメーションフラグをtrueに変更したとき(以前はfalseでした)、私のために働いた唯一の方法は以下のとおりです。

navigationController?.navigationBar.topItem?.title = ""
1
Siamaster

2つのViewController(FirstVC、SecondVC)がNavigation Controllerに埋め込まれていて、SecondVCに戻る矢印だけが必要な場合。

これを試すことができますIn FirstVCのViewDidLoad

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

SecondVCにプッシュすると、戻る矢印しかないのがわかります。

1
Yu-Lin Wang

私はiOS 5以降、このソリューションを問題なく使用しています。私は自分のView Controllerで呼び出すユーティリティ関数を作りました。 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;
    }
}

ナビゲーション項目がすでに存在している場合もあれば、作成する必要がある場合もあります。これは、ナビゲーション項目のタイトルを混乱させることなく、両方のケースを説明します。 @""を渡すだけでタイトルを削除できます。

1
Dima

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を使います

1
Hajra Qamar

この答えをチェック

UINavigationControllerの戻るボタンの名前を変更するにはどうすればいいですか?

以下のようにtitle textを1つ空白スペースでstringに設定します

title = " "

コメントを追加するのに十分な評判がありません:)

1
Leojin

TintColor Of NavigationBarを設定した場合は、色合いの色が画像の色を反映するようにタイトルなしのカスタム戻るボタン画像を追加します。このAppleのドキュメントリンクをたどってください。

https://developer.Apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//Apple_ref/doc/uid/TP40012857-UIView-SW7

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 ];
1
Nazish Ali

そのカテゴリをAppDelegate.mファイルに入れることができます。削除する テキスト UINavigationのすべてのデフォルトの戻るボタンから。必要な場合は矢印「<」またはカスタムイメージを設定してください。

目的c:

...

@終わり

@implementation UINavigationItem(Extension)
 
  - (UIBarButtonItem *)backBarButtonItem {
 
 return [[UIBarButtonItem alloc] initWithTitle:@ "" style:UIBarButtonItemStylePlain target:nilアクション:nil]; 
} 
 
 @ end
0
Aleksandr B.

ViewWillDisappearでタイトルを現在のViewControllerの@ ""に変更できます。また、表示するときは、タイトルを以前のものに再設定します。

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}
0
WaleedAmmari

最初のViewControllerのprepareForSegue:メソッドで、そのビューのタイトルを@ ""に設定しているため、次のビューがプッシュされると、前のViewControllerのタイトル(@ "")が表示されます。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

これに関する唯一の問題は、戻るボタンを押したときに前のビューにタイトルが表示されないことです。そのため、viewWillAppearにもう一度追加することができます。

-(void)viewWillAppear:(BOOL)animated{
   self.navigationItem.title = @"First View Title";
}

私はこの解決策はあまり好きではありませんが、うまくいきますし、それ以外の方法を見つけることもできませんでした。

0

Thomas Cの答え に追加するには、スペースを1つ入れてもうまくいかず、スペースを追加し続けなければならないことがあります。

empty bar button

「ナビゲーション項目」の下に「バーボタン項目 - 」が表示されたら、成功したことがわかります。これはドキュメントアウトラインにあります(エディタ - >ドキュメントアウトラインを表示)。上の写真を見たら、いくつかのスペースを削除してそれでもまだ機能するかどうかを確認できます。

0
Rog182

私はこれを簡単にするために拡張機能を書きました:

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

}
0
Mark Bridges

ボタン項目のタイトルを空の文字列として設定します。

[self.navigationController.navigationBar.backItem setTitle:@ ""];

0
Georgekutty Joy
  1. 左側にUINavigationItemに新しいUIBarButtonItemを追加
  2. UIBarButtonItemの使い方を変更する
  3. ここで、UINavigationItemをクリックし、アウトレットからbarBackButtonItemを左にスワイプしますUIBarButtonItem

enter image description here

0
alicanozkara
- (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と同じように、上のコードをルートビューコントローラに追加します。すべてのSub View Controllerが適用されます。さらに、initWithCoder:メソッドにこれを追加すると、xib、ストーリーボード、またはコードベースのアプローチでルートView Controllerのスタイルを適用できます。

0
Chris So

ビューのタイトルが消えたときに変更しています

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    title = "My title"
}

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

    title = " "
}
0
oscarr