导航条UINavigtionBar,标签栏UITabBarController,抽屉MMDrawerController

本文主要是介绍导航条UINavigtionBar,标签栏UITabBarController,抽屉MMDrawerController,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Demo:

AppDelegate.m文件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];[self.window makeKeyAndVisible];/*以下代码皆是位于此*/return YES;
}

其中用到的相关代码:

#import "MMDrawerController.h"//抽屉框架#define TBItem(title, img, sImg) [[UITabBarItem alloc] initWithTitle:title image:[[UIImage imageNamed:img] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] selectedImage:[[UIImage imageNamed:sImg] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]
/*
 设置UIImage的渲染模式:UIImage.renderingMode
 着色(Tint Color)是iOS7界面中的一个.设置UIImage的渲染模式:UIImage.renderingMode重大改变,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:
 1.UIImageRenderingModeAutomatic  // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式。
 2.UIImageRenderingModeAlwaysOriginal   // 始终绘制图片原始状态,不使用Tint Color。
 3.UIImageRenderingModeAlwaysTemplate   // 始终根据Tint Color绘制图片,忽略图片的颜色信息。
 4.renderingMode属性的默认值是UIImageRenderingModeAutomatic,即UIImage是否使用Tint Color取决于它显示的位置
 */
- (void)tabBarControllers{firstCtrl = [[ViewController alloc]init];//自定义标签栏图片firstCtrl.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"任务" image:[UIImage imageNamed:@"Task"] selectedImage:[UIImage imageNamed:@"Task_Normal"]];//重点关注控制器的层次关系,只有ViewController内的firstCtrl 及从firstCtrl跳转到的页面 具有导航控制器,SecondCtrl = [[SecondViewController alloc]init];//标签栏SecondCtrl.tabBarItem = TBItem(@"统计", @"Stat_Normal", @"Stat");ThirdCtrl = [[ThirdViewController alloc]init];//    ThirdCtrl.tabBarItem.title = @"5";//    ThirdCtrl.tabBarItem.image = [UIImage imageNamed:@"Task_Normal"]//    ;//    ThirdCtrl.tabBarItem.selectedImage = [UIImage imageNamed:@"Task"];//    ThirdCtrl.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:2];ThirdCtrl.title = @"4";//官方标签栏图片样式UITabBarSystemItemXXX/*UITabBarSystemItemMore,//更多图标UITabBarSystemItemFavorites,//最爱图标UITabBarSystemItemFeatured,//特征图标UITabBarSystemItemTopRated,//高级图标UITabBarSystemItemRecents,//最近图标UITabBarSystemItemContacts,//联系人图标UITabBarSystemItemHistory,//历史图标UITabBarSystemItemBookmarks,//图书图标UITabBarSystemItemSearch,//查找图标UITabBarSystemItemDownloads,//下载图标UITabBarSystemItemMostRecent,//记录图标UITabBarSystemItemMostViewed,//全部查看图标*/nextfirstCtrl = [[FouthViewController alloc]init];nextfirstCtrl.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:3];
}
//⻚面是否切换,NO为不切换
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {if ([tabBarController.viewControllers lastObject] == viewController) {//地址相同,则肯定是同一个SixthViewController *loginCtrl = [SixthViewController new];[tabBarController presentViewController:loginCtrl animated:YES completion:nil];//新页面从下往上出现return NO;}return YES;
}

1.只加导航条

#pragma mark - 只加导航条
#if 1//设置导航条颜色[[UINavigationBar appearance]setBarTintColor:[UIColor colorWithRed:80.0/255 green:227.0/255 blue:194.0/255 alpha:1.0]];//设置导航条上按钮的文字或图标的颜色[[UINavigationBar appearance]setTintColor:[UIColor whiteColor]];//设置导航条上的背景图片//    [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"Snip20150916_1.png"] forBarMetrics:UIBarMetricsDefault];ViewController * VC  = [[ViewController alloc] init];//创建导航控制器,并使用根视图控制器初始化UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:VC];self.window.rootViewController = navCtrl;    
#endif   

2.加导航条和标签栏

#pragma mark - 加导航条和标签栏
#if 1//设置导航条上按钮的文字或图标的颜色[[UINavigationBar appearance]setTintColor:[UIColor blueColor]];//设置标签栏上文字的颜色[[UITabBar appearance]setTintColor:[UIColor greenColor]];[self tabBarControllers];#pragma mark - --每个标签各有一个NavigationController
#if 1   //每个标签各有一个NavigationControllerUINavigationController *controller1 = [[UINavigationController alloc] initWithRootViewController:firstCtrl];UINavigationController *controller2 = [[UINavigationController alloc] initWithRootViewController:SecondCtrl];UINavigationController *controller3 = [[UINavigationController alloc] initWithRootViewController:ThirdCtrl];UINavigationController *controller4 = [[UINavigationController alloc] initWithRootViewController:nextfirstCtrl];controller1.tabBarItem.title = @"自定义图片刷新";//标签栏标题
//    controller1.navigationItem.title = @"自定义动态图片上拉下拉刷新";//单单导航条标题controller2.tabBarItem.title = @"自定义文字刷新";controller3.tabBarItem.title = @"自定义刷新控件";controller4.tabBarItem.title = @"无";//跳转到无导航条默认刷新UITabBarController *tabBarCtrl = [[UITabBarController alloc]init];tabBarCtrl.delegate = self;//注意添加协议<UITabBarControllerDelegate>//    NSArray *viewControllers = [NSArray arrayWithObjects:controller1, controller2, controller3, controller4, nil];tabBarCtrl.viewControllers = @[controller1,controller2,controller3,controller4];self.window.rootViewController = tabBarCtrl;
#endif
#pragma mark - --所有标签共用一个NavigationController
#if 0   //所有标签共用一个NavigationControllerUITabBarController *tabBarCtrl = [[UITabBarController alloc]init];tabBarCtrl.delegate = self;//注意添加协议<UITabBarControllerDelegate>tabBarCtrl.viewControllers = @[firstCtrl,SecondCtrl,ThirdCtrl,nextfirstCtrl];//只有标签栏
//    self.window.rootViewController = tabBarCtrl;//只有标签栏//有导航条和标签栏//重点关注控制器的层次关系,具有导航控制器,//创建导航控制器,并使用根视图控制器初始化UINavigationController *allNavCtrl = [[UINavigationController alloc]initWithRootViewController:tabBarCtrl];tabBarCtrl.title = @"所有tabBar的标题";self.window.rootViewController = allNavCtrl;
#endif
#endif

3.加导航条和标签栏和抽屉

#pragma mark - 加导航条和标签栏和抽屉
#if 1[self tabBarControllers];UITabBarController *tabBarCtrl = [[UITabBarController alloc]init];tabBarCtrl.viewControllers = @[firstCtrl,SecondCtrl,ThirdCtrl,nextfirstCtrl];LeftViewController *leftCtrl = [[LeftViewController alloc]init];//只加标签栏和抽屉
//    MMDrawerController *drawerCtrl = [[MMDrawerController alloc]initWithCenterViewController:tabBarCtrl leftDrawerViewController:leftCtrl];//创建导航控制器,并使用根视图控制器初始化UINavigationController *navCtrl = [[UINavigationController alloc]initWithRootViewController:tabBarCtrl];tabBarCtrl.title = @"所有tabBar的标题";//加导航条和标签栏和抽屉MMDrawerController *drawerCtrl = [[MMDrawerController alloc]initWithCenterViewController:navCtrl leftDrawerViewController:leftCtrl];//支持打开抽屉的手势类型//    drawerCtrl.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll;//MMOpenDrawerGestureModePanningCenterView:打开抽屉姿态模式平移中心视图//MMOpenDrawerGestureModePanningNavigationBar:打开抽屉姿态模式平移导航栏drawerCtrl.openDrawerGestureModeMask = MMOpenDrawerGestureModePanningCenterView |MMOpenDrawerGestureModePanningNavigationBar;//支持关闭抽屉的手势类型drawerCtrl.closeDrawerGestureModeMask = MMCloseDrawerGestureModeAll;self.window.rootViewController = drawerCtrl;#endif

ViewController.m文件

- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];//设置导航条上按钮的文字或图标的颜色
//    [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];//[UINavigationBar appearance]是在AppDelegate中有效[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];//设置导航条标题颜色,@{}代表Dictionary[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];//设置导航栏颜色透明//设置导航条颜色透明只需设置NavigationBar的背景图片为一张空图片即可[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsCompact];//NavigationBar下边有一个ShadowImage,也可以通过设置空的UIImage设置透明。//这一句本来可以隐藏导航栏底部的分割线,但是不知为何此时无效,故采取以下另一种方法[self.navigationController.navigationBar setShadowImage:[UIImage new]];//隐藏导航栏底部的分割线,navBarHairlineImageView是UIImageView类navBarHairlineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];//设置导航栏颜色//self.navigationController.navigationBar.barTintColor = [UIColor blueColor];//当UIViewController. extendedLayoutIncludesOpaqueBars = NO 时,UINavigationBar添加背景图片后,UIViewController的视图的原点坐标为(0, 64), 下移了64px,并且高度缩减了64px。默认NO//    self.extendedLayoutIncludesOpaqueBars = YES;//导航栏不透明,translucent默认yes,导航条半透明//    self.navigationController.navigationBar.translucent = NO;//左self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"左侧" style:UIBarButtonItemStylePlain target:self action:@selector(didLeftClicked:)];//右UIImage *image = [UIImage imageNamed:@"Stat"];//如果需要显示图片的原始模样,需要设置渲染模式,否则由AppDelegate内的[UINavigationBar appearance]setTintColor所控制//    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(didRightClicked:)];//导航条的 度为44,状态栏的 度为20
//    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 44)];
//    v.backgroundColor = [UIColor purpleColor];
//    self.navigationItem.titleView = v; //标题和titleView有冲突,只会有一个有效//    self.title = @"自定义文字刷新";//修改导航条和标题栏标题.在AppDelegate.m内无效self.navigationItem.title = @"自定义动态图片刷新";//单单导航条标题}#pragma mark 找出导航栏底部横线
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {return (UIImageView *)view;}for (UIView *subview in view.subviews) {UIImageView *imageView = [self findHairlineImageViewUnder:subview];if (imageView) {return imageView;}}return nil;
}

