当前位置: 移动技术网 > IT编程>移动开发>IOS > 详解iOS App中UiTabBarController组件的基本用法

详解iOS App中UiTabBarController组件的基本用法

2019年07月24日  | 移动技术网IT编程  | 我要评论

辛烷值测定仪,牛游戏网,历年存款利率表

uitabbarcontroller这个控制器绝对是项目架构时做常用的一个控件。
我们大致看下控件的效果,我们就知道为什么说他常见了。

201651892122380.png (366×506)

这就是最简单的一个雏形,想必现在基本70%的应用界面结构都会是这样的。
在android中我们以activitygroup或是现在的fragment来实现,一个容器中包含多个子控制器。
下面我们还是以建立xib文件的形式来实现一个这样的整体布局的例子。
当然在 xcode中我们会发现其实直接有这么一个模板了

201651892201121.png (647×201)

但是直接使用模板后会发现是直接在代码里实现了子布局得添加,由于我们不熟练,对于item,tabbar什么的图片文字自定义,一下子找不到代码里的api,
可能说用xib来实现可以看得比较明了。
据说以前直接有base_window模板,不过没关系,模板只是为了给我快速建立一个应用而已,我们这边手动的从最基础得开始
1.首先建立一个empty application

2.建立完后我们自定顶一个mainwindow.xib(当然,这个名字可以随意取,但是按照规范以及一种默认留下来的习惯),作为应用启动时加载的首个nib文件,
在新建xib文件你可以选择window也可以是empt什么,其实都差不多,我们这边选window模板得xib文件

3.然后我们其实是要把xxxappdelegate和这个xib文件连接起来。因此把.h文件定义成这样:

复制代码 代码如下:

#import <uikit/uikit.h>

@interface nonoappdelegate : uiresponder <uiapplicationdelegate>
{
    uiwindow *window;
    uitabbarcontroller *tabtarcontroller;
}

@property (retain, nonatomic) iboutlet uiwindow *window;//该控件模板生成是不带iboutlet的,但是我们为了xib文件布局得统一性,将其也作为一个输出口和在mainxib中连接起来可以
@property (retain, nonatomic) iboutlet uitabbarcontroller *tabtarcontroller;
@end


4.然后我们来大致设计我们的xib文件,打开mainwindow.xib文件,我们大致看到视图元素,一个是文件拥有者filesowner,然后是reponder(这个一直没
怎么用到,具体干吗使的还不是明确),然后最主要得是object这个标签下得元素,此时就一个window。
首先我们要将文件拥有者这个类改成uiapplication,点击file'sowner标签后在右侧的属性栏选择indentity  inspector,看到此时customclass是nsobject,
我们改成uiapplication,改完后会发现file'sowner得outlets用了一个delegate的输出口东东,看过上一篇关于outlets和reference outlet我们就知道,
这个东东等会可以指向一个实例对象什么的。

5.好了,那么我们在object下的添加一个delegate的对象,操作很简单,在右侧控件组中

201651892223305.png (664×256)

拖一个这样得对象到xib下得object标签下,

然后我们来自定这个对象,根据上面所知,我们大致可以知道我们需要一个类似于delegate类得对象,对了

我们的appdelegate不就刚好是这么一个东西么。于是很自然的,选中这个object然后在右侧属性栏将custom class设置成nonoappdelagate。

然后点击file's owner将其输出口delegate和我们刚放上去的nonoappdelagate链接起来。


6.设置完以上后,我们可以点击object下得xxxappdelegate,然后看右边属性栏的 outlets,对了,我们刚在该文件得.h中申明过两个输出口,此刻我们是

要创建两个这样的对象然后将其连接起来。window这时已经有了,还少个uitabbarcontroller。那么我们从右边拖个过来咯

然后输出口和对象链接起来。

此刻,最基本的tabbarcontroller布局框架就ok了,此刻的xib文件如下图

201651892257438.png (900×500)

然后我们打开appdelegate.m进行实现和修改

复制代码 代码如下:

#import "nonoappdelegate.h"

@implementation nonoappdelegate

@synthesize window ;
@synthesize tabtarcontroller ;

- (void)dealloc
{
    [self.window release];
    [self.tabtarcontroller release];
    [super dealloc];
}

- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions
{
//    self.window = [[[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]] autorelease];
    // override point for customization after application launch.
    self.window.backgroundcolor = [uicolor whitecolor];
    self.window.rootviewcontroller = self.tabtarcontroller;
    [self.window makekeyandvisible];
    return yes;
}


恩,就是这么简单。
理论上我们现在启动模拟器后程序可以启动了。
但是却发现起来后是空白的。
我们从应用的main.m中看
复制代码 代码如下:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return uiapplicationmain(argc, argv, nil, nsstringfromclass([nonoappdelegate class]));
    }
}

