项目搭建

一、设计模式
首先呢,小Q采用传统的MVC的设计模式,优点我们再来啰嗦一下啊:
1、多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护。
2、应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性。
3、控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念。
4、MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。
转换为个人的理解就是MVC各做个的事情,把自己的工作负责好,由C来控制MV的交互,出问题了好解决,能快速找出问题点,解耦合

项目目录路径如下:

Paste_Image.png

项目内文件夹如下:

Paste_Image.png

好进行下一步,添加PCH文件
二、添加pch文件
pch的作用:
1.存放一些全局的宏(整个项目中都用得上的宏)
2.用来包含一些全部的头文件(整个项目中都用得上的头文件)
3.能自动打开或者关闭日志输出功能
但是apple在Xcode 6中去掉了pch,为了一些琐碎的头文件引用,加快了 编译速度!
习惯了pch的小伙伴们很不适应,比如我,添加方法如下:
(1)创建command+n ----> PCH File
(2)配置,在工程的TARGETS里边Building Setting中搜索Prefix Header,然后把Precompile Prefix Header右边的NO改为Yes、在Precompile Prefix Header下边的Prefix Header右边双击,添加刚刚创建的pch文件的工程路径,添加格式:

“$(SRCROOT)/项目名称/pch文件名”

可能出现问题:

Paste_Image.png

原因,路径不对,到工程路径下一级一级比对,做相应的加减(不会的自行百度)

在pch文件中添加常用的宏 如下:

//16进制颜色
#define UIColorFromRGB(rgbValue) [UIColor \
colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \
blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] //屏幕高度
#define SCREEN_HEIGHT [UIScreen mainScreen ].bounds.size.height
//屏幕宽度
#define SCREEN_WIDTH [UIScreen mainScreen ].bounds.size.width //获取通知中心
#define LRNotificationCenter [NSNotificationCenter defaultCenter] //弱引用
#define WeakSelf(type) __weak typeof(type) weak##type = type;
//强引用
#define StrongSelf(type) __strong typeof(type) type = weak##type; //GCD - 一次性执行
#define kDISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);
//GCD - 在Main线程上运行
#define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);
//GCD - 开启异步线程
#define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), globalQueueBlocl);

三、cocoapods 使用
cocoapods这个大家都不陌生,怎么装怎么用都不讲了(不会的自行百度)
啰嗦一点是用淘宝的Ruby镜像来访问cocoapods 这个已经不适用了,我发现了一个新的

http://rubygems-china.oss.aliyuncs.com

这个是可以用的,目前我用的这个

使用pod 必须要由一个podfile文件,0.X的版本和1.X的版本文件有所不一样,每次都创建一个很麻烦,一般都是拷贝一个之前有的文件全选后替换如下代码,然后install 就可以了

platform :ios, "8.1"

target '项目名字' do

end
小Q会动的tabbar

什么是会动的tabbar呢,先看一个gif就知道了

00000.gif

效果不炫酷,代码也很简单,之前总结过一个UIView动画 iOS 连续动画效果(让APP动起来) 实际就是用得里面的缩放动画,这次我们用一下POP实现
在podfile里面导入POP动画

pod 'pop'

然后在终端中

pod install

在需要动画的地方加入如下代码:

POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
scaleAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1, 1)];
scaleAnimation.velocity = [NSValue valueWithCGPoint:CGPointMake(10, 10)];
scaleAnimation.springBounciness = 60.f;
scaleAnimation.delegate = self;
[(需要动画的View) pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"];

整个TabBarViewController的代码如下,很简单的东西就不做过多的讲解了:

//
// GD_TabBarViewController.m
// GD_XiaoQ
//
// Created by GuangdongQi on 2016/12/20.
// Copyright © 2016年 GuangdongQi. All rights reserved.
// #import "GD_TabBarViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "GD_CalendarViewController.h"
#import "GD_WeatherViewController.h"
#import "GD_XiaoQViewController.h"
#import "GD_BaseNavigationController.h" @interface GD_TabBarViewController () @property (nonatomic, strong) NSMutableArray *buttons;
@property (nonatomic, strong) UIView *tabbarview;
@property (nonatomic, assign) NSInteger btnTag; @end @implementation GD_TabBarViewController - (void)viewDidLoad {
[super viewDidLoad];
//修改tabbar上面线条的颜色
self.tabBar.layer.borderWidth = 0.50;
self.tabBar.layer.borderColor = UIColorFromRGB(0xdddddd).CGColor; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabbarIndexChange:) name:@"Notification_Tabbar" object:nil]; GD_CalendarViewController * calendarVC = [[GD_CalendarViewController alloc]init];
calendarVC.tabBarItem = nil; GD_WeatherViewController * weatherVC = [[GD_WeatherViewController alloc]init];
weatherVC.tabBarItem = nil; GD_XiaoQViewController * xiaoQVC = [[GD_XiaoQViewController alloc]init];
xiaoQVC.tabBarItem = nil; NSMutableDictionary *imgDic1 = [NSMutableDictionary dictionaryWithCapacity:3];
[imgDic1 setObject:[UIImage imageNamed:@"icon_tabbar_00_n"] forKey:@"Default"];
[imgDic1 setObject:[UIImage imageNamed:@"icon_tabbar_00_s"] forKey:@"Highlighted"];
[imgDic1 setObject:[UIImage imageNamed:@"icon_tabbar_00_s"] forKey:@"Seleted"]; NSMutableDictionary *imgDic2 = [NSMutableDictionary dictionaryWithCapacity:3];
[imgDic2 setObject:[UIImage imageNamed:@"icon_tabbar_01_n"] forKey:@"Default"];
[imgDic2 setObject:[UIImage imageNamed:@"icon_tabbar_01_s"] forKey:@"Highlighted"];
[imgDic2 setObject:[UIImage imageNamed:@"icon_tabbar_01_s"] forKey:@"Seleted"]; NSMutableDictionary *imgDic3 = [NSMutableDictionary dictionaryWithCapacity:3];
[imgDic3 setObject:[UIImage imageNamed:@"icon_tabbar_02_n"] forKey:@"Default"];
[imgDic3 setObject:[UIImage imageNamed:@"icon_tabbar_02_s"] forKey:@"Highlighted"];
[imgDic3 setObject:[UIImage imageNamed:@"icon_tabbar_02_s"] forKey:@"Seleted"]; NSArray *vcs = @[calendarVC,weatherVC,xiaoQVC];
NSMutableArray *navs = [NSMutableArray arrayWithCapacity:[vcs count]];
for (UIViewController *vc in vcs) {
GD_BaseNavigationController *BaseNavigation = [[GD_BaseNavigationController alloc] initWithRootViewController:vc];
BaseNavigation.hidesBottomBarWhenPushed = NO;
[navs addObject:BaseNavigation];
}
[self setViewControllers:navs];
[self setImages:@[imgDic1/*,imgDic1*/,imgDic2,/*imgDic3,*/imgDic3]];
[self setSelectedIndex:0];
} /**
* 设置tab项图片
*
* imgs
*/
-(void)setImages:(NSArray*)imgs
{ self.tabbarview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 49)];
self.tabbarview.backgroundColor = UIColorFromRGB(0xfdfcfc); for(UIView *view in self.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view addSubview:self.tabbarview];
[view bringSubviewToFront:self.tabbarview]; break;
}
} self.buttons = [NSMutableArray arrayWithCapacity:[imgs count]]; CGFloat width = SCREEN_WIDTH / [imgs count];
for (int i = 0; i < [imgs count]; i++)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.tag = i;
btn.frame = CGRectMake(width * i, 0, width, self.tabbarview.frame.size.height);
[btn setImage:[[imgs objectAtIndex:i] objectForKey:@"Default"] forState:UIControlStateNormal];
[btn setImage:[[imgs objectAtIndex:i] objectForKey:@"Highlighted"] forState:UIControlStateHighlighted];
[btn setImage:[[imgs objectAtIndex:i] objectForKey:@"Seleted"] forState:UIControlStateSelected];
[btn addTarget:self action:@selector(touchButton:) forControlEvents:UIControlEventTouchUpInside]; [self.buttons addObject:btn];
[self.tabbarview addSubview:btn]; } [self selectTabAtIndex:0];
} /**
* 设置当前选择tab
*
* index
*/
- (void)selectTabAtIndex:(NSInteger)index
{
NSLog(@"选择 %ld",(long)index);
self.selectedIndex = index; for (int i = 0; i < [self.buttons count]; i++)
{
UIButton *b = [self.buttons objectAtIndex:i];
b.selected = NO;
b.userInteractionEnabled = YES;
}
UIButton *btn = [self.buttons objectAtIndex:index];
btn.selected = YES;
btn.userInteractionEnabled = NO;
} -(void) touchButton:(id)sender
{
UIButton *btn = sender;
self.btnTag = btn.tag; POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
scaleAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1, 1)];
scaleAnimation.velocity = [NSValue valueWithCGPoint:CGPointMake(10, 10)];
scaleAnimation.springBounciness = 60.f;
scaleAnimation.delegate = self;
[btn pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"]; } -(void)pop_animationDidStart:(POPAnimation *)anim{
[self selectTabAtIndex:self.btnTag];
} - (void) tabbarIndexChange:(NSNotification *)notification {
NSInteger selectTabAtIndex = [notification.object[@"index"] integerValue];
[self selectTabAtIndex:selectTabAtIndex];
} @end

