整个自定义TabBarController实现自主风格

iOS基础【新浪微博的例子】授权页面的处理、版本新特性的处理、自定义TabBarController 前言1、 在didFinishLaunchingWithOptions 方法判断是否已经存在用户信息 2、授权页面的处理 3、版本新特性的处理 4、HWTabBarController 的处理。代码块 didFinishLaunchingWithOptions- (BOOL)application:(UIApplication *)application didFinishLaunching 阅读详情

      要自定义UITabBarController,首先我们必须了解UITabBarController结构与其各个相关类的关系(TabBarController、TabBar、TabButton及ViewController)。其中,TabButton是一个双态的Button(选中和未选中),行为和CheckBox、RadioButton类似。TabBar是TabButton的容器,负责TabButton的排布和互斥,保证同时只有一个Button为选中态。TabBarController包含了TabBar,并管理这一个ViewController的栈,在TabBar上的按钮点击时对栈上的ViewController位置进行相应的调整,从而保持TabBar和ViewController栈之间的一致性。

      熟悉了基本结构后,一般有以下常见的方案来完整自定义TabBarController。
方案一:替换部分现有的实现
      目标是替换掉系统的部分控件,可通过隐藏TabBar的方式来实现。只要做到隐藏原有的TabBar后,不要忘了在新定制的TabBar的当前选中按钮变化时通过UITabBarController的setSelectedIndex接口设置ViewController栈的当前ViewController即可。 

View Code
复制代码
 1 #import <UIKit/UIKit.h>
2 @interface CustomTabBar : UITabBarController {
3 NSMutableArray *buttons;
4 int currentSelectedIndex;
5 UIImageView *slideBg;
6 }
7
8 @property (nonatomic,assign) int currentSelectedIndex;
9 @property (nonatomic,retain) NSMutableArray *buttons;
10
11 - (void)hideRealTabBar;
12 - (void)customTabBar;
13 - (void)selectedTab:(UIButton *)button;
14
15 @end
复制代码
View Code
复制代码
 1 #import "CustomTabBar.h"
2
3 @implementation CustomTabBar
4
5 @synthesize currentSelectedIndex;
6 @synthesize buttons;
7
8 - (void)viewDidAppear:(BOOL)animated{
9 slideBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bottomfocus.png"]];
10 [self hideRealTabBar];
11 [self customTabBar];
12 }
13
14 - (void)hideRealTabBar{
15 for(UIView *view in self.view.subviews){
16 if([view isKindOfClass:[UITabBar class]]){
17 view.hidden = YES;
18 break;
19 }
20 }
21 }
22
23 - (void)customTabBar{
24 UIImageView *imgView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"tabbg2.png"]];
25 imgView.frame = CGRectMake(0, 425, imgView.image.size.width, imgView.image.size.height);
26 [self.view addSubview:imgView];
27 slideBg.frame = CGRectMake(-30, self.tabBar.frame.origin.y, slideBg.image.size.width, slideBg.image.size.height);
28
29 //创建按钮
30 int viewCount = self.viewControllers.count > 5 ? 5 : self.viewControllers.count;
31 self.buttons = [NSMutableArray arrayWithCapacity:viewCount];
32 double _width = 320 / viewCount;
33 double _height = self.tabBar.frame.size.height;
34 for (int i = 0; i < viewCount; i++) {
35 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
36 btn.frame = CGRectMake(i*_width,self.tabBar.frame.origin.y, _width, _height);
37 [btn addTarget:self action:@selector(selectedTab:) forControlEvents:UIControlEventTouchUpInside];
38 btn.tag = i;
39 [self.buttons addObject:btn];
40 [self.view addSubview:btn];
41 [btn release];
42 }
43 [self.view addSubview:slideBg];
44 UIImageView *imgFront = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tabitem.png"]];
45 imgFront.frame = imgView.frame;
46 [self.view addSubview:imgFront];
47 [imgFront release];
48 [imgView release];
49 [self selectedTab:[self.buttons objectAtIndex:0]];
50
51 }
52
53 - (void)selectedTab:(UIButton *)button{
54 if (self.currentSelectedIndex == button.tag) {
55
56 }
57 self.currentSelectedIndex = button.tag;
58 self.selectedIndex = self.currentSelectedIndex;
59 [self performSelector:@selector(slideTabBg:) withObject:button];
60 }
61
62 - (void)slideTabBg:(UIButton *)btn{
63 [UIView beginAnimations:nil context:nil];
64 [UIView setAnimationDuration:0.20];
65 [UIView setAnimationDelegate:self];
66 slideBg.frame = CGRectMake(btn.frame.origin.x - 30, btn.frame.origin.y, slideBg.image.size.width, slideBg.image.size.height);
67 [UIView commitAnimations];
68 }
69
70 - (void) dealloc{
71 [slideBg release];
72 [buttons release];
73 [super dealloc];
74 }
75 @end
复制代码