相关属性

1.导航条UINavigtionBar:

1.1UINavigtionBar的单独创建

iOS中的导航条可以附着于导航控制器UINavigationController之中使用,也可以在controller中单独使用

UINavigationBar *bar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 80)];
[self.view addSubview:bar];

1.2导航栏的风格属性

UINavigationBar默认为白色的半透明的样式。导航栏的风格属性可以通过下面的属性来设置:

@property(nonatomic,assign) UIBarStyle barStyle;

UIBarStyle是一个枚举,其中大部分的样式都已弃用,有效果的只有如下两个:

typedef NS_ENUM(NSInteger, UIBarStyle) {UIBarStyleDefault          = 0,//默认UIBarStyleBlack            = 1,//黑色
}

1.3导航栏不透明

iOS6后导航栏默认都是半透明的,我们可以通过下面的bool值来设置这个属性,设置为NO,则导航栏不透明,默认为YES的半透明状态:

@property(nonatomic,assign,getter=isTranslucent) BOOL translucent;

1.4导航条上按钮的颜色

tintColor这个属性会影响到导航栏上按钮的图案颜色和字体颜色,系统默认是蓝色:

//设置导航条上按钮的文字或图标的颜色
[[UINavigationBar appearance]setTintColor:[UIColor whiteColor]];