链接:http://www.jianshu.com/p/725b3c17631b

会动的Tabbar的更多相关文章

  1. iOS转场弹窗、网易云音乐动效、圆环取色器、Loading效果等源码

    iOS精选源码 view controller transition and popover (控制器转场和弹窗) UITableView头部悬停+UITableView侧滑嵌套 一行代码集成时间选择 ...

  2. MATLAB中绘制质点轨迹动图并保存成GIF

    工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...

  3. 自定义tabBar

    ★★★★自定义tabBar★★★★★★★ Demo下载地址:https://github.com/marlonxlj/tabBarCustom.git 前言: 有的时候需求要对tabBar进行自定义的 ...

  4. react-native的tabbar和navigator混合使用

    前段时间搭建项目使用了navigator和react-native-tab-navigator,现在我教大家搭建一个通用的简单框架. 先把几张图贴在这里,这就是我们今天要搭建的东西,别看页面简单,但是 ...

  5. AOS – 另外一个独特的页面滚动动画库(CSS3)

    AOS 是一个用于在页面滚动的时候呈现元素动画的工具库,你可能会觉得它和 WOWJS 一样,的确他们效果是类似的.但是AOS是 CSS3 动画驱动的库,当你滚动页面的时候能让元素动起来,当页面滚回顶部 ...

  6. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

  7. iOS 切换首页-更改tabbar的容器控制器

    最近想到的一个小需求: 首页切换:点击一个切换按钮,能实现首页的风格.排版等变换,原理是用一个新的VC替换掉. 效果如下:   ====>====> 实现方式很简单: 以我的Demo为例, ...

  8. canvas检测边界和弹动的实例

    如图所示的效果,小球相互碰撞会相互弹开,这时要干的事就只有两件事了,一:用二次循环遍历小球是否互相碰撞,二:碰撞之后会弹向什么地方和弹出多少距离,第一件事我想学过二维数组循环的都没问题,第二件事也只是 ...

  9. weui tabbar 切换

    Html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...

随机推荐

  1. Javascript中变量函数申明优先级

    先理解这句话: “函数会首先被提升,然后才是变量”,代码并不是你写的顺序那样执行的. F12把下面的代码粘贴到控制台执行一下: var getName = function () { console. ...

  2. 解决CentOS下无法发送邮件的问题

    最近有个项目从虚拟主机迁到云主机上,换了个环境,原来用于找回密码的发送邮件功能竟然用不了了!反应极慢,导致tenginx报504网关超时错误. 5.5 or 7.0, sockets 初次百度,看了别 ...

  3. WIN10系统 截图或者某些程序时屏幕会自动放大怎么办

    右击这个应用程序,兼容性,以兼容模式运行,同时勾选高DPI设置时禁止显示缩放即可

  4. Android 之 PackageManager获取的应用程序信息与AndroidManifest文件中设置的信息不一致问题

    有时我们需要用 PackageManager 来获取应用程序的版本号和版本名称等信息,通过以下代码来获取: PackageManager manager = getPackageManager(); ...

  5. selenium快速跳转视图到指定元素

    首先判断元素是否存在,如果存在的时候使用location_once_scrolled_into_view就可以滚动到某个元素处,也就是滚动直到这个元素出现在屏幕里.

  6. MongoDB numa系列问题二:WARNING: You are running on a NUMA machine.

    1:Mongod日志warning: mongodb日志显示如下: WARNING: You are running on a NUMA machine. We suggest launching m ...

  7. flow 静态类型检查 js

    1.flow介绍 https://ustbhuangyi.github.io/vue-analysis/prepare/flow.html#为什么用-flow 2.使用 (1)安装flow (2)项目 ...

  8. Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.html 在上一篇博文我们提到,分页有三种方法.其中,第三种是我们最常用的.然而,在实际应用过程中 ...

  9. recordMyDesktop的安装与使用

    今天给大家推荐一款能让桌面录像更简单的屏幕录像的工具:  RecordMyDesktop 安装 RecordMyDesktop RecordMyDesktop 的核心是一系列命令工具,不过 Gnome ...

  10. CentOS静默安装Oracle 11gR2(x64)

    环境 OS: CentOS 7.4; hosts: L134; IP: 192.168.1.134 DB: linux.x64_11gR2_database 安装依赖包 yum install -y ...