没有标题的UINavigationBar自定义后退按钮

Kid*_*ddo 227 user-interface uinavigationbar ios

如何在没有标题的情况下自定义iOS 7及更高版本中的导航后退按钮?(即仅限箭头)

self.navigationItem.leftBarButtonItem = self.editButtonItem;
Run Code Online (Sandbox Code Playgroud)

我只是想知道他们是否有任何self.backButtonItem;

要么

这样的事情?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];
Run Code Online (Sandbox Code Playgroud)

Kyl*_*man 309

这实际上非常简单,这就是我的工作:

目标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];
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Run Code Online (Sandbox Code Playgroud)

将此行放在正在推送到堆栈(前一个视图控制器)的视图控制器中.新推的视图控制器后退按钮现在将显示您为initWithTitle添加的内容,在本例中为空字符串.

  • 谢谢凯尔!我一直在寻找一种方法来重命名iOS 7中的默认后退按钮.我将它放在视图控制器中的`prepareForSegue`中并且它工作得很好. (7认同)
  • 我用过这个,但标题来了,并以动画的方式消失了? (3认同)
  • 我觉得这需要更新,它现在什么也没显示,箭头默认不存在? (3认同)

Tho*_*mon 197

我找到了一个简单的方法来使用iOS单箭头制作我的后退按钮.

让我们假设您有一个导航控制器从ViewB转到ViewA.在IB中,选择ViewA的导航栏,您应该看到以下选项:标题,提示和后退按钮.

ViewA导航栏选项

ViewA导航栏选项

诀窍是在先前视图控制器(视图A)的选项中选择命运视图控制器后退按钮标题(ViewB ).如果您没有填写"后退按钮"选项,iOS将自动将标题设置为"返回",使用前一个视图控制器的标题.因此,您需要使用单个空格填充此选项.

在"后退按钮"选项中填充空格

在

结果:

结果:

  • 它的工作原理,只需要注意 - 你需要为**之前的**控制器设置"后退按钮"(例如导航控制器中的rootViewController) (53认同)

mt8*_*t81 66

只需使用图像!

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;
}
Run Code Online (Sandbox Code Playgroud)

SWIFT 4:

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self
Run Code Online (Sandbox Code Playgroud)

ICON-Back.png

图标回

Icon-Back@2x.png

图标回@ 2X

Icon-Back@3x.png

图标回@ 23X

  • `navigationController?.interactivePopGestureRecognizer?.delegate = self`可以保持滑动后退手势 (13认同)
  • 使用此解决方案,您似乎放弃了"轻扫回去"功能. (4认同)

小智 28

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];
}
Run Code Online (Sandbox Code Playgroud)

这将更改默认的"返回"文本,但会保留iOS7样式的后退箭头.您还可以在推动视图之前更改后退箭头的色调颜色:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助!

  • 这非常有效,似乎比其他选项更好.例如,与其他一些答案不同,标题永远不需要重置为之前的值. (2认同)

Swa*_*p S 26

没什么需要做的.您可以通过故事板本身实现相同的目标.

只需转到根导航控制器并给出一个空格.切记不要你想要没有标题的后退按钮的控制器,而是根导航控制器.

如下图所示. 这适用于iOS 7和iOS 8


Nic*_*cky 22

虽然Kyle Begeman的答案完全可以解决问题,但在每个视图控制器中使用此代码是非常烦人的.我最终得到了一个简单的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
Run Code Online (Sandbox Code Playgroud)

  • 说真的,你们都没有通过任何其他解决方案.实施解决方案@nicky发布为类别,不要三思而后行.这是一个很好的可重用解决方案,如果您添加此Prefix.pch文件,可以在应用程序范围内实现.Apple鼓励使用[类别向现有类添加方法](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html),您应尽可能利用此功能. (2认同)

hir*_*shi 21

编辑:2014-04-09:当我获得声誉时,我感到很抱歉,因为我不再使用这个技巧了.我推荐Kyle的回答.还注意到selfself.navigationItem.backBarButtonItem是不显示后退按钮视图控制器,但以前的视图控制器进行回去.

如果您不需要为前一个视图控制器提供标题文本,只需用空白字符串填充标题;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

这将阻止在推动的视图控制器上显示带有V形的"后退".

编辑:即使您使用非空白标题文本,在viewWillAppear:工作中设置上一个视图控制器的标题,除了标题可以在视图控制器弹出时闪烁闪烁.我认为"推特应用程序"似乎做了更微妙的黑客以避免闪烁.


Gut*_*ujo 20

这有效,但它会删除上一项的标题,即使你回弹它:

self.navigationController.navigationBar.topItem.title = @"";
Run Code Online (Sandbox Code Playgroud)

只需viewDidLoad在推送的View Controller 上设置此属性即可.

  • 这将删除上一项的标题,即使您弹回它.不是很好 :( (17认同)

r_1*_*_19 10

这就是我如何做到这一点,以及最简单,最有效,最明确的方式.

这有效,如果嵌入 Navigation Controller

斯威夫特3

viewDidLoad我加入这个在视图控制器,你要后退按钮是刚刚箭头.

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

这与@Kyle Begeman的答案的不同之处在于,您在视图控制器上调用此选项,您希望后退按钮只是箭头,而不是推送堆栈视图控制器.


nul*_*ull 7

您无法按照自己的方式访问导航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];
}
Run Code Online (Sandbox Code Playgroud)

当然:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

  • 你需要一个平滑过渡的面具."*如果你想使用自定义图像来替换默认的雪佛龙,你还需要创建一个自定义的蒙版图像.iOS 7使用蒙版使前一个屏幕的标题在导航过程中出现或消失在人字形中过渡". (3认同)
  • @null你将失去iOS 7的左右滑动手势! (2认同)

zh.*_*zh. 6

来自iOS6的简单黑客也适用于iOS7:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

编辑: 不要使用这个黑客.请参阅评论了解详情.

  • 不要使用这个黑客.Apple的代码在64位设备上存在一个错误,它会阻止在您创建条形按钮标题偏移时出现模态视图.[更多详情](http://stackoverflow.com/a/19119388/674741). (6认同)

Jag*_*gie 6

目标:将 所有后退按钮自定义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];
}
Run Code Online (Sandbox Code Playgroud)

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
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

SWIFT 4

对于那些想要创建自定义后退按钮并删除其标题的用户,请在视图控制器中使用以下代码推送新代码:

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)
Run Code Online (Sandbox Code Playgroud)

为了更通用,请执行以下操作:

  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)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后按如下方式在视图控制器中使用它:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
    
    Run Code Online (Sandbox Code Playgroud)