使用这个自定义类来创建UITabBarController

View Code
复制代码
 1 // Override point for customization after application launch.
2 FirstViewController *mainViewController = [[FirstViewController alloc] init];
3 SecondViewController *searchViewController = [[SecondViewController alloc]init];
4 ThirdViewController *myselfViewController = [[ThirdViewController alloc]init];
5 ForthViewController *settingViewController = [[ForthViewController alloc]init];
6
7 //隐藏tabbar所留下的黑边(试着注释后你会知道这个的作用)
8 mainViewController.hidesBottomBarWhenPushed = true;
9 searchViewController.hidesBottomBarWhenPushed = true;
10 myselfViewController.hidesBottomBarWhenPushed = true;
11 settingViewController.hidesBottomBarWhenPushed = true;
12
13 mainViewController.title = @"首页";
14 searchViewController.title = @"搜索";
15 myselfViewController.title = @"我";
16 settingViewController.title = @"设置";
17
18 //创建导航
19 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:mainViewController ];
20 UINavigationController *nav1 = [[ UINavigationController alloc] initWithRootViewController:searchViewController];
21 UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:myselfViewController];
22 UINavigationController *nav3 = [[UINavigationController alloc]initWithRootViewController:settingViewController];
23 //创建数组
24 NSMutableArray *controllers = [[NSMutableArray alloc]init];
25 [controllers addObject:nav];
26 [controllers addObject:nav1];
27 [controllers addObject:nav2];
28 [controllers addObject:nav3];
29
30 //创建tabbar
31 tabBarController = [[ CustomTabBar alloc] init];
32 tabBarController.viewControllers = controllers;
33 tabBarController.selectedIndex = 0;
34
35 //显示
36 [self.window addSubview:tabBarController.view];
37 [self.window makeKeyAndVisible];
复制代码
实现iOS TabBar中间Item突出及Push导航效果 在移动应用中,TabBar是用户界面的重要组成部分,它提供了一种简单直接的方式让用户在不同的视图控制器之间进行切换。iOS的TabBar组件允许应用展示一组数量有限的导航项,每个导航项对应一个视图控制器。用户可以通过点击TabBar中的某个item快速访问到相关联的内容。一个典型的TabBar可能会包含如“首页”、“搜索”、“发现”、“我的”等几个主要功能入口。不过,在iOS标准组件中,中间item通常无法突出显示,这对于某些设计需求来说形成了限制。 阅读详情

相关推荐

iOS应用开发:自定义Tab Bar实战指南

本文还有配套的精品资源,点击获取 简介:在iOS应用中,Tab Bar提供了一种直观的用户界面导航方式,用于在多个视图控制器之间切换。本项目'ios-tabbar.zip'提供了一个名为'tabBarDome'的示例,展示了如何实现和定制Tab Bar。教程涵盖了从基本的Tab Bar Controller使用、Tab Bar Item的定制,到自定义Tab Bar的设计,...

weixin_42230607的博客 1838

微信小程序使用tabbar实现点击切换页面

tabbar具体如何使用或者具体属性,请参考:https://developers.weixin.qq.com/miniprogram/dev/extended/weui/tabbar.html 接下来就直接放代码: tabbar.wxml <view class="page"> <mp-tabbar class="topbar" style="position:fix...

weixin_45595203的博客 5776

自定义tabbar 例子

自定义 TabbarController 例子

微信小程序如何实现切换主题(更改皮肤)

一:基本原理 因为小程序中没有样式引入的概念,所以不能像传统的html中那样改变link标签的href值来达到切换样式文件。 在小程序中,可以在类名中定义变量,通过动态改边类名,最终达到修改样式的目的。 二:具体实现 在wxml文件中: 其中的变量theme来自welcome.js中,theme的值决定着使用哪个样式来影响页面 在wxss文件中: 这里需要把所有的样式文件都引入进来,因为小程序里...

