纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)
声明:这里所指的三级结构不是网上百度中所经常提及的三级框架或者MVC模式,而是指UITabbarController+UINavigationController+UIViewController。
效果图
技术要点
三者其实是层层包含的关系,以tabbar为起点(接下来就不写类名全程了,看官们看懂就好),一个tabbar对应多个navigation,每个navigation对应着1个viewcontroller(当然实际上是可以多个的,在这里用不上而已),这样一来整个视图看起来就成了可以切换不同导航栏标题的多个视图。
tabbar的设置
tabbar设置可以很简单,但是这里我们搞复杂点,利用自定义的button放入tabbar中,当然在此之前,我们需要将原有tabbar中的UITabBarButton类型的所有`UITabBarButton类型的视图给删除即可。
#pragma mark 删除tabbar原始的item
- (void)removePreItem
{
for (UIView *view in self.tabBar.subviews) {
if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
[view removeFromSuperview];
}
}
#pragma mark 即将读取视图
- (void)viewWillAppear:(BOOL)animated
{
[self removePreItem];
[super viewWillAppear:animated];
}
有一点要提示的是删除原有tabbar中item的方法要在viewWillAppear中执行,在viewDidLoad中执行则不会删除。
删除完了之后,增加我们想要添加的按钮并设置点击事件——切换视图控制器。在tabbar中,切换视图控制器其实很简单,只需要self.selectedIndex = i;即可。
CGFloat itemOffsetX;
CGFloat itemOffsetY;
#pragma mark 增加自定义item
- (void)createItems
{
//求图标宽度
CGFloat tabbarWidth = self.tabBar.bounds.size.width;
CGFloat itemWidth = (tabbarWidth - itemOffsetX * 5) / 4;
//求图标高度
CGFloat tabbarHeight = self.tabBar.bounds.size.height;
CGFloat itemHeight = tabbarHeight - itemOffsetY * 2;
//新建button
for(int i = 0; i < 4; i ++)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.tag = i;
[btn addTarget:self action:@selector(actItem:) forControlEvents:UIControlEventTouchUpInside];
btn.frame = CGRectMake(itemOffsetX * (i+1) + itemWidth * i, 0, itemWidth, itemHeight);
[btn setTitle:[NSString stringWithFormat:@"%d",i+1] forState:UIControlStateNormal];
[btn setTitleColor:REDCOLOR forState:UIControlStateNormal];
[btn setTitleColor:YELLOWCOLOR forState:UIControlStateHighlighted];
[self.tabBar addSubview:btn];
}
}
#pragma mark tabbar中item点击事件
- (void)actItem:(UIButton *)sender
{
NSLog(@"click %@ button",sender.titleLabel.text);
self.selectedIndex = sender.tag % 10;
}
接下来是给tabbar添加视图,这些子视图应该是navigation,然后navigation中才把对应的viewcontroller收入囊中。navigation除了能像表层看到的那样能提供导航栏之外,实际上像栈那样push和pop栈中的viewcontroller。
#pragma mark 添加4个MainNavViewController到视图中
- (void)addNavViewController
{
MainNavViewController *nav1 = [[MainNavViewController alloc]init];
nav1.viewControllers = @[[[FirstViewController alloc]init]];
MainNavViewController *nav2 = [[MainNavViewController alloc]init];
nav2.viewControllers = @[[[SecondViewController alloc]init]];
MainNavViewController *nav3 = [[MainNavViewController alloc]init];
nav3.viewControllers = @[[[ThirdViewController alloc]init]];
MainNavViewController *nav4 = [[MainNavViewController alloc]init];
nav4.viewControllers = @[[[FourthViewController alloc]init]];
NSArray *navViewControllers = @[nav1,
nav2,
nav3,
nav4];
self.selectedIndex = 0;
self.viewControllers = navViewControllers;
}
要修改导航栏标题不是在navigation更不是在tabbar,而是在navigation中的viewcontroller中修改,修改很简单,关键是要理解修改导航栏标题的语句是放在navigation中的viewcontroller里面。
//在viewcontroller中设置
self.navigationItem.title = @"第四";
代码下载链接:http://download.csdn.net/detail/ecjtuacm_yuewei/9806036
纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)的更多相关文章
- BearSkill纯代码搭建iOS界面
欢迎相同喜欢动效的project师/UI设计师/产品增加我们 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:648070256 浅谈一下 关于iOS兼容布局一直 ...
- 搭建App主流框架_纯代码搭建(OC)
转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部 ...
- Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局
简介 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 项目主页: Masonry 最新示例: 点击下载 项目简议: 如果再看到关于纯代 ...
- Masonry — 使用纯代码进行iOS应用的autolayout自适应布局
本文转载至 http://www.ios122.com/2015/09/masonry/ 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstrain ...
- (六十二)纯代码搭建UI
在Xcode6中,去掉了Empty Application的选项,因此可以通过先创建SingleView,再删除storyboard,并且把工程设置中的main Interface清空. 通过AppD ...
- iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleV ...
- iOS:删除storyBoard,纯代码实现UITabBarController的视图切换功能
storyboard是一个很强大的编写代码的辅助工具,可以帮助布局多个视图之间的联系,既直观又能减少代码量:但是,作为一个程序员,在不使用storyboard的情况下,纯代码编写是必须的技能. 下面就 ...
- iOS高仿app源码:纯代码打造高仿优质《内涵段子》
iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...
- iOS开发 纯代码创建UICollectionView
转:http://jingyan.baidu.com/article/eb9f7b6d8a81a5869364e8a6.html iOS开发 纯代码创建UICollectionView 习惯了使用xi ...
- iOS UICollectionView(转一) XIB+纯代码创建:cell,头脚视图 cell间距
之前用CollectionViewController只是皮毛,一些iOS从入门到精通的书上也是泛泛而谈.这几天好好的搞了搞苹果的开发文档上CollectionViewController的内容,亲身 ...
随机推荐
- [FAQ] 阿里云一口价域名购买之后在哪里看
进入控制台,产品和服务中找到"域名",进去后在左侧菜单有 "已买到的域名". 如图: Link:https://www.cnblogs.com/farwish/ ...
- 使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架
随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用.通过此方式可以 ...
- dotnet 5 从 IL 层面分析协变返回类型新特性
在 C# 9.0 里面添加的一个新特性是支持协变返回类型,也就说子类重写了基类的抽象或虚拟方法,可以在返回值里面返回协变的类型,也就是返回值的类型可以是继承原本子类返回值类型的子类.本文将来从 IL ...
- 基于Jenkins+k8s+Git等技术构建DeOps平台
一.DeOps简介 1.什么是DeOps? 1.1 敏捷开发 提高开发效率,及时跟进用户需求,缩短开发周期. 敏捷开发包括编写代码和构建代码两个阶段,可以使用 git 或者 svn 来管理代码,用 ...
- CMDB开发(三)
6.API验证 # 加密复习 #1.简单的对称加密,token是固定的 客户端请求: import requests # 1.自定义token值 token = 'cxiong_token' # to ...
- Golang ETCD包的安装使用 golang安装etcd第三方库clientv3 报错 解决
目录 ETCD 官网 视频地址 课件资料 ETCD 日志收集项目 为什么要自己写不用ELK? 项目的架构 上节课项目进度 etcd介绍 安装etcd windows安装 Ubuntu(linux系统) ...
- 关于Java Chassis 3的契约优先(API First)开发
本文分享自华为云社区<Java Chassis 3技术解密:契约优先(API First)开发>,作者: liubao68. 契约优先(API First)开发是指应用程序开发过程中,将A ...
- Idefics2 简介: 为社区而生的强大 8B 视觉语言模型
我们很高兴在此发布 Idefics2,这是一个通用的多模态模型,接受任意文本序列和图像序列作为输入,并据此生成文本.它可用于回答图像相关的问题.描述视觉内容.基于多幅图像创作故事.从文档中提取信息以及 ...
- vue-router单页面应用的多标签页使用问题
正常的思维 做多vue页面应用,我们的第一反应是配置多个入口点,多个vue应用,编译成多个HTML文件,由服务器来决定路由.这是正常的思维. 但谁知道单页面应用也能做到类似的效果呢.单页面不过是服务器 ...
- git解决Enter passphrase for key ‘/root/.ssh/id_rsa’: 重复输入密码问题
删除方法: ssh-keygen -p 这里只是删除密码 ssh的pub不会改变. 屏幕快照 2019-12-20 下午4.11.05.png Enter file in which the ...