然后应用到了我们自定义得delegate类了,然后发现一个问题,按照这个流程,我们mainwindow.xib文件貌似没加载进来啊.
这就对了,以前我们定义个controller的xib文件后都会有initwithnibname,而对于uiapplication类型的xib文件(其实局势整个应用最先要启动的一个类),
据说是这样的加载

201651892436632.jpg (900×409)

这个具体你可以去看上一篇中提到过ios应用启动内容,有个不错得博文给了很好得一个解释。
此刻我们可以将main.h代码稍微修改下

复制代码 代码如下:

#import <uikit/uikit.h>

#import "nonoappdelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return uiapplicationmain(argc, argv, nil, nil);

    }
}


原本第四个参数是指定appdelegate,但是我们知道,在加载mainwindow.xib实例化里面一个delegate对象时,我们已经链接了appdelegate类了,
感觉如果第四个参数指定后,这个类像是被实例化了2次,更多具体内容还是参考上面提到那个博客去看吧。

7.好了。最基本得tabbar界面完成,接下来是往里面添加子控制器。
首先我们来熟悉下uitabbarcontroller这个控件:
从界面我们可以推测出,该控件里面大致上有什么东西:
1>.应该有个类似于管理一组子控件的东西吧。
2>界面下面切换得切换条吧 tabbar
3>当然还回发现有个delegate这样得东西,就是代理对象么。
当然上面是在代码中,我们得到这些属性,做相应得操作。
在xib文件里可能说看上去会比较直观

201651892502600.png (648×503)

1>tab bar里面放的是由一个或是多个tabbaritem组成的数组,每个itm对应一个viewcontroller。
2>下面的 first,second等等就是每个item对应 的controller,这里也要注意一点,默认的我们我们拖进去一个
tabbaritem,一般我们会设置对应得xxxcontroller.xib文件

201651892525978.png (298×241)

之后还需将custom class改成对应xxxxcontroller类,因为默认的类是uiviewcontroller。这会在应用启动后报错的。
3>tabbaritem中可以设置title ,系统默认的几种图标,还有是自定义图标,以及badgevalue,就是上面标签上每个红色的值,
这个比android上先见之明多了呵呵。
4> 当底部的按钮超过5个时,系统会自动增加一个more按钮,点击more后,剩余的按钮会被显示出来。

201651892543769.jpg (358×693)

201651892602146.jpg (369×696)

8.uitabbarcontroller左右滑动切换标签页 
每个tabbar viewcontroller都要添加如下代码,建议在基类中添加:

复制代码 代码如下:

viewdidload
uiswipegesturerecognizer *swipeleft = [[uiswipegesturerecognizer alloc] initwithtarget:self action:@selector(tappedrightbutton:)];

    [swipeleft setdirection:uiswipegesturerecognizerdirectionleft];

    [self.view addgesturerecognizer:swipeleft];

   

    uiswipegesturerecognizer *swiperight = [[uiswipegesturerecognizer alloc] initwithtarget:self action:@selector(tappedleftbutton:)];

    [swiperight setdirection:uiswipegesturerecognizerdirectionright];

    [self.view addgesturerecognizer:swiperight];

再添加2个函数,包含切换动画效果:

复制代码 代码如下:

- (ibaction) tappedrightbutton:(id)sender

{

    nsuinteger selectedindex = [self.tabbarcontroller selectedindex];

   

    nsarray *aryviewcontroller = self.tabbarcontroller.viewcontrollers;

    if (selectedindex < aryviewcontroller.count - 1) {

        uiview *fromview = [self.tabbarcontroller.selectedviewcontroller view];

        uiview *toview = [[self.tabbarcontroller.viewcontrollers objectatindex:selectedindex + 1] view];

        [uiview transitionfromview:fromview toview:toview duration:0.5f options:uiviewanimationoptiontransitionflipfromright completion:^(bool finished) {

            if (finished) {

                [self.tabbarcontroller setselectedindex:selectedindex + 1];

            }

        }];

    }

   

}


复制代码 代码如下:

- (ibaction) tappedleftbutton:(id)sender

{

    nsuinteger selectedindex = [self.tabbarcontroller selectedindex];

   

    if (selectedindex > 0) {

        uiview *fromview = [self.tabbarcontroller.selectedviewcontroller view];

        uiview *toview = [[self.tabbarcontroller.viewcontrollers objectatindex:selectedindex - 1] view];

        [uiview transitionfromview:fromview toview:toview duration:0.5f options:uiviewanimationoptiontransitionflipfromleft completion:^(bool finished) {

            if (finished) {

                [self.tabbarcontroller setselectedindex:selectedindex - 1];

            }

        }];

    }


}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网