css_666的博客 2万+

ios-模仿简书自定义TabBar(纯代码).zip

1.模仿简书APP自定义TabBar 2.有相似的app可以直接拿过去使用,修改的地方很小 3.https://github.com/Naruto-yq/Jianshu_App

高效静音黑科技 —— 单相直流无刷电机驱动器

然而,传统的BLDC电机驱动通常依赖于三相架构,电路复杂,成本高昂,且在低功率应用中显得有些“大材小用”。单相直流无刷电机驱动器作为一项高效、静音、经济的技术,正逐渐改变着各个领域的电机驱动方式。其精巧的控制策略、显著的优势以及广阔的应用前景,都预示着这项技术将在未来扮演越来越重要的角色。它相较于传统的三相驱动,显著简化了电路结构,降低了成本,尤其适用于低功率、对静音要求极高的应用场景。通过这些模块的协同工作,单相直流无刷电机驱动器能够实现对电机速度、扭矩的精确控制,并最大程度地降低噪声和振动。

wen8789的博客 1764

iOS界面导航设计揭秘:Swift中TabBarController的6大实战应用场景

掌握Swift标签栏用法,轻松实现iOS多界面导航。本文详解TabBarController在主界面布局、模块切换、消息提醒等6大场景的应用技巧,涵盖初始化配置、自定义样式与页面通信方法,提升用户体验与开发效率。实战示例丰富,值得收藏。

ProceSeed的博客 802

Agisoft Metashape相机标定笔记

使用Metashape进行自动相机标定是可能的。(可选:使用打印的棋盘格图案,但需保证它是平坦的且单元格是正方形)。相机标定步骤支持全相机标定矩阵的估计,包含非线性的畸变参数。相机模型的细节请参照附录D——相机模型板块。:在通用的工作流程中,相机标定步骤可以跳过。因为Metashape会在图像定向过程中进行相机自标定。但是,如果定向结果不稳定,例如,由于影像之间缺乏连接点,额外进行单独的相机标定步骤也许是有用的。

天桥飞熊的博客 3974

ios开发入门- TabBarController使用和多视图切换

目标: ios TabbarController 组件的使用 程序效果 如图 : TabBarController 是一个菜单组件 TabBarController 组件在ios 程序中经常看到 ,是一个比较常用的组件 TabBarController 幕中最多只可以放置5个,如果超过5个系统会自动生成一个More按钮 下面各位童鞋一起来做一遍 启动Xcod...

weixin_34216036的博客 227

STM32CubeMX平台F4系列固件下载核心要点

详解STM32CubeMX平台下F4系列单片机的固件包下载方法与常见问题,重点讲解stm32cubemx固件包下载流程及配置技巧,帮助开发者快速完成开发环境搭建。

weixin_42575505的博客 892

YOLOv8实战火焰和烟雾检测 (视频教程)

本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数据集,完成一个多目标检测实战项目,可实时检测图像、视频、摄像头和流媒体(http/rtsp)中火焰和烟雾,并提供可视化演示界面 。

bai666ai的博客 1914

android多视图切换,ios开发入门- TabBarController使用和多视图切换

目标: ios TabbarController 组件的使用程序效果 如图 :TabBarController 是一个菜单组件TabBarController 组件在ios 程序中经常看到 ,是一个比较常用的组件TabBarController 幕中最多只可以放置5个,如果超过5个系统会自动生成一个More按钮下面各位童鞋一起来做一遍启动Xcode 创建一个新的ios Application 模...

weixin_39725118的博客 350

数据仓库从明细到汇总:DWD与DWS层建模实战指南

DWS层的“主题”是指业务分析的核心场景,通常分为“用户主题、商品主题、订单主题、营销主题”等。主题的定义需紧密结合业务需求,避免“为了汇总而汇总”。例如,电商平台的核心业务需求包括“用户活跃度分析”“商品销售情况分析”“订单转化分析”,对应的DWS层主题即可定义为“用户主题汇总表”“商品主题汇总表”“订单主题汇总表”。主题定义时需注意“粒度适中”——汇总粒度既不能过细(否则与DWD层重复,失去汇总意义),也不能过粗(否则无法满足细分分析需求)。

