简介: 通过不同实际场景的描述,供大家参考完成 Native 页面的定制化开发。

很多 mPaaS Coder 在接入 H5 容器后都会对容器的导航栏进行深度定制,本文旨在通过不同实际场景的描述,供大家参考完成 Native 页面的定制化开发。

欢迎关注 mPaaS 公众号,下期推文,我们将为大家介绍 jsapi 下如何动态修改导航栏,敬请期待

Native 修改导航栏左侧返回按钮

(一)自定义 NBPluginBase 插件中修改

1.自定义原生 BarButtonItem

监听 kNBEvent_Scene_NavigationItem_Left_Back_Create_Before,在此监听事件中设置自定义 BarButtonItem

//监听kNBEvent_Scene_NavigationItem_Left_Back_Create_Before,在此监听事件中:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 44, 44);
button.backgroundColor = [UIColor whiteColor];
[button setTitle:@"取消" forState:UIControlStateNormal];
button.titleLabel.font = [UIFont systemFontOfSize:14.0];
[button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; event.context.currentViewController.navigationItem.leftBarButtonItem.customView = button;

注:此方案自定义button,需要自行实现关闭页面逻辑。

2.修改返回按钮

监听 kNBEvent_Scene_NavigationItem_Left_Back_Create_After,在此监听事件中修改默认返回按钮样式,包括文案颜色、返回箭头等,文案内容默认不可修改。

//监听kNBEvent_Scene_NavigationItem_Left_Back_Create_After,在此监听事件中:
// 修改返回按钮样式
NSArray *leftBarButtonItems = event.context.currentViewController.navigationItem.leftBarButtonItems;
if ([leftBarButtonItems count] == 1) {
if (leftBarButtonItems[0] && [leftBarButtonItems[0] isKindOfClass:[AUBarButtonItem class]]) {
//在默认返回按钮基础上,修改返回箭头和文案颜色
AUBarButtonItem *backItem = leftBarButtonItems[0];
backItem.backButtonColor = [UIColor greenColor];
backItem.titleColor = [UIColor orangeColor];// [UIColor colorFromHexString:@"#00ff00"];
//隐藏、显示返回箭头
backItem.hideBackButtonImage = NO;
//backItem.backButtonTitle; 标题内容更改无效。 // 隐藏返回文案:文案设置为透明,保留返回按钮 s 点击区域
//backItem.titleColor = [UIColor clearColor];
}
}

(二)H5容器中自定义修改

1.方式一,在 viewWillAppear 获取自定义启动参数,根据参数自定义返回按钮。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 当前页面的启动参数
NSDictionary *expandParams = self.psdScene.createParam.expandParams;
NSLog(@"[mpaas] expandParams: %@", expandParams);
}

获取启动参数后,依据自定义参数实现自定义按钮。

// 修改默认返回按钮文案颜色
NSString *backButtonColorString = expandParams[@"backButtonColor"];
if ([backButtonColorString isKindOfClass:[NSString class]] && [backButtonColorString length] > 0) {
UIColor *backButtonColor = [UIColor colorFromHexString:backButtonColorString];
NSArray *leftBarButtonItems = self.navigationItem.leftBarButtonItems;
if ([leftBarButtonItems count] == 1) {
if (leftBarButtonItems[0] && [leftBarButtonItems[0] isKindOfClass:[AUBarButtonItem class]]) {
backItem.backButtonTitle = @"测试";// 返回按钮title
backItem.titleColor = backButtonColor;// 返回按钮文本颜色
backItem.backButtonColor = [UIColor blueColor];// 设置箭头颜色
backItem.hideBackButtonImage = NO;//隐藏返回按钮图片,提供给框架使用
// 返回按钮图片 backItem.backButtonImage; 设置无效,只可隐藏or显示
}
}
}

2.方式二,可以在 viewWillAppear 自定义整个返回区域 AUBarButtonItem 按钮、个数:

AUBarButtonItem *backItem = [AUBarButtonItem barButtonItemWithIconFontName:kICONFONT_BACK iconColor:[UIColor lightGrayColor] target:self action:@selector(custBack:)];  

