私がやりたかったことはUIBarButtonItem
の '戻る'ボタンからテキストを削除し、ナビゲーションバーに青い山形だけを残すことです。私はiOS 7用に開発していることを覚えておいてください。私はいくつかの方法を試してみました。
これは私が好きではなかったイメージメソッドです(イメージは場違いに見えました):
UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;
私が試したもう一つの方法はこれでした、それは単にうまくいきませんでした(何も表示されませんでした):
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;
私が達成したかったのは、iOS 7 Musicアプリにある戻るボタンのようなものです。
ありがとう。
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
forBarMetrics:UIBarMetricsDefault];
その後、戻るボタンの項目のタイトルを削除できます。
ストーリーボードを使用している場合は、ナビゲーション属性インスペクタの[戻る]ボタンにスペースを設定できます。
タイトルを変更せずにView Controllerの戻るボタンのタイトルを設定するには、次のコマンドを使用します。
目的C:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
迅速:
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
明確にするために、これはあなたが戻るボタンを押した場合に表示されるView Controller上で行われます。 SettingsViewControllerの '<'を見るだけで、これをinit
に入れます。そうすれば、View Controller自体を見ているときにタイトルが表示されないという問題は一切発生しません。
ストーリーボードを使用している場合は、ViewControllerのAttributes Inspector
のNavigation Item
に移動し(Navigation Bar
をクリック)、Back Button
プロパティを ""(スペース1文字)に設定します。これにより、戻るボタンのタイトルが1つの空白文字に設定され、山形が表示されたままになります。コードをいじる必要はありません。
これは、Back Button
title このView Controllerに関連するBackボタン用をこのControllerの内側に表示されるBack Button
用にではなく、その上にプッシュされたものに設定することに注意してください。
これは、私にとって、テキストなしで「後ろ」のシェブロンだけを表示するのに役立ちます。
self.navigationController.navigationBar.topItem.title = @"";
ナビゲーションバーを表示しているView ControllerのviewDidLoad
にこのプロパティを設定すると、うまくいきます。
注:私はiOS 7でテストしただけですが、これは質問の範囲内です。
ボタンのタイトルを設定するときは、@ ""の代わりに@ ""を使用してください。
- 編集 -
他の文字列を試したときに何か変化はありますか?私は自分自身で次のコードを使用しています。
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
backStringは、私がiOS 7またはそれ以前のバージョンのどちらを使用しているかによって、@ ""または@ "Back"に設定される変数です。
注意すべき1つのことは、このコードは、戻るボタンをカスタマイズしたいページのコントローラーにはないということです。それは実際にはナビゲーションスタック上でそれの前にコントローラにあります。
状況に応じて物事を見ることが役に立つ場合があります。これは「戻る」テキストを隠すがそれでも矢印を表示する最小のプロジェクトです。
ストーリーボード
「セカンドビューコントローラを表示」ボタンからセカンドビューコントローラへのショーセグエがあります。
また、ナビゲーションアイテムを2つ目のView Controllerに追加して、タイトルが付けられるようにしました。これはオプションです。戻るボタンには影響しません。
コード
FirstViewController.Swift
import UIKit
class FirstViewController: UIViewController {
@IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {
// hide the back button text
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
SecondViewController.Swift
import UIKit
class SecondViewController: UIViewController {
// Nothing at all needed here
}
ストーリーボードで、最初のビューコントローラ(2番目ではない)のナビゲーション項目を選択します。戻るボタンのテキストを入力するだけです。
self.navigationController.navigationBar.topItem.title = @"";
IOS 7では、AppleはUINavigationBarに2つの新しいプロパティbackIndicatorTransitionMaskImageとbackIndicatorImageを導入しました。
一度だけ呼び出すことで:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];
デフォルトのシェブロングリフではなくカスタムイメージをレンダリングし、キーウィンドウの色合いを継承します。
そしてタイトルを削除するために、私はKamarosの答えを提案します。新しいコードをプッシュしているビューコードでこのコードを呼び出すことを忘れないでください。 iOS UIBarButtonItemのタイトルテキストを削除する
これはiOS10で私のために働きました。これをView ControllerのviewDidLoadから呼び出します。
self.navigationController?.navigationBar.topItem?.title = ""
提供された回答ではあまり成功しませんでしたが、本当に簡単な回避策が見つかりました。ストーリーボードで、UIViewControllerのナビゲーション項目をクリックして戻るボタンのテキストを設定できます。私はそれを単一のスペースに設定し、それが私が探していた行動を与えてくれました。
この問題に対する簡単な解決策は、iOS 7および6で作業する場合、viewDidLoadでカスタムタイトルビューを設定することです。
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.text = self.title;
titleLabel.backgroundColor = [UIColor clearColor];
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;
}
それから、viewWillAppearで:あなたは安全に呼び出すことができます
self.navigationController.navigationBar.topItem.title = @" ";
タイトルビューはカスタムビューなので、ナビゲーションスタックに戻っても上書きされません。
実際には、たった1つのトリックでこれを実行できます。
UINavigationBar
クラスをオーバーライドして、次のコード行を追加します。
- (void)layoutSubviews{
self.backItem.title = @"";
[super layoutSubviews];
}
次に、このカスタムUINavigationBarクラスを使用してUINavigationController
を初期化します。UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];
お役に立てれば
最初のViewControllerのprepareForSegue:メソッドで、そのビューのタイトルを@ ""に設定しているため、次のビューがプッシュされると、前のViewControllerのタイトル(@ "")が表示されます。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
これに関する唯一の問題は、戻るボタンを押したときに前のビューにタイトルが表示されないことです。そのため、viewWillAppearにもう一度追加することができます。
- (void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
私はこの解決策はあまり好きではありませんが、うまくいきますし、それ以外の方法を見つけることもできませんでした。
Swift
navigationController?.navigationBar.topItem?.title = ""
私はDonnaLeaの答えを使って何か一緒に石畳を作ることができました。これが私のUIViewControllerサブクラスに表示される方法です。
var backItemTitle:String?
override func viewDidLoad() {
super.viewDidLoad()
//store the original title
backItemTitle = self.navigationController?.navigationBar.topItem?.title
//remove the title for the back button
navigationController?.navigationBar.topItem?.title = ""
}
override func willMoveToParentViewController(parent: UIViewController?) {
super.willMoveToParentViewController(parent)
if parent == nil {
//restore the orignal title
navigationController?.navigationBar.backItem?.title = backItemTitle
}
}
元の答えの問題点は、あなたがそれに戻ったときにそれがコントローラーからタイトルを削除することです。 viewWillDisappearでタイトルをリセットしようとすると、移行プロセスが遅すぎます。うまく動くのではなく、タイトルがスナップインします。しかしwillMoveToParentViewControllerはより早く発生し、正しい動作を可能にします。
警告:これは通常のUINavigationController Push/popでテストしただけです。他の状況では、予期しない動作がさらに発生する可能性があります。
答えのどれも私を助けませんでした。しかし、トリックはしました - 押した直前(戻るボタンがあるところ)のView Controllerのタイトルをクリアしただけです。
そのため、前のビューにタイトルがない場合、iOS 7では、戻るボタンにはテキストがなくても矢印しか表示されません。
プッシュビューのviewWillAppear
に、元のタイトルを戻しました。
これはサブクラスnavigationController
を使用して "Back"を削除します。
私は恒久的にアプリを通じて、それを削除するためにこれを使用しています。
//.h
@interface OPCustomNavigationController : UINavigationController
@end
//.m
@implementation OPCustomNavigationController
- (void)awakeFromNib
{
[self backButtonUIOverride:YES];
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[self backButtonUIOverride:NO];
[super pushViewController:viewController animated:animated];
}
- (void)backButtonUIOverride:(BOOL)isRoot
{
if (!self.viewControllers.count)
return;
UIViewController *viewController;
if (isRoot)
{
viewController = self.viewControllers.firstObject;
}
else
{
int previousIndex = self.viewControllers.count - 1;
viewController = [self.viewControllers objectAtIndex:previousIndex];
}
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
}
@end
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
NSFontAttributeName:[UIFont systemFontOfSize:1]}
forState:UIControlStateNormal];
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
私は同じ問題を抱えていました、そして私はこのようにしました。
- 編集 -
あなたが本当にすべてのUIBarbuttonItemのタイトルテキストを削除したいとき、これは解決策です。バックバーボタン項目のタイトルを削除したいだけであれば、簡単で便利な解決策はありません。私の場合は、タイトルテキストを表示する必要があるUIBarButtonItemがほとんどないので、それらの特定のボタンのtitleTextAttributesを変更しました。より具体的にしたい場合は、ナビゲーションバーのボタンのみを変更する以下のコードを使用してください。
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Swift 3.1 UINavigationControllerのデリゲートメソッドを実装することでこれを行うことができます。 [戻る]ボタンだけでタイトルを非表示にします。[戻る]矢印の画像とデフォルトの機能は引き続き使用できます。
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
これが私がやっていることです、戻るボタンのタイトルを削除する方が簡単です
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar?.backItem?.title = ""
}
これはより良い解決策です。
他の解決策は危険なので危険です。
extension UINavigationController {
func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
pushViewController(viewController, animated: animated)
}
}
これを使うこともできます。
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];
これは私のために働く
UINavigationController
のカスタムクラスを作成し、それを私のアプリのすべてのナビゲーションコントローラに適用します。このカスタムUINavigationController
クラスの中で、ビューがロードされたらUINavigationBar
デリゲートをself
に設定します。
- (void)viewDidLoad {
self.navigationBar.delegate = self;
}
それから私はデリゲートメソッドを実装します。
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {
// This will clear the title of the previous view controller
// so the back button is always just a back chevron without a title
if (self.viewControllers.count > 1) {
UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
previousViewController.title = @"";
}
return YES;
}
このようにして、私は自分のカスタムクラスをすべてのナビゲーションコントローラに割り当てるだけで、すべての戻るボタンからタイトルを消去します。わかりやすくするために、私は常にviewWillAppear
内の他のすべてのView Controllerのタイトルを設定して、ビューが表示される直前にタイトルが常に更新されるようにします(このようなトリックによって削除される場合)。
私のようにUINavigationBar
の代わりにカスタムビューを使用していて、戻るボタンを押したままにしている場合は、ちょっとわかりにくい作業をする必要があります。
[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];
タイトルが表示されても表示されない場合は、表示された後に非表示になり、問題が解決されます。
extension UIViewController{
func hideBackButton(){
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
戻るボタンのナビゲーション項目に1つのスペースを入力するだけで動作します。
グローバルに完璧なソリューション
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
}
case : <Back as <
override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
}
私はあなたがそれをチェックアウトすることができますアプリを通してすべての戻るボタンのタイトルを隠すために非常に単純なゼロ設定カテゴリを作りました ここ 。この質問はすでに答えを受け入れていますが、他の人にとっては役に立つかもしれません。
編集:
.hファイル
#import <UIKit/UIKit.h>
@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);
@end
.mファイル
#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>
@implementation UINavigationController (HideBackTitle)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
PJSwizzleMethod([self class],
@selector(pushViewController:animated:),
@selector(pj_pushViewController:animated:));
});
}
- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
UIViewController *disappearingViewController = self.viewControllers.lastObject;
if (disappearingViewController) {
disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
if (!disappearingViewController) {
return [self pj_pushViewController:viewController animated:animated];
}
return [self pj_pushViewController:viewController animated:animated];
}
@end
void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
Method originalMethod = class_getInstanceMethod(cls, originalSelector);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
BOOL didAddMethod =
class_addMethod(cls,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(cls,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
Guto AraujoのnavigationBar.topItem.title = @"";
の答えを使用してもうまく動作しませんでした。
しかし、私は自分のView Controllerのinit
メソッドにself.title = @""
を設定することで望みの効果を得ることができました。 (init
で設定することは重要です。viewDidLoad
は動作しません。)
私はこれまで私のために働いていた解決策をリストしています。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.topItem?.title = "" // 1
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default) // 2
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal) //3
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted) //4
}
IOS11で戻るボタンの項目のタイトルを削除したい場合は、試すことができます。
@implementation UIView (PrivateBackButton)
+ (void)initialize {
if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[NSObject hookInstanceMethodForClass:[self class] originalMethod:@selector(layoutSubviews) newMethod:@selector(mc_layoutSubviews)];
});
}
- (void)mc_layoutSubviews {
[self mc_layoutSubviews];
[self updateiOS11LaterUI];
}
- (void)updateiOS11LaterUI {
if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
if (![self isKindOfClass:NSClassFromString(@"_UIBackButtonContainerView")]) return;
[self removeAllSubviews];
[self.superview mas_remakeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(@44);
}];
}
@end
IOS 11では、次のコードを使用してボタンのタイトルを隠すことができます。
Swift:
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)
このコードはナビゲーションバーからタイトルを削除しませんが、単に透明にして、戻るボタンにはタイトルのスペースを保持します。 View Controllerのタイトル用のスペースを増やす必要がある場合は、別の解決策を使用する必要があります。
独自のUIViewController
基本クラスを実装し、setTitle:
をオーバーライドします。
@interface CustomViewController : UIViewController
@end
@implementation CustomViewController
- (void)setTitle:(NSString *)title {
super.title = @""; // This will remove the "Back" title
UILabel *titleView = [UILabel new];
// customize the label as you wish
titleView.text = title;
[titleView sizeToFit];
self.navigationItem.titleView = titleView;
}
@end
タイトルを設定したい任意のUIViewController
に、通常どおりself.title = @"MyTitle"
を書くことができ、新しいUIViewController
をプッシュしてもバックバー項目にテキストは表示されません。