2401_83088008的博客 644

Interactive Side Menu与TabBar/NavigationController的无缝集成教程

iOS开发中,实现流畅的侧边菜单与现有导航组件的集成一直是提升用户体验的关键。Interactive Side Menu是一个用Swift编写的轻量级iOS侧边菜单库,它能帮助开发者快速实现侧边栏与TabBarController、NavigationController的无缝融合,打造专业级的应用导航体验。本教程将详细介绍如何在你的iOS项目中集成这个强大的交互组件,让应用界面既美观又实用。

gitblog_00526的博客 815

含分布式光伏的IEEE 33节点配电网电压越限仿真分析

摘要 本文针对分布式光伏接入配电网引发的电压越限问题,基于IEEE 33节点系统开展仿真研究。首先分析了光伏出力的随机性和波动性特性,采用Beta分布和马尔可夫链方法建立光伏出力模型;其次在MATLAB/Simulink平台搭建完整测试系统,包含光伏模型、配电网线路模型和控制模块;最后通过多场景仿真定量分析了不同光伏渗透率和接入位置对节点电压的影响。结果表明:光伏渗透率提高会显著增加电压越限风险,特别是线路末端节点;光伏接入位置对电压分布具有决定性影响,馈线末端接入更易引发电压越限。研究为含高比例光伏的配电

huanghm88的专栏 321

Unity零基础到入门 ☀️| 基础知识入门篇章,看完就可以做游戏啦! | 寻找C站宝藏

Unity入门基础知识。本篇文章介绍了关于Unity入门的一些基础知识,包括基本概念和使用实例。简单易上手,轻松实现Unity入门操作!

努力前行,总会成为自己心中的那道光 1万+

iOS 使用UITabBarController时需要将一张视图覆盖整个屏幕的解决办法:

我想在整个屏幕在UITabBarController setup覆盖一个HUD风格的透明图形。控制这个的按钮在第一个屏幕下(FirstViewController),覆盖的时候也应该覆盖住tab。 这时候就需要使用application,在window上添加视图 [[[UIApplication sharedApplication] keyWindow] addSubview:myNewV

hnxyzhw的专栏 1204

点云从入门到精通技术详解100篇-基于 CBCT 与口内扫描数据的牙齿点云配准

口扫生成的三维牙模型只包含牙冠结构,容易受到唾液、食物残留等杂质的干扰。像精度,但其扫描成本较高,在公立医院的普及率较低。此外,口扫探入式的体。完整、精确的牙齿信息,有助于医生更好地进行数字化辅助诊疗,提高手术的预。可以表示上颌骨、下颌骨、牙冠以及牙根的位置和形状,但其扫描分辨率较低,精配准前实现粗略的预配准来确定点云间的初始位置,为精配准提供良好的配准。该算法通过计算点对间的距离确定源点云中的某一点在目标点云中的对应。算两点之间的欧氏距离,运算量较大,而且由于算法只考虑点集间的距离而忽略。

getusushu的博客 1640

去除TabBarController阴影线

//设置背景图片 _tabBarController.tabBar.backgroundImage = [UIImage imageNamed:@”tabbar_bg.png”]; //消除阴影线(设置图片为空,线就没了) _tabBarController.tabBar.shadowImage = [[UIImage alloc] init];

Kim_Blue_Happy的博客 1378

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

如何快速实现iOS分页菜单:PageMenu的完整指南

PageMenu是一个强大的iOS分页菜单控制器,它允许开发者将多个视图控制器整合到一个滚动视图中,创造出类似Spotify、Windows Phone和Instagram应用中的流畅分页体验。本文将为你提供从零开始使用PageMenu的详细步骤,帮助你轻松打造专业级的分页界面。 ## PageMenu简介:为什么它是iOS开发者的理想选择 在移动应用开发中,提供直观的内容导航方式至关重要。P

gitblog_01030的博客 810

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IOS自定义UITabBarController

ios7的扁平化格式看着狠舒服,然而在做项目适配的时候,

゛拯救ㄨ℉地球げ好累 1198

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: iOS学习之Map,定位,标记位置的使用
下一篇: 动态改变UITableView中的Cell高度
临红尘
博客等级 码龄19年 10粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值