1.5导航条背景颜色

BarTintColor用于设置导航栏的背景色,这个属性被设置后,半透明的效果将失效

//设置导航条颜色
[[UINavigationBar appearance]setBarTintColor:[UIColor colorWithRed:80.0/255 green:227.0/255 blue:194.0/255 alpha:1.0]];

1.6导航条背景图片

- (void)setBackgroundImage:(nullable UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (nullable UIImage *)backgroundImageForBarMetrics:(UIBarMetrics)barMetrics;

上面两个方法用于设置和获取导航栏的背景图案,这里需要注意,默认背景图案是不做缩放处理的,所以我们使用的图片尺寸要和导航栏尺寸匹配

//设置导航条上的背景图片
[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"Snip20150916_1.png"] forBarMetrics:UIBarMetricsDefault];

1.7导航条的设备的状态,竖屏横屏

UIBarMetrics参数设置设备的状态,如下:

typedef NS_ENUM(NSInteger, UIBarMetrics) {UIBarMetricsDefault,//正常竖屏状态UIBarMetricsCompact,//横屏状态
};

1.8设置导航栏的阴影图片

@property(nullable, nonatomic,strong) UIImage *shadowImage;

1.9设置导航栏的标题字体属性

@property(nullable,nonatomic,copy) NSDictionary<NSString *,id> *titleTextAttributes;

标题字体属性会影响到导航栏的中间标题,如下:

//设置导航条标题颜色,@{}代表Dictionary[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];

1.10设置导航栏标题的竖直位置偏移

- (void)setTitleVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics;
- (CGFloat)titleVerticalPositionAdjustmentForBarMetrics:(UIBarMetrics)barMetrics;

1.10设置导航栏左侧pop按钮的图案

导航栏左侧pop按钮的图案默认是一个箭头,我们可以使用下面的方法修改:

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"notebook"] style:UIBarButtonItemStylePlain target:self action:@selector(didRightClicked:)];

1.11设置导航栏颜色透明

