【问题标题】:iPhone - set app wide nav bar back button without textiPhone - 设置应用程序宽导航栏后退按钮,不带文字
【发布时间】:2012-08-16 01:49:32
【问题描述】:

我已使用外观属性将图像设置为应用程序中所有导航栏后退按钮的背景图像。我在 applicationDidLoad 方法中使用以下代码。

UIImage *backButton = [UIImage imageNamed:@"btn-nav-back"];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

我的问题是,每当后退按钮出现时,由于前一个视图的名称被设置为后退按钮的标题,图像就会被拉伸。有没有一种系统范围的方法可以停止设置标题?还尝试在实际视图控制器中将后退按钮的标题设置为空白没有效果:(

[self.navigationItem.backBarButtonItem setTitle:@""];

【问题讨论】:

    标签: iphone uinavigationcontroller uiappearance


    【解决方案1】:

    我找到了实现你想要的方法。

    首先让你的后退图片可调整大小,这样它就不会被拉伸到后退按钮的长度:

    UIImage* backImage = [[UIImage imageNamed:@"back"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20, 0, 0)];
    

    通过 UIAppearance 将此图像设置为 backButtonBackgroundImage:

    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    

    最后,将标题移出可见区域:

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault];
    

    唯一的缺点是,后退按钮的宽度没有改变,因此您的UINavigationBar 标题可能会偏离中心。

    【讨论】:

      【解决方案2】:
      UIBarButtonItem *customItem = [[[UIBarButtonItem alloc] initWithCustomView:plainButton] autorelease];
      self.navigationItem.leftBarButtonItem = customItem; 
      [(UIButton*)self.navigationItem.leftBarButtonItem.customView addTarget:self.navigationController action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside];
      

      制作一个自定义 barButtonItem 并将其替换为默认的后退按钮。

      【讨论】:

      • 感谢 BabyPanda,但我希望能够在系统范围内设置它,而不仅仅是每个视图。
      • 通过“系统范围”,如果您的意思是为所有viewControllers设置它,那么您可以创建一个类似UIViewController+CustomNavigation的类别并在viewControllers中实现类别方法- (void)setLeftBarButtonItem:(UIButton*)plainButton;
      • 嘿 BabyPanda,这确实是我正在做的,但我只是想知道是否有办法使用导航栏的外观属性来做到这一点。我真的不喜欢必须为每个类导入和调用类别,希望可能有一种“更清洁”的方式来做到这一点
      • 好吧,可惜我还没有找到一种方法来勉强实现导航栏外观来完成这项工作......
      【解决方案3】:

      发现这个问题告诉我不幸的是我不能做我想做的事:(

      Can you use UIAppearance to set the titleview of UINavigationItem?

      【讨论】:

        【解决方案4】:

        如果您需要与默认BackBarButton 图像相同的外观,您也可以不使用返回栏按钮图像来执行此操作。在导航到其他控制器之前,只需编写以下几行:

          UIBarButtonItem *backButton = [[[UIBarButtonItem alloc]
              initWithTitle:@"Back"
                      style:UIBarButtonItemStyleBordered
                     target:nil
                     action:nil] autorelease];
          [[viewcontroller navigationItem] setBackBarButtonItem:backButton];  
        

        这将解决您的问题。此外,您还可以根据需要使用barButton 的另一种方法更改图像。 如果您发现任何问题或您正在寻找其他问题,请告诉我。

        【讨论】:

        • 感谢 Turan,但我希望能够在系统范围内设置它,而不仅仅是每个视图。
        【解决方案5】:

        我的解决方法是:

            UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: UIControlState.Normal)
        

        这适用于 iOS 8。

        【讨论】:

          【解决方案6】:

          我知道这是一个旧帖子,但如果我看到了这个帖子,肯定还有其他人也在寻找它。

          只是添加到斯蒂芬的答案:这会使正常和选定状态的文本变为白色。这使得它在系统范围内只有 2 行。但是,图像占用了白色文本的空间,看起来很糟糕。

          对于系统范围的后退按钮,您使用上面的代码

          UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: UIControlState.Normal)
          UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: UIControlState.Highlighted)
          

          【讨论】:

          • 这可行,但唯一的问题是它会影响 all UIBarButtonItems,而不仅仅是后退按钮。
          【解决方案7】:

          Swift 3.x

          在 AppDelegate 文件中添加这一行
          UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-16
            相关资源
            最近更新 更多