AUBarButtonItem *backItem = [AUBarButtonItem backBarButtonItemWithTitle:@"测试" backArrowColor:[UIColor redColor] target:self action:@selector(custBack:)];
backItem.customView.frame = CGRectMake(0, 0, 44, 44); AUBarButtonItem *closeItem = [AUBarButtonItem barButtonItemWithIconFontName:kICONFONT_SYSTEM_CANCEL_BOLD iconColor:[UIColor lightGrayColor] target:self action:@selector(custClose:)];
closeItem.customView.frame = CGRectMake(0, 0, 30, 44); self.navigationItem.leftBarButtonItems = @[backItem,closeItem];

如果要修改 BarButtonItem 的文字大小、颜色等深度定制可以参考以下代码:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 40, 40);
[button setTitle:@"我的" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setBackgroundColor: [UIColor whiteColor]];
button.titleLabel.font = [UIFont systemFontOfSize:14.0f];
AUBarButtonItem *backItem = [[AUBarButtonItem alloc] initWithCustomView:button];

//返回按钮事件
- (void)custBack:(id)sender{
NSLog(@"back -----");
[self back];
}
//关闭所有session
- (void)custClose:(id)sender{
NSLog(@"close ------");
NSArray<NBSession *> *sessions = [[NBContext sharedContext] sessions];
for (NBSession* session in sessions) {
[[NBContext sharedContext] exitSession:session animated:YES];
}
}

Native 修改导航栏左侧关闭按钮

(一)在自定义 NBPluginBase 插件中关闭按钮需自行创建

监听 kNBEvent_Scene_NavigationItem_Left_Close_Create_Before,在此监听事件中创建关闭按钮。

//监听kNBEvent_Scene_NavigationItem_Left_Close_Create_Before,在此监听事件中:
// 创建关闭按钮
[event preventDefault];
NBNavigationItemLeftCloseEvent *itemEvent = (NBNavigationItemLeftCloseEvent *)event;
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 44, 44);
button.backgroundColor = [UIColor whiteColor];
[button setTitle:@"关闭" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
itemEvent.customView = button;

监听kNBEvent_Scene_NavigationItem_Left_Close_Create_After,在此监听事件中修改关闭按钮样式。

//监听kNBEvent_Scene_NavigationItem_Left_Close_Create_After,在此监听事件中:
// 修改关闭按钮样式
[event preventDefault];
NBNavigationItemLeftCloseEvent *itemEvent = (NBNavigationItemLeftCloseEvent *)event;
UIButton *closeButton = (UIButton *)itemEvent.customView;
[closeButton setTitle:@"关闭" forState:UIControlStateNormal];
[closeButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];

Native 修改导航栏标题

(一)在viewWillAppear 获取自定义启动参数,根据参数自定义标题

//打开H5离线包
NSString *appId = @"20190927";
[[MPNebulaAdapterInterface shareInstance]startH5ViewControllerWithNebulaApp:@{@"appId":appId,@"defaultTitle":@"测试",@"readTitle":@"NO",@"titleColor":@"ff0000",@"titleFont":@"18.0"}];//启动参数设置标题文案、颜色、大小;

这里的参数key值appId、defaultTitle、readTitle为框架默认不可修改,其余参数 key 值自定义。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 当前页面的启动参数
NSDictionary *expandParams = self.psdScene.createParam.expandParams;
NSLog(@"[mpaas] expandParams: %@", expandParams); // 设置导航栏标题
NSString *titleColorString = expandParams[@"titleColor"];
NSString *titleFont = expandParams[@"titleFont"];
if ([titleColorString isKindOfClass:[NSString class]] && [titleColorString length] > 0 && [titleFont length] > 0) {
UIColor *titleColor = [UIColor colorFromHexString:titleColorString];
id<NBNavigationTitleViewProtocol> titleView = self.navigationItem.titleView;
[[titleView mainTitleLabel] setTextColor:titleColor]; float font = [titleFont floatValue];
[[titleView mainTitleLabel] setFont:[UIFont systemFontOfSize:font]]; }
}

Native 修改导航栏右侧按钮

(一)NBPluginBase 插件中自定义修改

1.在 NBPluginBase 中,

监听 kNBEvent_Scene_NavigationItem_Right_Setting_Create_Before,在此监听事件中创建导航栏右侧按钮。

