廣告
歡迎大家一起交流 QQ群 139852091 公眾號
開篇
小Q項目的大體思路有了亥啦,icon我也涉及好了捧存,雖然不是100%的漂亮哈打,但是也能湊合看得過去莺褒,我上傳一個大家一起欣賞一下
不是特別丑吧白粉,但是安裝后传泊,加上圓角可能有點不漂亮了,看一下
怎么改一下好呢鸭巴,也希望大家給一些建議
好了眷细,我們進如主題,項目搭建部分
小Q項目搭建
一鹃祖、設計模式
首先呢溪椎,小Q采用傳統(tǒng)的MVC的設計模式,優(yōu)點我們再來啰嗦一下啊:
1校读、多個視圖可以對應一個模型沼侣。按MVC設計模式,一個模型對應多個視圖歉秫,可以減少代碼的復制及代碼的維護量蛾洛,一旦模型發(fā)生改變,也易于維護端考。
2雅潭、應用被分隔為三層,降低了各層之間的耦合却特,提供了應用的可擴展性扶供。
3、控制層的概念也很有效裂明,由于它把不同的模型和不同的視圖組合在一起椿浓,完成不同的請求。因此闽晦,控制層可以說是包含了用戶請求權限的概念扳碍。
4、MVC更符合軟件工程化管理的精神仙蛉。不同的層各司其職笋敞,每一層的組件具有相同的特征,有利于通過工程化和工具化產生管理程序代碼荠瘪。
轉換為個人的理解就是MVC各做個的事情夯巷,把自己的工作負責好,由C來控制MV的交互哀墓,出問題了好解決趁餐,能快速找出問題點,解耦合
項目目錄路徑如下:
項目內文件夾如下:
好進行下一步篮绰,添加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文件名”
可能出現問題:
原因困食,路徑不對边翁,到工程路徑下一級一級比對,做相應的加減(不會的自行百度)
在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ā)現了一個新的
這個是可以用的瘩例,目前我用的這個
使用pod 必須要由一個podfile文件啊胶,0.X的版本和1.X的版本文件有所不一樣,每次都創(chuàng)建一個很麻煩垛贤,一般都是拷貝一個之前有的文件全選后替換如下代碼焰坪,然后install 就可以了
platform :ios, "8.1"
target '項目名字' do
end
小Q會動的tabbar
什么是會動的tabbar呢,先看一個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 公眾號