小Q项目框架搭建及会动的Tabbar

广告

欢迎大家一起交流 QQ群 139852091 公众号

我是jpg

开篇

小Q项目的大体思路有了,icon我也涉及好了,虽然不是100%的漂亮,但是也能凑合看得过去,我上传一个大家一起欣赏一下


Icon-155.png

不是特别丑吧,但是安装后,加上圆角可能有点不漂亮了,看一下


Paste_Image.png

怎么改一下好呢,也希望大家给一些建议
好了,我们进如主题,项目搭建部分

小Q项目搭建

一、设计模式
首先呢,小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

广告

欢迎大家一起交流 QQ群 139852091 公众号

我是jpg

未完待续,持续更新中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,465评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 去看望了一个生病的朋友。 做完手术后,她已经在床上躺了二周。医生说,她还需要再躺二周才能下床行动。要知道,她之前可...
    苏听风阅读 1,682评论 0 3
  • 头疼......吴秀有气无力的抬起了胳膊,拿起了枕边的闹钟看了看,5点51分,还有9分钟就要响了,吴秀把闹铃取消后...
    陆藤阅读 282评论 0 0
  • ​这么多年过去了,我还在心心念念当年吃过的福州小吃。 福州小吃是鲜,凡是有汤一定是各种海鲜熬制或是牛肉筒骨炮制的的...
    阿淮_f729阅读 1,001评论 0 2