如何在Xcode中从导航栏的返回按钮上移除文本?

7

我在应用程序委托中添加了以下代码来将箭头自定义图像设置到导航栏,它可以工作,但现在我想完全删除返回按钮的文本。

UIImage * backButtonImage = [UIImage imageNamed: @"BackButtonGrey.png"];
backButtonImage = [backButtonImage stretchableImageWithLeftCapWidth: 15.0 topCapHeight: 30.0];
[[UIBarButtonItem appearance]  setBackButtonBackgroundImage: backButtonImage  forState: UIControlStateNormal  barMetrics: UIBarMetricsDefault];
8个回答

9

只需将文本垂直移动到不再显示即可。这可以在应用程序委托中的应用程序启动时完成。

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, 20.f) forBarMetrics:UIBarMetricsDefault];

通常这个调用是为了微调垂直文本位置,这取决于所使用的字体。在这里,文本被移动得足够远,使其不再位于后退按钮视图内,因此被裁剪成不存在。


3
就我所经历的来说,这与当前视图控制器标题的偏移量无关。 - rebellion
完全同意@Ronny-André Bendiksen - 这仍然会导致长标题偏移,看起来很奇怪。 - Andy Davies

9

我认为开发者调整文本偏移量来隐藏文本并不是一个好的实践。

更清晰的解决方案是在导航控制器的返回按钮上添加一个新的按钮,其中标题为空字符串。您应该在上一个调用视图控制器的viewWillAppear方法中添加此按钮(而不是当前视图控制器):

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

3
这是唯一对我有效的答案。请确保注意“你应该在之前的调用视图控制器中添加这个”! - Joe
这是最好的答案! - Andy Davies

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

1
UIOffsetMake(-100.f, 0) 这样做不太好 - 如果您通过标准推送进入此视图控制器,您将在动画期间看到移动的文本。更好的方法可能是:UIOffsetMake(-100.f, -5000.f) - Reconquistador

5

我只是按照以下方法进行,对我很有效 :-)

UIImage *backButtonImage = [UIImage imageNamed:@"navigationBarBack.png"];
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];

[backButton setImage:backButtonImage
            forState:UIControlStateNormal];

backButton.frame = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height);

[backButton addTarget:self
               action:@selector(popViewController)
     forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backBarButtonItem;

1
我想尝试在应用程序委托中完成它,这样就可以全局更改,而不是将此代码粘贴到每个控制器类中。 - ASH
你可以继承UIViewController,将代码添加到其中,并在你的控制器中使用这个类。 - d4Rk
嗯,好的。我再仔细检查了一下,似乎这种方式行不通。对此我感到抱歉。那么我认为你应该采用子类化的方式。 - d4Rk
我该如何进行子类化? - ASH
我使用了一个类别,在其中放置了一个包含我的答案代码的方法,并在每个控制器中调用它,以便在需要使用自定义返回按钮的地方使用。如果您正在使用子类,则只需创建一个继承自UIViewController的子类,在viewDidLoad中放置该代码。创建其他视图控制器以从该视图控制器继承,并在viewDidLoad中调用[super viewDidLoad](无论如何都应该这样做)。 - d4Rk
然而,这将禁用iOS 7中的滑动返回手势。 - user102008

1
要设置返回按钮文本,您需要在推送或呈现新视图控制器之前将一个新的返回按钮设置为当前视图控制器,该按钮将显示返回按钮的文本:
在当前视图控制器(不是将显示返回按钮的新视图控制器)中:
vc                                    = [[MyNewViewController alloc]initWith...];
vc.title                              = @"New ViewController";
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
[self.navigationController pushViewController:vc animated:YES];

如果您想要删除文本,只需将@""用作新返回按钮的标题。

要为整个应用设置返回按钮图标,请在您的appDelegate类中使用以下代码。并不是每个图标都完美适合,所以如果您需要稍微移动一下,可以使用"backInsets"。在我的示例中,图标会向下移动2像素。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    ...
    [self customBackButtonIcon];
    return YES;
}

- (void)customBackButtonIcon
{        
    UIEdgeInsets backInsets = UIEdgeInsetsMake(0, 0, -2, 0);
    UIImage *backImg = [[[UIImage imageNamed:@"back_button_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] imageWithAlignmentRectInsets:backInsets];
    [[UINavigationBar appearance] setBackIndicatorImage:backImg];
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backImg];
}

测试过 iOS9


或者你可以将 self.navigationItem.backBarButtonItem = .... 放入当前视图控制器的设置 / viewDidLoad 方法中,该方法会推出新的视图控制器。 - Rikco

1
不要使用外观代理。相反,对于每个视图控制器,请将此代码放入其viewDidLoad实现中:
UIImage * backButtonImage = 
    [UIImage imageNamed: @"BackButtonGrey.png"];
backButtonImage = 
    [backButtonImage stretchableImageWithLeftCapWidth: 15.0 topCapHeight: 30.0];

UIBarButtonItem* b =
     [[UIBarButtonItem alloc] 
          initWithImage:backButtonImage
          style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = b;

这将导致推入导航栈的下一个视图控制器具有仅由图像组成的返回按钮。
(但是,我应该指出stretchableImageWithLeftCapWidth:...已被弃用。您应该使用resizableImage...。)

那你没有按照我的指示去做。我使用这段代码,我的返回按钮正常。 - matt
我尝试使用您的代码,但最终我只得到了相同的普通返回按钮,并没有实现任何自定义。 - ASH
请仔细阅读我的回答。如果你在视图控制器A中有那段代码,当视图控制器B被推到视图控制器A上时,你会发现返回按钮不在视图控制器A的视图中,而是在视图控制器B的视图中。 - matt

0
UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@""
                                 style:UIBarButtonItemStylePlain
                                target:nil
                                action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接