//监听kNBEvent_Scene_NavigationItem_Right_Setting_Create_Before,在此监听事件中:
NBNavigationItemRightSettingEvent *settingEvent = (id)event;
settingEvent.adjustsWidthToFitText = YES;
settingEvent.maxWidth = [UIScreen mainScreen].bounds.size.width / 4.0f;
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 33, 40);
[button setTitle:@"设置" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setBackgroundColor: [UIColor whiteColor]];
settingEvent.customView = button;
[event preventDefault];

2.在 NBPluginBase 中

监听kNBEvent_Scene_NavigationItem_Right_Setting_Create_After,在此监听事件中修改导航栏右侧按钮。

//监听kNBEvent_Scene_NavigationItem_Right_Setting_Create_After,在此监听事件中:
NBNavigationItemRightSettingEvent *settingEvent = (id)event;
settingEvent.adjustsWidthToFitText = YES;
settingEvent.maxWidth = [UIScreen mainScreen].bounds.size.width / 4.0f;
UIButton *button = settingEvent.customView;
button.titleLabel.font = [UIFont systemFontOfSize:14.0f];
button.frame = CGRectMake(0, 0, 40, 40);
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
[button setBackgroundColor: [UIColor whiteColor]];
[event stopPropagation];//去掉默认按钮图片

注:

1. 在插件中自定义导航栏右侧按钮,必须要在打开H5容器的启动参数中设置@{@"showOptionMenu": @"YES"} 否则设置右侧按钮无效。

2. 必须要在kNBEvent_Scene_NavigationItem_Right_Setting_Create_After监听事件中实现[event stopPropagation];否则showOptionMenu按钮的默认图片没有办法去掉。

(二)H5 容器中自定义修改

1.在 viewWillAppear 获取自定义启动参数,根据参数自定义设置 AUBarButtonItem按钮。

(1)图片样式:

AUBarButtonItem *rightItem1 = [[AUBarButtonItem alloc] initWithImage:image1 style:UIBarButtonItemStylePlain target:self action:@selector(rightBarItemPressed1)];
AUBarButtonItem *rightItem2 = [[AUBarButtonItem alloc] initWithImage:image2 style:UIBarButtonItemStylePlain target:self action:@selector(rightBarItemPressed2)];
//单个按钮
self.navigationItem.rightBarButtonItem = rightItem1;
//多个按钮
self.navigationItem.rightBarButtonItems = @[rightItem1, rightItem2];

(2)文字样式:

AUBarButtonItem *titleItem1 = [[AUBarButtonItem alloc]initWithTitle:@"按钮" style:UIBarButtonItemStylePlain target:self action:@selector(rightBarItemPressed1)];
AUBarButtonItem *titleItem2 = [[AUBarButtonItem alloc]initWithTitle:@"右侧" style:UIBarButtonItemStylePlain target:self action:@selector(rightBarItemPressed2)];
//单个按钮
self.navigationItem.rightBarButtonItem = rightItem1;
//多个按钮
self.navigationItem.rightBarButtonItems = @[titleItem1, titleItem2];

2.如果要修改 BarButtonItem 的文字大小、颜色等深度定制参考以下代码:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 40, 40);
[button setTitle:@"我的" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setBackgroundColor: [UIColor whiteColor]];
button.titleLabel.font = [UIFont systemFontOfSize:14.0f];
AUBarButtonItem *rightItem = [[AUBarButtonItem alloc] initWithCustomView:button];

Native 自定义导航栏

(一)隐藏原生导航栏

自定义导航栏,要先隐藏原生导航栏。

//隐藏容器类navBar
self.options.showTitleBar = NO;
//隐藏系统层navBar
[self.navigationController setNavigationBarHidden:YES];

(二)创建 navBarView

  1. 创建 AUCustomNavigationBar 初始化方法必须要 navigationBarForCurrentVC: 否则按钮设置无效。
  2. 赋值给 self.customNavigationBar 容器会自动适配H5页面高度,否则需自行适配页面。
//创建navBarView,必须要用此方法
AUCustomNavigationBar *navBar = [AUCustomNavigationBar navigationBarForCurrentVC:self];
[self.view addSubview:navBar];
//设置给容器VC
self.customNavigationBar = navBar;

(三)自定义背景样式

