IOS 7以上でタイトルなしでナビゲーションの戻るボタンをカスタマイズする方法を教えてください。 (矢印のみ)
self.navigationItem.leftBarButtonItem = self.editButtonItem;
Self.backButtonItemがあるのかと思います。
OR
このようなもの?
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)
この行をスタックにプッシュしているView Controllerに入れます( 前のView Controller )。新しく押したView Controllerの戻るボタンは、initWithTitleに何を入れても表示されます。この場合は空の文字列です。
私はiOSの単一の矢印で戻るボタンを作る簡単な方法を見つけました。
ViewBからViewAに移動するナビゲーションコントローラがあるとしましょう。 IBでは、ViewAのナビゲーションバーを選択すると、これらのオプションが表示されます:タイトル、プロンプト、戻るボタン。
ViewAのナビゲーションバーのオプション
トリックは previous view controller(View A)のオプションであなたの運命のView Controllerの戻るボタンのタイトル(ViewB)を選ぶことです。 「戻るボタン」オプションを入力しないと、iOSは自動的に「戻る」というタイトルを previous View Controllerのタイトルにします。そのため、このオプションを1つのスペースで埋める必要があります。
「戻るボタン」オプションのスペースを埋める
結果:
画像を使うだけ!
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
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];
}
これがお役に立てば幸いです。
あなたがする必要があることは何もありません。ストーリーボード自体で同じことができます。
ルートナビゲーションコントローラに行き、スペースを空けるだけです。タイトルなしで戻るボタンが欲しいコントローラではなく、ルートナビゲーションコントローラに忘れないでください。
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
編集:2014-04-09:私は評判を得たので、私はこれ以上このトリックを使わないので申し訳ありません。カイルの答えをお勧めします。また、self.navigationItem.backBarButtonItem
のself
は戻るボタンが表示されるView Controllerではなく、戻る前のView Controllerです。
前のView Controller用のタイトルテキストが不要な場合は、タイトルを空白の文字列で埋めます。
self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];
これにより、プッシュされたView Controllerにシェブロンで「戻る」と表示されなくなります。
編集:空白以外のタイトルテキストを使用しても、View Controllerがポップされたときにタイトルが点滅して点滅する可能性がある場合を除き、前のView ControllerのタイトルをviewWillAppear:
に設定することはできます。私は「Twitterアプリ」がちらつきを避けるためにもっと微妙なハックをするように思われる。
これは動作しますが、前の項目のタイトルを削除しても、元の項目に戻っても同じです。
self.navigationController.navigationBar.topItem.title = @"";
このプロパティはプッシュされたView ControllerのviewDidLoad
に設定するだけです。
これが私のやり方であり、最も簡単で効果的なやり方です。
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でこれを呼び出すことです。
IOS 6からの単純なハックはiOS 7でも動作します。
[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
編集: /このハックを使わないでください。詳細はコメントを見てください。
あなたが望む方法でナビゲーション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];
}
ターゲット: 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
}
すべての答えが問題を解決するわけではありません。すべての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
}
}
}
あなたはこれを使うことができます。これは私にとっては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)
より普遍的な使用のために、以下をしてください:
次のようにしてユニバーサル関数を作成します。
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)
}
その後、以下のようにView Controllerで使用します。
addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
// 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をサブクラス化し、それ自体をデリゲートとして設定し、デリゲートメソッド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
タイトルを空に戻す
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;
ルートView Controllerに付けるタイトルを付けてUILabel
を作成し、それをView ControllerのnavigationItem.titleView
に割り当てます。
タイトルを空の文字列に設定すると、次に押すView Controllerにはテキストのない戻るボタンが表示されます。
self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
私にとってうまくいった唯一の方法は次のとおりです。
navigationController?.navigationBar.backItem?.title = ""
更新:
私がsegueアニメーションフラグをtrueに変更したとき(以前はfalseでした)、私のために働いた唯一の方法は以下のとおりです。
navigationController?.navigationBar.topItem?.title = ""
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にプッシュすると、戻る矢印しかないのがわかります。
私は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;
}
}
ナビゲーション項目がすでに存在している場合もあれば、作成する必要がある場合もあります。これは、ナビゲーション項目のタイトルを混乱させることなく、両方のケースを説明します。 @""
を渡すだけでタイトルを削除できます。
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を使います
この答えをチェック
UINavigationControllerの戻るボタンの名前を変更するにはどうすればいいですか?
以下のようにtitle
textを1つ空白スペースでstring
に設定します
title = " "
コメントを追加するのに十分な評判がありません:)
TintColor Of NavigationBarを設定した場合は、色合いの色が画像の色を反映するようにタイトルなしのカスタム戻るボタン画像を追加します。このAppleのドキュメントリンクをたどってください。
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 ];
そのカテゴリをAppDelegate.mファイルに入れることができます。削除する テキスト UINavigationのすべてのデフォルトの戻るボタンから。必要な場合は矢印「<」またはカスタムイメージを設定してください。
目的c:
...
@終わり
@implementation UINavigationItem(Extension) - (UIBarButtonItem *)backBarButtonItem { return [[UIBarButtonItem alloc] initWithTitle:@ "" style:UIBarButtonItemStylePlain target:nilアクション:nil]; } @ end
ViewWillDisappearでタイトルを現在のViewControllerの@ ""に変更できます。また、表示するときは、タイトルを以前のものに再設定します。
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.title = @"Previous Title";
}
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.title = @"";
}
最初のViewControllerのprepareForSegue:メソッドで、そのビューのタイトルを@ ""に設定しているため、次のビューがプッシュされると、前のViewControllerのタイトル(@ "")が表示されます。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
これに関する唯一の問題は、戻るボタンを押したときに前のビューにタイトルが表示されないことです。そのため、viewWillAppearにもう一度追加することができます。
-(void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
私はこの解決策はあまり好きではありませんが、うまくいきますし、それ以外の方法を見つけることもできませんでした。
Thomas Cの答え に追加するには、スペースを1つ入れてもうまくいかず、スペースを追加し続けなければならないことがあります。
「ナビゲーション項目」の下に「バーボタン項目 - 」が表示されたら、成功したことがわかります。これはドキュメントアウトラインにあります(エディタ - >ドキュメントアウトラインを表示)。上の写真を見たら、いくつかのスペースを削除してそれでもまだ機能するかどうかを確認できます。
私はこれを簡単にするために拡張機能を書きました:
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
}
}
}
}
ボタン項目のタイトルを空の文字列として設定します。
[self.navigationController.navigationBar.backItem setTitle:@ ""];
- (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のスタイルを適用できます。
ビューのタイトルが消えたときに変更しています
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
title = "My title"
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
title = " "
}