技术干货|Native页面下如何实现导航栏的定制化开发?

如题所述

第1个回答  2024-09-18

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

Native修改导航栏左侧返回按钮(一)自定义NBPluginBase插件中修改1.自定义原生BarButtonItem

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

//监听kNBEvent_Scene_NavigationItem_Left_Back_Create_Before,在此监听事件中:UIButton*button=[UIButtonbuttonWithType:UIButtonTypeCustom];button.frame=CGRectMake(0,0,44,44);button.backgroundColor=[UIColorwhiteColor];[buttonsetTitle:@"取消"forState:UIControlStateNormal];button.titleLabel.font=[UIFontsystemFontOfSize:14.0];[buttonsetTitleColor:[UIColorblueColor]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([leftBarButtonItemscount]==1){if(leftBarButtonItems[0]&&[leftBarButtonItems[0]isKindOfClass:[AUBarButtonItemclass]]){//在默认返回按钮基础上,修改返回箭头和文案颜色AUBarButtonItem*backItem=leftBarButtonItems[0];backItem.backButtonColor=[UIColorgreenColor];backItem.titleColor=[UIColororangeColor];//[UIColorcolorFromHexString:@"#00ff00"];//隐藏、显示返回箭头backItem.hideBackButtonImage=NO;//backItem.backButtonTitle;标题内容更改无效。//隐藏返回文案:文案设置为透明,保留返回按钮s点击区域//backItem.titleColor=[UIColorclearColor];}}

(二)H5容器中自定义修改1.方式一,在viewWillAppear获取自定义启动参数,根据参数自定义返回按钮。-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];//当前页面的启动参数NSDictionary*expandParams=self.psdScene.createParam.expandParams;NSLog(@"[mpaas]expandParams:%@",expandParams);}

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

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

2.方式二,可以在viewWillAppear自定义整个返回区域AUBarButtonItem按钮、个数:AUBarButtonItem*backItem=[AUBarButtonItembarButtonItemWithIconFontName:kICONFONT_BACKiconColor:[UIColorlightGrayColor]target:selfaction:@selector(custBack:)];AUBarButtonItem*backItem=[AUBarButtonItembackBarButtonItemWithTitle:@"测试"backArrowColor:[UIColorredColor]target:selfaction:@selector(custBack:)];backItem.customView.frame=CGRectMake(0,0,44,44);AUBarButtonItem*closeItem=[AUBarButtonItembarButtonItemWithIconFontName:kICONFONT_SYSTEM_CANCEL_BOLDiconColor:[UIColorlightGrayColor]target:selfaction:@selector(custClose:)];closeItem.customView.frame=CGRectMake(0,0,30,44);self.navigationItem.leftBarButtonItems=@[backItem,closeItem];

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

UIButton*button=[UIButtonbuttonWithType:UIButtonTypeCustom];button.frame=CGRectMake(0,0,40,40);[buttonsetTitle:@"我的"forState:UIControlStateNormal];[buttonsetTitleColor:[UIColorblackColor]forState:UIControlStateNormal];[buttonsetBackgroundColor:[UIColorwhiteColor]];button.titleLabel.font=[UIFontsystemFontOfSize:14.0f];AUBarButtonItem*backItem=[[AUBarButtonItemalloc]initWithCustomView:button];

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

Native修改导航栏左侧关闭按钮(一)在自定义NBPluginBase插件中关闭按钮需自行创建

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

//监听kNBEvent_Scene_NavigationItem_Left_Close_Create_Before,在此监听事件中://创建关闭按钮[eventpreventDefault];NBNavigationItemLeftCloseEvent*itemEvent=(NBNavigationItemLeftCloseEvent*)event;UIButton*button=[UIButtonbuttonWithType:UIButtonTypeCustom];button.frame=CGRectMake(0,0,44,44);button.backgroundColor=[UIColorwhiteColor];[buttonsetTitle:@"关闭"forState:UIControlStateNormal];[buttonsetTitleColor:[UIColorblackColor]forState:UIControlStateNormal];itemEvent.customView=button;

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

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

Native修改导航栏标题(一)在viewWillAppear获取自定义启动参数,根据参数自定义标题//打开H5离线包NSString*appId=@"20190927";[[MPNebulaAdapterInterfaceshareInstance]startH5ViewControllerWithNebulaApp:@{@"appId":appId,@"defaultTitle":@"测试",@"readTitle":@"NO",@"titleColor":@"ff0000",@"titleFont":@"18.0"}];//启动参数设置标题文案、颜色、大小;

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

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

Native修改导航栏右侧按钮(一)NBPluginBase插件中自定义修改1.在NBPluginBase中,

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

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

2.在NBPluginBase中

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

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

注:

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

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

(二)H5容器中自定义修改1.在viewWillAppear获取自定义启动参数,根据参数自定义设置AUBarButtonItem按钮。

(1)图片样式:

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

(2)文字样式:

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