//设置导航栏颜色透明//设置导航条颜色透明只需设置NavigationBar的背景图片为一张空图片即可[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsCompact];

1.11隐藏导航栏底部的分割线

    //NavigationBar下边有一个ShadowImage,也可以通过设置空的UIImage设置透明。//这一句本来可以隐藏导航栏底部的分割线,但是不知为何此时无效,故采取以下另一种方法[self.navigationController.navigationBar setShadowImage:[UIImage new]];//隐藏导航栏底部的分割线,navBarHairlineImageView是UIImageView类navBarHairlineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];
#pragma mark 找出导航栏底部横线
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {return (UIImageView *)view;}for (UIView *subview in view.subviews) {UIImageView *imageView = [self findHairlineImageViewUnder:subview];if (imageView) {return imageView;}}return nil;
}

2.导航栏中item的push与pop操作

UINavigationBar上面不只是简单的显示标题,它也将标题进行了堆栈的管理,每一个标题抽象为的对象在iOS系统中是UINavigationItem对象,我们可以通过push与pop操作管理item组。

//向栈中添加一个item,上一个item会被推向导航栏的左侧,变为pop按钮,会有一个动画效果
- (void)pushNavigationItem:(UINavigationItem *)item animated:(BOOL)animated;
//pop一个item
- (nullable UINavigationItem *)popNavigationItemAnimated:(BOOL)animated; 
//当前push到最上层的item
@property(nullable, nonatomic,readonly,strong) UINavigationItem *topItem;
//仅次于最上层的item,一般式被推向导航栏左侧的item
@property(nullable, nonatomic,readonly,strong) UINavigationItem *backItem;
//获取堆栈中所有item的数组
@property(nullable,nonatomic,copy) NSArray<UINavigationItem *> *items;
//设置一组item
- (void)setItems:(nullable NSArray<UINavigationItem *> *)items animated:(BOOL)animated;

3.UINavigationBarDelegate

在UINavigationBar中,还有如下一个属性:

@property(nullable,nonatomic,weak) id<UINavigationBarDelegate> delegate;

通过代理,我们可以监控导航栏的一些push与pop操作:

//item将要push的时候调用,返回NO,则不能push
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item; 
//item已经push后调用
- (void)navigationBar:(UINavigationBar *)navigationBar didPushItem:(UINavigationItem *)item; 
//item将要pop时调用,返回NO,不能pop  
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item; 
//item已经pop后调用 
- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item;

参考自:https://my.oschina.net/u/2340880/blog/527706?p=1

这篇关于导航条UINavigtionBar,标签栏UITabBarController,抽屉MMDrawerController的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/436220

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

Spring下自定义xml标签

dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子。 一 编写模型类 1 package com.hulk.testdubbo.model;2 3 public class Hero {4 private String name;5 private int

将添加功能的抽屉剥离,在父组件调用思路

一、新建组件 新建AddRoleEditerDrawer.vue <template><div><el-drawer v-model="dialog" title="添加角色" :before-close="handleClose" direction="rtl" @colse="cancelForm"class="demo-drawer" modal-class="add-drawer">

Struts2常用标签总结--转载

Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。 Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于

vue实现抽屉功能

<template><div class="drawer"><div @click="open()">11111</div><div class="setbox" :class="{show: isshow}"><div class="header"><p class="fl">标题</p><button class="off" @click="close">关闭</button></div></

LLM应用实战: 产业治理多标签分类

数据介绍 标签体系 产业治理方面的标签体系共计200+个,每个标签共有4个层级,且第3、4层级有标签含义的概括信息。 原始数据 企业官网介绍数据,包括基本介绍、主要产品等 企业专利数据,包括专利名称和专利摘要信息,且专利的数据量大。 LLM选型 经调研,采用Qwen2-72B-Instruct-GPTQ-Int4量化版本,占用显存更少,且效果与非量化相当,

Vue 向标签中传入 this

我曾经问过 chatgpt 这个问题,chatgpt 说不行! 但是,chatgpt 说的就算吗? 来试试吧: https://andi.cn/page/621733.html 当然是可以的!

SimD:基于相似度距离的小目标检测标签分配

摘要 https://arxiv.org/pdf/2407.02394 由于物体尺寸有限且信息不足,小物体检测正成为计算机视觉领域最具挑战性的任务之一。标签分配策略是影响物体检测精度的关键因素。尽管已经存在一些针对小物体的有效标签分配策略,但大多数策略都集中在降低对边界框的敏感性以增加正样本数量上,并且需要设置一些固定的超参数。然而,更多的正样本并不一定会带来更好的检测结果,事实上,过多的正样本