iOS 导航栏-返回按钮-自定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 导航栏-返回按钮-自定义相关的知识,希望对你有一定的参考价值。

参考技术A

在开发过程中,我们经常遇到使用系统导航栏的功能,如何更改返回按钮的样式呢?

重写返回按钮一般是添加leftBarButtonItems。如果导航栏添加了leftBarButtonItems之后,会自动隐藏返回按钮backBarButtonItem。

当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面。但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,可能是其他的页面,我们需要拦截返回按钮的pop操作。

1、重写返回按钮
具体操作查看上面“二、重写返回按钮”。
缺点 :若重写了某个界面的返回按钮,感觉应用整体就不统一了。而且每有一个界面有这个需求都需要重新自定义一个返回按钮,显得不优雅,工作繁琐。

2、为 UINavigationController 添加 category

我们可以为 UINavigatonController 创建一个 Category,来定制navigationBar: shouldPopItem: 的逻辑。

使用时,只需要在需要拦截返回按钮事件的控制器中,应用#import "UIViewController+BackButtonHandler.h",并重写-(BOOL)navigationShouldPopOnBackButton方法即可。

自定义 UIView XIB 内的 iOS 导航返回按钮(无导航控制器)

【中文标题】自定义 UIView XIB 内的 iOS 导航返回按钮(无导航控制器)【英文标题】:iOS navigation back button inside custom UIView XIB (without navigation controller) 【发布时间】:2013-12-12 14:44:34 【问题描述】:

我有一个应用程序的每个视图控制器中都包含一个视图的可重用 XIB。

这个 XIB 负责渲染当前不是导航栏的顶部视图。 现在不需要导航项。

但是,基于上下文导航,用户可能需要能够返回到上一个视图,并且在这种情况下需要返回按钮。

我想让这个后退按钮成为这个可重复使用的 XIB 的一部分,它在每个场景中形成顶视图 - 但只是有条件的,而不是无处不在。

我阅读了有关 SO 的文档和其他问题,这些问题告诉我 UIBarButtonItem 仅与导航控制器一起存在。

我认为这对我来说太过分了,因为:

1) 我不需要到处都有返回按钮

2) 我不需要导航栏的外观作为顶栏。我的顶栏已经在我的 XIB 中设计好了。

我应该改变什么?

我的 XIB?如果我可以在这里为后退按钮创建插座并根据我所在的视图控制器隐藏它们,那将是一个非常受欢迎的解决方案。 我的 XIB 视图 .m 文件? 我想要返回按钮的视图控制器代码?

非常感谢有代码的示例。

【问题讨论】:

【参考方案1】:

您可以简单地将按钮添加到 xib。并在视图控制器类中实现按钮动作如下:

- (IBAction) backButtonAction

    [self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案2】:

创建一个基本的 UIViewController 并不是一个很好的选择,因为我只是想在几个屏幕中使用这个后退按钮,没有必要为它创建一个完整的基类。

最后,我所做的是不可避免的:将第一个视图控制器嵌入到导航控制器中。 然后从第一个 VC 向所有其他 VC 推送 Segue。

因为我不想要标准导航栏,所以我做了以下操作:

[self.navigationcontroller setnavigationbarhidden:YES];

对于后退按钮,我在自己的自定义 XIB 视图中添加了一个自定义 UIButton,并在给定的视图控制器中有条件地隐藏/显示它。

在显示它的后退按钮上,我添加了一个可以执行以下操作的目标:

[self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案3】:

为您要添加导航栏的所有视图控制器创建一个通用的基本视图控制器。在基类中添加您的 XIB 并在基类中创建一个函数来启用和禁用后退按钮。

MyBaseClassVC.h

@interface MyBaseClassVC : UIViewController

@property (nonatomic, strong) UIView *titleBarView;

- (void) enableBackButtonInTitleBar;

//you can customize your back button with diff image and selector
- (void) enableBackButtonInTitleBarWithImageName:(NSString*)imageName andSelectorName:(NSString*)selectorName;

@end

MyBaseClassVC.m

......

/**
 * Enable the Left or Back Button
 */
- (void) enableBackButtonInTitleBar


UIImage *leftBarButtonImage = [UIImage imageNamed:@"Back_btn"];
UIButton *rightBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
rightBarButton.bounds = CGRectMake( 0, 20, leftBarButtonImage.size.width, leftBarButtonImage.size.height);
[rightBarButton setImage:leftBarButtonImage forState:UIControlStateNormal];
[rightBarButton addTarget:self action:@selector(backToPreviousPage) forControlEvents:UIControlEventTouchUpInside];

[topbarview addsubview rightBarButton];

.....

在其他 viewcontroller 中子类化这个 viewcontroller。

【讨论】:

【参考方案4】:

对于这种情况,您需要考虑应用程序类的设计。我给你一个非常简单的例子,它会让你想到一个称为“继承”的 OOP 概念。

您可以调整代码以使用您的标头(即 XIB)

我将创建一个基类btBaseViewController.hbtBaseViewController.m。这个类将具有我希望我的所有视图控制器都拥有的最常见的功能

    带有按钮的自定义标题视图。 内容视图。 一种渲染UI的方法。 另一种启用/禁用后退按钮的方法。

在文件btBaseViewController.h 中将其设为这样。

#import <UIKit/UIKit.h>

@interface btBaseViewController : UIViewController

@property(nonatomic, retain) btHeader *headerView;

-(void)showHeaderViewWithBackButton:(BOOL)backButton;

@end

btBaseViewController.m中实现方法为

-(void)showHeaderViewWithBackButton:(BOOL)backButton 
    // Now implement this method in a way to show the backbutton or not depending on 
    [headerView.backButton setAlpha:backButton];

现在假设你有btHomeViewController,它从btBaseViewController派生而来

#import "btBaseViewController.h"

@interface btHomeViewController : btBaseViewController

@end

btHomeViewController.mviewdidload中写代码为

-(void)viewDidLoad 
    if(self.navigationController.viewControllers.count >=2 ) 
     // it means you have some thing on viewcontroller & you can go back
      [self showHeaderViewWithBackButton:YES];
    

我已尽力提出解决方案。您需要对其进行更多调整。

【讨论】:

以上是关于iOS 导航栏-返回按钮-自定义的主要内容,如果未能解决你的问题,请参考以下文章

自定义iOS导航栏背景,标题和返回按钮文字颜色

自定义iOS7导航栏背景,标题和返回按钮文字颜色

iOS中自定义导航栏左边返回按钮和按钮不能靠左的问题

iOS中自定义导航栏左边返回按钮和按钮不能靠左的问题

iOS 调整导航栏返回按钮的位置

ios怎么改变全局的导航条返回按钮