2.如果要修改BarButtonItem的文字大小、颜色等深度定制参考以下代码://监听kNBEvent_Scene_NavigationItem_Left_Back_Create_After,在此监听事件中://修改返回按钮样式NSArray*leftBarButtonItems=event.context.currentViewController.navigationItem.leftBarButtonItems;if([leftBarButtonItemscount]==1){if(leftBarButtonItems[0]&&[leftBarButtonItems[0]isKindOfClass:[AUBarButtonItemclass]]){//在默认返回按钮基础上,修改返回箭头和文案颜色AUBarButtonItem*backItem=leftBarButtonItems[0];backItem.backButtonColor=[UIColorgreenColor];backItem.titleColor=[UIColororangeColor];//[UIColorcolorFromHexString:@"#00ff00"];//

logo设计

创造品牌价值

¥500元起

APP开发

量身定制,源码交付

¥2000元起

商标注册

一个好品牌从商标开始

¥1480元起

公司注册

注册公司全程代办

¥0元起

    官方电话官方服务
      官方网站八戒财税知识产权八戒服务商企业需求数字市场

技术干货|Native页面下如何实现导航栏的定制化开发?
1.在插件中自定义导航栏右侧按钮,必须要在打开H5容器的启动参数中设置@{@"showOptionMenu":@"YES"}否则设置右侧按钮无效。 2.必须要在kNBEvent_Scene_NavigationItem_Right_Setting_Create_After监听事件中实现[eventstopPropagation];否则showOptionMenu按钮的默认图片没有办法去掉。(二)H5容器中自定义修改1.在viewWi...

技术干货 | Native 页面下如何实现导航栏的定制化开发?
针对左侧返回按钮,有以下两种实现方式:第一,通过自定义`NBPluginBase`插件,在`kNBEvent_Scene_NavigationItem_Left_Back_Create_Before`监听事件中设置自定义返回按钮,而此方案需自行实现关闭页面逻辑。第二,监听`kNBEvent_Scene_NavigationItem_Left_Back_Create_After`事件,修改默认返回按钮样式,包括...

混合开发之JavaScriptInterfaceAndroid端交互
我们可以通过这个API 构造一个特殊自定义格式的Url跳转,shouldOverrideUrlLoading拦截Url后判断其格式,然后Native 解析到对应的方法和数据再去执行本地方法。开发者都知道安卓API 4.4以前谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,甚至轻而易举的调用本地代码进行流氓行...

技术干货 | “选图预览并上传”的场景如何解?全网最全方案汇总来了_百...
方案1:使用Android原生WebView 通过在前端使用标签,调用Android原生Webview支持实现选择文件上传。然而,此方案存在局限性,WebView不支持直接选择文件,需要自定义扩展WebChromeClient的openFileChooser或onShowFileChooser方法,以唤起系统文件选择器。返回的URI格式多样,需进行统一处理。方案2:利用mPaaS的H5容器 ...

技术干货 | HybridApp开发技术助力快速交付
业界普遍采用原生开发、网页开发、混合开发模式应对移动应用开发。混合开发模式融合了原生和网页优势,兼顾技能复用和效率提升。结合移动设备性能提升,混合开发成为主流模式。HybridApp开发技术简介,使用网页语言配合部分程序语言,实现跨平台快速开发。与原生App和WebApp相比,HybridApp开发成本低、难度小,市场...

视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等...
通过在页面URL中增加一个开关参数,容器读取到参数以后会将X5内核降级为系统原生的浏览器内核,这样可以在解决浏览器视频同层问题的同时也将内核变动的影响范围控制在单个页面当中。14、相关文章 [1]移动端实时音视频直播技术详解(四):编码和封装 [2]移动端实时音视频直播技术详解(五):推流和传输 [3]实现延迟低于...

做混合的话Uniapp和Flutter我应该学哪个啊?
本文总结了阿里闲鱼技术团队使用Flutter在对闲鱼IM进行移动端跨端改造过程中的技术实践等,文中对比了传统Native与现在大热的Flutter跨端方案在一些主要技术实现上的差异,以及针对Flutter技术特点的具体技术实现,值得同样准备使用Flutter开发IM的技术同行们借鉴和参考。 学习交流: - 移动端IM开发入门文章:《新手入门一篇就够...

零基础如何自学web前端?有必要参加培训班吗?
第5阶段:混合(Hybrid,ReactNative)开发(1周)内容包含:(微信小程序开发、ReactNative、各类混合应用开发)第6阶段:NodeJS全栈开发(1周)内容包括:(WebApp后端系统开发、一、NodeJS基础与NodeJS核心模块二、Express三、noSQL数据库)视频教程可以到B站看看尚学堂官方号发布的,质量挺不错的!至于是否参加...

想学web前端需要学什么知识
二、JS交互设计 这一部分主要掌握JS的基本语法、算法和高级语法,熟练使用面向对象的思想进行DOM编程,通过JQuery经典案例学习精通JQuery技术。三、Node开发 这一部分主要ES6的基本语法、兼容性和核心语法,能使用ES6实现前端的模块开发,学习Node开发,并能用Node.js操作MongoDB数据库。四、前端框架 这一部分...

相似回答
大家正在搜