设置背景色、渐变色等,setNavigationBarBlurEffective 设置毛玻璃效果,支持更多样式自选。

//设置背景颜色,渐变色可自行设置
navBar.backgroundColor = [UIColor lightGrayColor];
[navBar setNavigationBarBlurEffectiveWithStyle:UIBlurEffectStyleDark]; // 毛玻璃效果,更多样式自选

(四)设置左侧导航按钮

1.设置左侧导航按钮方式一:

//导航左侧按钮
navBar.backButtonTitle = @"取消";
navBar.backTitleLabel.font = [UIFont systemFontOfSize:16.0];
navBar.backButtonTitleColor = [UIColor orangeColor];
navBar.backButtonImage = [UIImage imageNamed:@"back_button@2x"];
[navBar addSubview:navBar.leftItem];

2.设置左侧导航按钮,自行关联事件方式二,与方式一冲突,两者选其一。

//自行关联事件方式,与上述属性设置冲突。
//image和title两者选其一
[navBar setNavigationBarLeftItemWithImage:[UIImage imageNamed:@"back_button@2x"]target:self action:@selector(leftItemImageClick)];
[navBar setNavigationBarLeftItemWithTitle:@"取消" target:self action:@selector(leftItemTitleClick)];

(五)设置导航栏标题

1.设置导航栏标题方式一:

//设置导航栏标题
navBar.title = @"标题";
navBar.titleColor = [UIColor redColor];
navBar.titleLabel.font = [UIFont systemFontOfSize:14.0];

2.设置导航栏标题,AUDoubleTitleView双标题titleView方式二:

//设置双标题titleView
AUDoubleTitleView *titleView = [[AUDoubleTitleView alloc]initWithTitle:@"主标题" detailTitle:@"副标题"];
navBar.titleView = titleView;
//这里使用了mPaaS下双标题UI,也可自行实现titleView

(六)设置导航栏右侧按钮

1.单个右侧按钮

(1)设置单个按钮方式一:

//设置导航右侧按钮
navBar.rightItemTitle = @"菜单";
navBar.rightItemTitleColor = [UIColor blackColor];
//image和title两者选其一
navBar.rightItemImage = [UIImage imageNamed:@"rightTT@2x"];

(2)设置单个按钮方式二:

//自行关联事件方式
//image和title两者选其一
[navBar setNavigationBarRightItemWithTitle:@"菜单" target:self action:@selector(rightItemTitleClick)];
[navBar setNavigationBarRightItemWithImage:[UIImage imageNamed:@"rightTT@2x"] target:self action:@selector(rightItemImageClick)];

2.深度自定义单、多个右侧按钮

深度自定义右侧按钮、文字、大小、图片,自行关联事件。

//深度自定义右侧按钮、文字、大小、图片、关联事件
AUButton *button = [AUButton buttonWithStyle:AUButtonStyleNone title:@"右一" target:self action:@selector(rightItemTitleClick)];
button.titleLabel.font = [UIFont systemFontOfSize:16.0];
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; AUButton *button1 = [AUButton buttonWithStyle:AUButtonStyleNone];
[button1 setImage:[UIImage imageNamed:@"rightTT@2x"] forState:UIControlStateNormal];
navBar.rightItemList = @[button,button1];

本文作者:阿里云 mPaaS TAM 团队(石鹏飞 荣阳)

原文链接

本文为阿里云原创内容,未经允许不得转载。

