小Q項目框架搭建及會動的Tabbar

廣告

歡迎大家一起交流 QQ群 139852091 公眾號

我是jpg

開篇

小Q項目的大體思路有了亥啦,icon我也涉及好了捧存,雖然不是100%的漂亮哈打,但是也能湊合看得過去莺褒,我上傳一個大家一起欣賞一下


Icon-155.png

不是特別丑吧白粉,但是安裝后传泊,加上圓角可能有點不漂亮了,看一下


Paste_Image.png

怎么改一下好呢鸭巴,也希望大家給一些建議
好了眷细,我們進如主題,項目搭建部分

小Q項目搭建

一鹃祖、設計模式
首先呢溪椎,小Q采用傳統(tǒng)的MVC的設計模式,優(yōu)點我們再來啰嗦一下啊:
1校读、多個視圖可以對應一個模型沼侣。按MVC設計模式,一個模型對應多個視圖歉秫,可以減少代碼的復制及代碼的維護量蛾洛,一旦模型發(fā)生改變,也易于維護端考。
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)創(chuàng)建command+n ----> PCH File
(2)配置惧辈,在工程的TARGETS里邊Building Setting中搜索Prefix Header,然后把Precompile Prefix Header右邊的NO改為Yes磕瓷、在Precompile Prefix Header下邊的Prefix Header右邊雙擊,添加剛剛創(chuàng)建的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 - 一次性執(zhí)行
#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 這個已經不適用了,我發(fā)現了一個新的

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

這個是可以用的瘩例,目前我用的這個

使用pod 必須要由一個podfile文件啊胶,0.X的版本和1.X的版本文件有所不一樣,每次都創(chuàng)建一個很麻煩垛贤,一般都是拷貝一個之前有的文件全選后替換如下代碼焰坪,然后install 就可以了

platform :ios, "8.1"

target '項目名字' do
    
end
小Q會動的tabbar

什么是會動的tabbar呢,先看一個gif就知道了

00000.gif

效果不炫酷聘惦,代碼也很簡單某饰,之前總結過一個UIView動畫 iOS 連續(xù)動畫效果(讓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

未完待續(xù)黔漂,持續(xù)更新中

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市禀酱,隨后出現的幾起案子炬守,更是在濱河造成了極大的恐慌,老刑警劉巖剂跟,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件减途,死亡現場離奇詭異,居然都是意外死亡浩聋,警方通過查閱死者的電腦和手機观蜗,發(fā)現死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衣洁,“玉大人墓捻,你說我怎么就攤上這事》环颍” “怎么了砖第?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長环凿。 經常有香客問我梧兼,道長,這世上最難降的妖魔是什么智听? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任羽杰,我火速辦了婚禮渡紫,結果婚禮上,老公的妹妹穿的比我還像新娘考赛。我一直安慰自己惕澎,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布颜骤。 她就那樣靜靜地躺著唧喉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忍抽。 梳的紋絲不亂的頭發(fā)上八孝,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音鸠项,去河邊找鬼干跛。 笑死,一個胖子當著我的面吹牛锈锤,可吹牛的內容都是我干的驯鳖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼久免,長吁一口氣:“原來是場噩夢啊……” “哼浅辙!你這毒婦竟也來了?” 一聲冷哼從身側響起阎姥,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤记舆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呼巴,有當地人在樹林里發(fā)現了一具尸體泽腮,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年衣赶,在試婚紗的時候發(fā)現自己被綠了诊赊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡府瞄,死狀恐怖碧磅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情遵馆,我是刑警寧澤鲸郊,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站货邓,受9級特大地震影響秆撮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜换况,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一职辨、第九天 我趴在偏房一處隱蔽的房頂上張望盗蟆。 院中可真熱鬧,春花似錦拨匆、人聲如沸姆涩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亏栈,卻和暖如春台腥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绒北。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工黎侈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷游。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓峻汉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脐往。 傳聞我的和親對象是個殘疾皇子休吠,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,770評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現业簿,斷路器瘤礁,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 去看望了一個生病的朋友。 做完手術后梅尤,她已經在床上躺了二周柜思。醫(yī)生說,她還需要再躺二周才能下床行動巷燥。要知道赡盘,她之前可...
    蘇聽風閱讀 1,705評論 0 3
  • 頭疼......吳秀有氣無力的抬起了胳膊,拿起了枕邊的鬧鐘看了看缰揪,5點51分陨享,還有9分鐘就要響了,吳秀把鬧鈴取消后...
    陸藤閱讀 283評論 0 0
  • ?這么多年過去了邀跃,我還在心心念念當年吃過的福州小吃霉咨。 福州小吃是鮮,凡是有湯一定是各種海鮮熬制或是牛肉筒骨炮制的的...
    阿淮_f729閱讀 1,008評論 0 2