技术干货 | Native 页面下如何实现导航栏的定制化开发?的更多相关文章

  1. iOS7 下使用SVPullToRefresh 下拉刷新导航栏位置错误

    iOS7 下使用SVPullToRefresh 下拉刷新导航栏位置错误: 下拉刷新之后,tableview的第一列会跑到导航栏的下面: 修正:添加如下代码 /** * 下拉刷新 增加一个: */ // ...

  2. vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改

    vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改.vue <div class="commonHeader" v-bind:class=" ...

  3. React Native(四)——顶部以及底部导航栏实现方式

    效果图: 一步一步慢慢来: 其实刚入手做app的时候,就应该做出简单的顶部以及底部导航栏.无奈又在忙其他事情,导致这些现在才整理出来. 1.顶部导航栏:react-native-scrollable- ...

  4. Vue页面手动刷新,导航栏激活项还原到初始状态问题解决方案

    场景描述:在页面中存在顶部导航和左侧导航,左侧导航和右侧内容区使用了命名视图实现,点击左侧导航的链接时,右侧内容区相应显示不同组件内容.问题:在当前链接手动刷新浏览器(例如:浏览器地址为/enterp ...

  5. iOS---实现简书和知乎的上滑隐藏导航栏下拉显示导航栏效果

    因为自己用简书和知乎比较多,所以对其导航栏的效果比较好奇,自己私下里找资料实现了一下.这个效果的关键点在于下方可供滑动的内容的便宜距离inset的改变,以及滑动的scrollview代理的执行,废话不 ...

  6. Android_ViewPager+Fragment实现页面滑动和底部导航栏

    1.Xml中底部导航栏由一个RadioGroup组成,其上是ViewPager. <?xml version="1.0" encoding="utf-8" ...

  7. iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七

    不知大家有没有遇见过自己写的tableview被导航栏遮挡住的问题,反正我是遇见过! 因为在ios7以后所有的UIViewController创建后默认就是full Screen的,因此如果带导航栏的 ...

  8. css三级下拉的导航栏

    #menu{ height: 65px; width:100%; background-color: rgba(0, 0, 0, 0.5);}#menu ul{ list-style: none;}# ...

  9. React Native 的组件之底部导航栏 TabBarIOS(一)

    import React,{Component}from 'react'; import { AppRegistry, StyleSheet, Text, View, TabBarIOS, } fro ...

  10. React native中DrawerNavigator,StackNavigator,TabNavigator导航栏使用

    import React from 'react'; import { View, Text,Button } from 'react-native'; import { DrawerNavigato ...

随机推荐

  1. PAT 甲级1008【1008 Elevator】

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  2. 《世嘉新人培训教材—游戏开发》2DGraphics1项目cmake构建

    <世嘉新人培训教材-游戏开发>作为经典的游戏开发教程,提供了相关样例代码供我们进行开发使用.但是该样例是基于VS进行编写构建的,而本人日常喜欢CLion进行C/C++开发,于是准备使用cm ...

  3. 记录--你不知道的Js高级方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在Js中有一些比较冷门但是非常好用的方法,我在这里称之为高级方法,这些方法没有被广泛使用或多或少是因为存在一些兼容性的问题,不是所有 ...

  4. Mysql中的锁(case篇)

    case1(表锁的读-写-读阻塞) 上篇文档中提到过 WRITE locks normally have higher priority than READ locks to ensure that ...

  5. Oracle 几种行转列的方式 sum+decode sum+case when pivot

    原始数据: 方式一: select t_name, sum(decode(t_item, 'item1', t_num, 0)) item1, sum(decode(t_item, 'item2', ...

  6. 参数 ora_input_emptystr_isnull 对于数据存储的影响

    原生的PG 对于 '' 和 null 认为是不同值:空值 和不确定值:而oracle 认为二者都是不确定的值.KingbaseES 为了兼容Oracle,增加了参数ora_input_emptystr ...

  7. C++ 中的 volatile 和 atomic

    C++ 中的 volatile 和 atomic 0. TL;DR std::atomic 用于多线程并发场景,有两个典型使用场景: 原子操作:对 atomic 变量的操作(读/写/自增/自减)仿佛受 ...

  8. 手写数字图片识别——DL 入门案例

    Deep Learning Demo of Primary 下面介绍一个入门案例,如何使用TensorFlow和Keras构建一个CNN模型进行手写数字识别,以及如何使用该模型对自己的图像进行预测.尽 ...

  9. 许北林:我为什么加入OpenHarmony生态?又为什么要做“启航KP”开发套件?

    许北林 软通动力 资深项目经理 在全球开源趋势下,中国正逐渐成为全球开源软件的主要使用者和核心贡献者.今天我们来认识一位接触 OpenHarmony 不到一年,便带领团队成功开发出一款"启航 ...

  10. Git 教程:解密 .gitignore 文件、合并分支、解决冲突、及 Git 帮助

    Git 帮助 如果你忘记了命令或命令的选项,你可以使用 Git 帮助. 在命令行中,有几种不同的使用帮助命令的方式: git command -help - 查看特定命令的所有可用选项 git hel ...