一 、使用git管理工程
1鞍帝、可以使用OSChina遠(yuǎn)程管理工程(免費(fèi)) 2诫睬、可以使用GitHub網(wǎng)站進(jìn)行遠(yuǎn)程管理(付費(fèi)) 注冊(cè)--登錄--創(chuàng)建資源庫(kù)
二煞茫、通過(guò)coco管理我們的第三方框架
1帕涌、通過(guò)命令加載到我們的工程統(tǒng)計(jì)的文件夾 2.命令行pod init 創(chuàng)建pod file 文件 3、命令行pod search +第三方框架的名字 续徽,進(jìn)行搜索 4蚓曼、搜索到第三方框架,把最新的版本復(fù)制到我們的podfile文檔 5钦扭、選擇我們鍵盤上的Q退出 6纫版、命令行安裝我們的第三方框架pod install
三、在本地checkout
1客情、使用Xcode進(jìn)行checkout其弊,把資源加載到本地 2、用xocde創(chuàng)建工程膀斋,把工程放方到和git同級(jí)的文件梭伐,讓git管理工程 3、創(chuàng)建完工程仰担,commit--push到我們的OSChana遠(yuǎn)程服務(wù)管理器
四糊识、開始我們的環(huán)境配置
1、打開生成的新生成的工程對(duì)應(yīng)的工程 2、配置我們的環(huán)境 3赂苗、工程的唯一標(biāo)示愉耙,(一般的時(shí)候都是我們的公司名稱網(wǎng)址的反寫,例如com.520it.www.+我們工程的名字) 4拌滋、工程的版本朴沿,如果是新開發(fā)的工程,一般是1.0鸠真,如果是迭代開發(fā)悯仙,每次發(fā)布的版本必須比我們的上一次發(fā)布的版本要高 5、配置我們工程的文件的前綴(在右邊--例如LYH) 6吠卷、配置我們是配手機(jī)的版本锡垄,一般最多比我們最新版本低三級(jí) 7、配置我們手機(jī)的橫豎屏 8祭隔、配置我們啟動(dòng)App的status bar style 9货岭、配置我們App的圖標(biāo)AppIcon 10、配置我們啟動(dòng)App的Launch image Source 選擇BrandAssets 11疾渴、選擇我們是否選擇加載Storyboard
五千贯、正式開始我們的工程--控制器的選擇(以百思不得姐為例)
1、首先顯示我們的窗口 2搞坝、選擇tabBarController為我們的根控制器 3搔谴、選擇navegationController為我們根控制器的第一個(gè)根控制器 4、選擇tableViewController為我們的nav的根控制器
六桩撮、工程的部署
1敦第、劃分工程的結(jié)構(gòu)
2、刪除工程的文件智能在Xcode中刪除
3.git不會(huì)把空文件夾上傳到遠(yuǎn)方的服務(wù)器
4店量、封裝:可以做到自己的事情自己做
5芜果、tabBarController切換原理:點(diǎn)擊tabBar上的按鈕,就會(huì)把子控制器的View添加到tabBarController融师,把之前的View移除掉
6右钾、在自定義的tabBarController中搭建我們的主流框架
7、添加對(duì)應(yīng)的控制器到對(duì)應(yīng)的位置
8旱爆、添加完畢子控制器
9.tabBar按鈕出現(xiàn)的問(wèn)題解決
(1)舀射、按鈕選中的時(shí)候,圖片被渲染
原因:蘋果默認(rèn)設(shè)置渲染顏色怀伦,為藍(lán)色
解決:1.直接修改圖片 :設(shè)定我們的圖片為original2.通過(guò)代碼 創(chuàng)建分類設(shè)定圖片不被渲染
(2)脆烟、按鈕被選中的時(shí)候,文字被渲染空镜,設(shè)置字體大小
原因:蘋果默認(rèn)設(shè)置渲染顏色浩淘,為藍(lán)色
解決:文字在tabBar按鈕上捌朴,文字的屬性有tabBarItem決定,(建議在tabBarController中進(jìn)行統(tǒng)一設(shè)置 1张抄、通過(guò)在方法l-(void)load中進(jìn)行設(shè)置文字屬性砂蔽,此方法在程序啟動(dòng)的時(shí)候加載 2、在+ (void)initialize 中進(jìn)行設(shè)置署惯,此方法在類第一次使用或者子類第一次使用的時(shí)候加載)
(3)左驾、中間發(fā)布按鈕顯示不出來(lái)
10、關(guān)于獲取所有的控件的方法說(shuō)明appearence
1.appearance是什么?UIAppearance協(xié)議里面一個(gè)方法
2.任何對(duì)象都可以使用appearance?不能,只有遵守了UIAppearance協(xié)議,才能使用UIAppearance,所有的控件都可以使用appearance
3.任何屬性都可以通過(guò)appearance去設(shè)置嗎?不是任何屬性都可以通過(guò)appearance設(shè)置
4.哪些屬性可以通過(guò)appearance去設(shè)置,只有有UI_APPEARANCE_SELECTOR宏屬性才可以通過(guò)appearance去設(shè)置
5.如果一個(gè)屬性通過(guò)appearance去設(shè)置,必須要保證在顯示之前去設(shè)置
//獲取所有UITabBarItem外觀
UITabBarItem*item = [UITabBarItemappearance];
//文字顏色為黑色
//字典描述文字信息
NSMutableDictionary*attr = [NSMutableDictionarydictionary];
attr[NSForegroundColorAttributeName] = [UIColorblackColor];
//設(shè)置選中狀態(tài)下文字顏色
[itemsetTitleTextAttributes:attrforState:UIControlStateSelected];
11极谊、關(guān)于文字渲染的問(wèn)題
設(shè)置文字不要渲染
//技巧:以后不要給我記方法,忘記,直接跳入頭文件去查找
//通過(guò)富文本屬性去設(shè)置文字顏色,字體,陰影,下劃線,圖文混排等等
// tabBarItem:模型通過(guò)富文本屬性設(shè)置字符串
// tabBarItem不是按鈕,只是按鈕對(duì)應(yīng)模型
12诡右、設(shè)置文字的大小
設(shè)置tabBar上文字的大小只有設(shè)置文字在正常狀態(tài)下的文字大小,在選中狀態(tài)下無(wú)法設(shè)置文字的大小
NSMutableDictionary*attr = [NSMutableDictionarydictionary];
attr[NSForegroundColorAttributeName] = [UIColorblackColor];
//設(shè)置選中狀態(tài)下文字顏色
[itemsetTitleTextAttributes:attrforState:UIControlStateSelected];
//設(shè)置正常狀態(tài)下文字字體
NSMutableDictionary*attrNor = [NSMutableDictionarydictionary];
attrNor[NSFontAttributeName] = [UIFontsystemFontOfSize:13];
[itemsetTitleTextAttributes:attrNorforState:UIControlStateNormal];
13轻猖、關(guān)于中間圖片不顯示問(wèn)題
主要原因是中間按鈕被渲染
14帆吻、關(guān)于中間圖片位置錯(cuò)亂問(wèn)題
重新把一個(gè)按鈕添加到tabBar上,建議在Viewdidload中加載咙边,設(shè)置懶加載
15猜煮、關(guān)于導(dǎo)航條按鈕點(diǎn)擊范圍較大問(wèn)題
默認(rèn)一個(gè)按鈕,超出按鈕點(diǎn)擊范圍败许,將無(wú)法點(diǎn)擊王带,如果能夠點(diǎn)擊影響用戶體驗(yàn)
為什么把一個(gè)按鈕包裝成UIBarButtonItem就會(huì)出現(xiàn)點(diǎn)擊范圍較大
解決:不能把一個(gè)按鈕包裝成UIBarButtonItem;
創(chuàng)建分類市殷,提供接口愕撰,把我們需要的Item作為方法返回
+ (instancetype)itemWithImage:(UIImage*)image highImage:(UIImage*)highImage target:(id)target action:(SEL)action
{
UIButton*btn = [UIButtonbuttonWithType:UIButtonTypeCustom];
[btnsetImage:imageforState:UIControlStateNormal];
[btnsetImage:highImageforState:UIControlStateHighlighted];
[btnsizeToFit];
[btnaddTarget:targetaction:actionforControlEvents:UIControlEventTouchUpInside];
UIView*containerView = [[UIViewalloc]initWithFrame:btn.bounds];
[containerViewaddSubview:btn];
return[[UIBarButtonItemalloc]initWithCustomView:containerView];
}
16、關(guān)于導(dǎo)航條上中間文字的屬性設(shè)置
顯示哪個(gè)子控制器醋寝,對(duì)應(yīng)的子控制器就可以設(shè)置對(duì)應(yīng)的文字標(biāo)題屬性搞挣,文字屬性是有navgetionbar決定的。
17甥桂、關(guān)于導(dǎo)航條處理細(xì)節(jié)
要想設(shè)置全局的導(dǎo)航條主標(biāo)題文字設(shè)置:
建議在主流框架的navgetion獲取當(dāng)前類的全局導(dǎo)航條柿究,設(shè)置導(dǎo)航條的字體為想要設(shè)定的字號(hào)邮旷。
eg://設(shè)置導(dǎo)航條標(biāo)題字體=>導(dǎo)航條
NSMutableDictionary*attr = [NSMutableDictionarydictionary];
attr[NSFontAttributeName] = [UIFontboldSystemFontOfSize:22];
//獲取全局導(dǎo)航條外觀
//??? [UINavigationBar appearance];
// iOS7,發(fā)短信功能,聯(lián)系人黑屏=>使用appearance,去設(shè)置導(dǎo)航條背景圖片
//獲取哪個(gè)類下的導(dǎo)航條,管理自己下導(dǎo)航條
UINavigationBar*bar = [UINavigationBarappearanceWhenContainedIn:self,nil];
[barsetTitleTextAttributes:attr];
18黄选、關(guān)于返回按鈕的設(shè)置;
- (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated婶肩,關(guān)于push的調(diào)用是每次push的時(shí)候办陷,都會(huì)調(diào)用,把push的控制器壓入棧頂控制器中律歼,
設(shè)置除根控制器的每次push的控制器左邊按鈕為想要的返回按鈕的樣式民镜;(注意:??每次設(shè)置左邊的按鈕的時(shí)候必須在跳轉(zhuǎn)之前設(shè)置);
eg:- (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated
{
//設(shè)置棧頂控制器
//設(shè)置返回按鈕
UIButton*backButton = [UIButtonbuttonWithType:UIButtonTypeCustom];
[backButtonsetTitle:@"返回"forState:UIControlStateNormal];
[backButtonsetTitleColor:[UIColorblackColor]forState:UIControlStateNormal];
[backButtonsetTitleColor:[UIColorredColor]forState:UIControlStateHighlighted];
[backButtonsetImage:[UIImageimageNamed:@"navigationButtonReturn"]forState:UIControlStateNormal];
[backButtonsetImage:[UIImageimageNamed:@"navigationButtonReturnClick"]forState:UIControlStateHighlighted];
[backButtonsizeToFit];
//設(shè)置內(nèi)容內(nèi)邊距,修改按鈕位置
backButton.contentEdgeInsets=UIEdgeInsetsMake(0, -30,0,0);
[backButtonaddTarget:selfaction:@selector(back)forControlEvents:UIControlEventTouchUpInside];
UIView*containView = [[UIViewalloc]initWithFrame:backButton.bounds];
[containViewaddSubview:backButton];
UIBarButtonItem*item = [[UIBarButtonItemalloc]initWithCustomView:containView];
viewController.navigationItem.leftBarButtonItem= item;
//真正在執(zhí)行跳轉(zhuǎn)
[superpushViewController:viewControlleranimated:animated];
}
19 關(guān)于滑動(dòng)返回的設(shè)置
??導(dǎo)航控制器跟我們?cè)O(shè)置了push之后自動(dòng)返回功能险毁,這個(gè)功能是ios7開始的制圈,如果我們自己設(shè)置了導(dǎo)航條左側(cè)返回按鈕们童,覆蓋了系統(tǒng)的返回按鈕,那么左側(cè)邊緣的滑動(dòng)返回功能就會(huì)失效鲸鹦,這個(gè)時(shí)候我們需要通過(guò)代碼來(lái)實(shí)現(xiàn)左側(cè)滑動(dòng)返回功能
蘋果設(shè)置左側(cè)返回失效慧库,可能系統(tǒng)內(nèi)部對(duì)手勢(shì)功能做了一些設(shè)置
這個(gè)時(shí)候我們需要看蘋果做了哪些事情,我們把蘋果做的事情取消就可以了馋嗜,
- (void)viewDidLoad {
[superviewDidLoad];
//清空滑動(dòng)返回手勢(shì)代理,恢復(fù)滑動(dòng)返回功能
self.interactivePopGestureRecognizer.delegate=self;
//假死狀態(tài):界面死,程序還在跑
//原因:在根控制器下,滑動(dòng)返回
//解決:控制滑動(dòng)手勢(shì)什么時(shí)候有效,什么時(shí)候失效
//干掉手勢(shì),沒(méi)有滑動(dòng)返回功能,
//手勢(shì)失效,通過(guò)代理
//??? self.interactivePopGestureRecognizer.delegate = self;
}
#pragma mark -UIGestureRecognizerDelegate
//是否觸發(fā)手勢(shì)
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch
{
//在根控制器下失效,在非根控制器有效
returnself.childViewControllers.count>1;
}
通過(guò)查找我們知道蘋果內(nèi)部把手勢(shì)的代理手勢(shì)用戶交互為NO(是否觸發(fā)手勢(shì))齐板,所以只要我們重新設(shè)置代理,然后把用戶交互觸發(fā)手勢(shì)設(shè)置在非根控制器為YES就可以了
20葛菇、關(guān)于設(shè)置全屏的左滑功能
這個(gè)時(shí)候我們需要先禁用系統(tǒng)自帶的左側(cè)邊緣滑動(dòng)甘磨,然后重新進(jìn)行設(shè)置代理,調(diào)用系統(tǒng)的手勢(shì)方法眯停,然后設(shè)置手勢(shì)滑動(dòng)在非根控制器下為YES济舆;
21、設(shè)置程序啟動(dòng)的時(shí)候AD廣告界面
設(shè)置廣告界面為在程序啟動(dòng)完畢的時(shí)候?yàn)槲覀兊母刂破鬏赫ㄆ渲羞€必須能夠顯示啟動(dòng)圖片)
通過(guò)XIB來(lái)創(chuàng)建我們的廣告界面吗冤,其中廣告圖片來(lái)自網(wǎng)絡(luò),所以我們不能加載本地圖片九府,要加載網(wǎng)絡(luò)圖片這個(gè)時(shí)候我們就用到了占位思想椎瘟,這里就是設(shè)置占位圖片。
22侄旬、設(shè)置我們的啟動(dòng)圖片的屏幕適配問(wèn)題
- (void)setupLanuchImage
{
//不同屏幕尺寸使用不同圖片
//屏幕適配
//判斷屏幕尺寸
// iPhone6P:736 iPhone6:667 iPhone5:568 iPhone4:480
UIImage*image =nil;
if(iPhone6P) {// iPhone6P
image = [UIImageimageNamed:@"LaunchImage-800-Portrait-736h@3x"];
}elseif(iPhone6) {
image = [UIImageimageNamed:@"LaunchImage-800-667h"];
}elseif(iPhone5) {
image = [UIImageimageNamed:@"LaunchImage-568h"];
}elseif(iPhone4) {
image = [UIImageimageNamed:@"LaunchImage"];
}
_lanuchImageView.image= image;
}
23加載網(wǎng)絡(luò)圖片這個(gè)時(shí)候我們需要加載第三方框架
第三方框架的管理肺蔚,使用cocoapods,使用它的好處是可以自動(dòng)加載我們需要的第三方框架的依賴儡羔,不需要我們手動(dòng)再去加載宣羊,因?yàn)槲覀冊(cè)陂_發(fā)的時(shí)候并且會(huì)自動(dòng)更新我們的第三方框架。
24汰蜘、通過(guò)第三方框架加載AFN加載數(shù)據(jù)
1)創(chuàng)建我們的會(huì)話管理者仇冯,讓會(huì)話管理者發(fā)送請(qǐng)求
2)如果遇到請(qǐng)求失敗,看返回給我們請(qǐng)求失敗的原因族操,
eg:content-type;
25苛坚、廣告的跳轉(zhuǎn)
給廣告的imageView設(shè)置一個(gè)點(diǎn)按手勢(shì)(??imageView默認(rèn)時(shí)不能與用戶交互的,必須讓圖片的能夠與用戶交互色难,設(shè)置enabled = YES)泼舱;
26、廣告的時(shí)間設(shè)定
通過(guò)實(shí)踐定時(shí)器枷莉,設(shè)置廣告的時(shí)長(zhǎng)娇昙,通過(guò)static設(shè)定只給變化的時(shí)間參數(shù)分配一次空間,
//添加倒計(jì)時(shí)功能
_timer= [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(timeChange)userInfo:nilrepeats:YES];
}
- (void)timeChange
{
staticinti =3;
i--;
if(i == -1) {
//計(jì)時(shí)結(jié)束
[selfjump:nil];
}
//設(shè)置按鈕標(biāo)題
NSString*title = [NSStringstringWithFormat:@"跳過(guò)(%d)",i];
[_jumpButtonsetTitle:titleforState:UIControlStateNormal];
}
27 笤妙、 標(biāo)簽界面的設(shè)定
創(chuàng)建標(biāo)簽控制器
28冒掌、自定義cell
建議通過(guò)XIB+代碼的形式創(chuàng)建自定義cell噪裕,給cell上的空間設(shè)置數(shù)據(jù)
29、加載數(shù)據(jù)
通過(guò)查詢數(shù)據(jù)的接口文檔查詢要加載的數(shù)據(jù)股毫,發(fā)送網(wǎng)絡(luò)請(qǐng)求
30州疾、訂閱數(shù)字的修改
通過(guò)NSString設(shè)定想要加載的數(shù)據(jù)
31、頭像圓角的設(shè)置
兩種方式:
(1)皇拣、通過(guò)layer的剪切
(2)严蓖、通過(guò)圖像的上下文剪切
if(image ==nil)return;
// 1.開啟圖形上下文
// opaque:不透明度YES:黑色NO:透明
// scale:比例因子(像素與點(diǎn)比例) 0:自動(dòng)識(shí)別當(dāng)前比例因子
UIGraphicsBeginImageContextWithOptions(image.size,NO,0);
// 2.描述裁剪區(qū)域
UIBezierPath*clipPath = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(0,0, image.size.width, image.size.height)];
// 3.設(shè)置裁剪區(qū)域
[clipPathaddClip];
// 4.畫圖
[imagedrawAtPoint:CGPointZero];
// 5.從上下文取出圖片
image =UIGraphicsGetImageFromCurrentImageContext();
// 6.關(guān)閉上下文
UIGraphicsEndImageContext();
// 7.一定要給控件重新賦值
_iconView.image= image;
32、tableView的分割線為樣式
(1)氧急、自定義分割線
通過(guò)去處系統(tǒng)的分割線颗胡,加上自己制定一的分割線
(2)設(shè)置系統(tǒng)屬性,讓分割線占據(jù)全屏
//版本適配iOS7
iOS多了一個(gè)屬性separatorInset
self.tableView.separatorInset=UIEdgeInsetsZero;
版本IOS8
多了一個(gè)約束邊緣屬性
layerMargins
if(version >=8.0) {//判斷當(dāng)前版本
cell.layoutMargins=UIEdgeInsetsZero;
}
******想要重新設(shè)定cell的尺寸吩坝,那么cell又一個(gè)setframe
可以在這里面設(shè)定cell的尺寸
- (void)setFrame:(CGRect)frame
{
//??? frame.origin.y += 1;
//??? frame.origin.x += 10;
frame.size.height-=1;
//??? frame.size.width -= 20;
//真正去設(shè)置frame
[supersetFrame:frame];
}
33毒姨、指示器效果
主要要與用戶加載網(wǎng)絡(luò)數(shù)據(jù)的時(shí)候提醒用戶的功能,還必須了解钉寝,view消失的時(shí)候需要做的事情弧呐,
34、關(guān)于文字換行
35嵌纲、當(dāng)一個(gè)界面比較復(fù)雜時(shí)俘枫,把界面分成幾個(gè)模塊,還有我們要考慮使用封裝的思想逮走,便于應(yīng)對(duì)界面的變化
36鸠蚪、文本框的占位顏色
這個(gè)屬性屬于視圖,所以可以通過(guò)tintcolor來(lái)設(shè)置
eg:self.tintColor= [UIColorwhiteColor];
37师溅、關(guān)于文本框的占位文字顏色
因?yàn)槲谋究驔](méi)有給我們提供文本框的占位文字顏色設(shè)置茅信,所以我們
只能設(shè)置占位文字的屬性來(lái)設(shè)置占位文字的顏色,
eg://初始化文本框占位文字顏色
NSMutableDictionary*attr = [NSMutableDictionarydictionary];
attr[NSForegroundColorAttributeName] = [UIColorlightGrayColor];
NSAttributedString*attrStr = [[NSAttributedStringalloc]initWithString:self.placeholderattributes:attr];
self.attributedPlaceholder= attrStr;
38墓臭、快捷設(shè)置文本框占位文字顏色
可以通過(guò)設(shè)置分類來(lái)給占位文字增加顏色屬性
@proprety UIColor * placeholder蘸鲸;
-(void)setPlaceholder:(UIColor *)color {
NSMutableDictionary*attr = [NSMutableDictionarydictionary];
attr[NSForegroundColorAttributeName] = placeholderColor;
NSAttributedString*attrStr = [[NSAttributedStringalloc]initWithString:self.placeholderattributes:attr];
self.attributedPlaceholder= attrStr;
}
39、考慮占位文字是什么空間窿锉,可能是UILable酌摇,所以如果能拿到UILable
我們只要設(shè)置UILalbe的就可以設(shè)置占位文字的顏色textColor
如果類沒(méi)有給我們提供空間,我們可以通過(guò)斷點(diǎn)和小面包查看是什么空間榆综,然后通過(guò)KVC
取出空間妙痹,給空間設(shè)置屬性铸史,
//猜測(cè)占位文字是UILabel =>驗(yàn)證占位文字是UILabel(通過(guò)小面包查看當(dāng)前界面是哪個(gè)類) =>設(shè)置占位文字顏色=>拿到這個(gè)占位文字label做事情=>蘋果木有提供這樣屬性給我拿這個(gè)控件=>思考:有些屬性可能存在,但是是私有沒(méi)有暴露給我們=>查看下這個(gè)類私有屬性名(1.runtime 2.斷點(diǎn)) => KVC
//直接獲取控件去設(shè)置
UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];
placeholderLabel.textColor= placeholderColor;
40鼻疮、怎樣設(shè)置讓空間的設(shè)置屬性沒(méi)有先后順序
OC的機(jī)制是懶加載,用到的時(shí)候在加載琳轿,所以要想設(shè)置沒(méi)有先后順序可以判斷空間
有沒(méi)有占位文字判沟,如果沒(méi)有耿芹。我們?cè)谠O(shè)置字符長(zhǎng)度為空
// OC是懶加載,用到的時(shí)候才會(huì)去加載
//直接獲取控件去設(shè)置
//注意點(diǎn):判斷字符串有沒(méi)有內(nèi)容根據(jù)長(zhǎng)度判斷
if(self.placeholder.length==0) {
self.placeholder=@" ";
}
//獲取控件
UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];
//設(shè)置顏色
placeholderLabel.textColor= placeholderColor;
41、對(duì)于固定不變的頁(yè)面我們一般可以通過(guò)storyboard來(lái)創(chuàng)建
42挪哄、設(shè)置我的界面的collectionView的分割線
我們可以通過(guò)設(shè)置間隙來(lái)設(shè)置collectionView的分割線
43吧秕、為了方便我們看代碼,我們一般都會(huì)通過(guò)抽取迹炼,來(lái)是代碼跟一目了然
之前我們一直都是通過(guò)把自己的功能放倒自己的功能模塊砸彬,現(xiàn)在我們可以通過(guò)
UICollectionView*collectionView = ({
collectionView = [[UICollectionViewalloc]initWithFrame:CGRectMake(0,0,0,300)collectionViewLayout:layout];
collectionView.backgroundColor= [UIColorclearColor];
//設(shè)置數(shù)據(jù)源.展示cell
collectionView.dataSource=self;
//注冊(cè)cell
[collectionViewregisterNib:[UINibnibWithNibName:@"XMGSquareCell"bundle:nil]forCellWithReuseIdentifier:ID];
collectionView;
});
44、關(guān)于網(wǎng)絡(luò)數(shù)據(jù)的加載和模型轉(zhuǎn)換
獲取網(wǎng)絡(luò)數(shù)據(jù)-查看接口文檔--創(chuàng)建會(huì)話管理者--設(shè)置請(qǐng)求參數(shù)--發(fā)送請(qǐng)求--接受數(shù)據(jù)--先寫入plist文件斯入,設(shè)置模型參數(shù)砂碉,字典數(shù)組轉(zhuǎn)模型,傳遞數(shù)據(jù)刻两,設(shè)置到對(duì)應(yīng)的cell上增蹭。
45、關(guān)于collection的行高
求出collection的實(shí)際行高磅摹,計(jì)算出footerView的實(shí)際行高我們?cè)谥匦掳阎蒂x值給footerView滋迈。
46、關(guān)于collectionView空格子的處理
格子的多少有模型決定所以我們要修補(bǔ)空格子户誓,就必須修改模型
47饼灿、點(diǎn)擊cell進(jìn)入網(wǎng)頁(yè)
展示網(wǎng)頁(yè):
1.UIWebView好處:在當(dāng)前app打開網(wǎng)頁(yè),弊端:沒(méi)有功能,自己去實(shí)現(xiàn),(進(jìn)度條)
2.Safari:好處:默認(rèn)有很多好用功能(進(jìn)度條,地址欄,前進(jìn),后退,刷新)弊端:必須要跳出當(dāng)前app
3.在當(dāng)前app展示網(wǎng)頁(yè),而且想要有safari功能,自定義UIWebView
4.SFSafariViewController:Safari iOS9展示網(wǎng)頁(yè),當(dāng)前app展示網(wǎng)頁(yè),有safari所有功能
ios8 有一個(gè)Webkit顯示網(wǎng)頁(yè);
通過(guò)KVO監(jiān)聽來(lái)改變帝美,網(wǎng)頁(yè)的進(jìn)退赔退;
48、清楚內(nèi)存的設(shè)置
通過(guò)獲取出的尺寸和位置來(lái)達(dá)到計(jì)算內(nèi)存的大小和位置
49证舟、獲取文件夾的尺寸
1硕旗、獲取NSFileManager對(duì)象
2、獲取文件夾里面的所有文件
3女责、遍歷文件夾的所有文件
4漆枚、拼接文件全路徑
5、attributesItemAtPath:指定一個(gè)文件全路徑
6抵知、獲取文件尺寸墙基,疊加起來(lái)
//獲取文件夾尺寸
- (NSInteger)getSizeOfDirectoryPath:(NSString*)directoryPath
{
// 1.獲取NSFileManager對(duì)象
NSFileManager*mgr = [NSFileManagerdefaultManager];
// 2.獲取文件夾里面所有文件
// subpathsAtPath:獲取文件夾里面所有子路徑,包含多級(jí).
NSArray*subpaths = [mgrsubpathsAtPath:directoryPath];
NSIntegertotalSize =0;
// 3.遍歷文件夾里所有文件
for(NSString*fileNameinsubpaths) {
// 4.拼接文件全路徑
NSString*filePath = [directoryPathstringByAppendingPathComponent:fileName];
//判斷下是否是隱藏文件或者是文件夾
if([fileNamehasPrefix:@"."])continue;//隱藏文件
//判斷下是否是文件夾
BOOLisDirectory;
[mgrfileExistsAtPath:filePathisDirectory:&isDirectory];
if(isDirectory)continue;//文件夾
// 5.獲取文件屬性
NSDictionary*attr = [mgrattributesOfItemAtPath:filePatherror:nil];
// 6.疊加文件尺寸
totalSize += [attrfileSize];
}
returntotalSize;
}
50、在cell上顯示數(shù)據(jù)
拼接字符和數(shù)據(jù)就可以
51刷喜、清楚緩存
思路:1残制、點(diǎn)擊cell的時(shí)候刪除全路徑下所有文件
2、創(chuàng)建路徑下文件夾‘
3掖疮、修改數(shù)據(jù)為0
4初茶、刷新列表。
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
//清除緩存
// 1.刪除文件夾
[[NSFileManagerdefaultManager]removeItemAtPath:XMGCachePatherror:nil];
// 2.創(chuàng)建文件夾
[[NSFileManagerdefaultManager]createDirectoryAtPath:XMGCachePathwithIntermediateDirectories:YESattributes:nilerror:nil];
//刷新表格
_totalSize=0;
[self.tableViewreloadData];
//??? [[SDImageCache sharedImageCache] clearDisk];
}
52浊闪、封裝業(yè)務(wù)類
封裝的要求
1恼布、業(yè)務(wù)類頂部螺戳,寫清楚這個(gè)類是干什么的
2、每個(gè)方法都必須有文檔主食折汞,外界調(diào)用的時(shí)候有提示
3倔幼、每個(gè)功能,一定要嚴(yán)謹(jǐn)判斷爽待。
eg:我們的文件緩存處理
/**
*功能:處理文件夾
*/
@interfaceXMGFileManager :NSObject
/**
*指定一個(gè)文件夾路徑,獲取這個(gè)文件夾尺寸
*
*? @param directoryPath文件夾全路徑
*
*? @return文件夾尺寸
*/
+ (NSInteger)getSizeOfDirectoryPath:(NSString*)directoryPath;
/**
*刪除文件
*
*? @param filePath刪除文件全路徑
*/
+ (void)deleteOfFilePath:(NSString*)filePath;
53损同、關(guān)于處理緩存的時(shí)候App卡頓的現(xiàn)象解決
因?yàn)樗形募钠唇雍筒樵兾募际窃谥骶€程中執(zhí)行,所以會(huì)造成主線程的卡頓鸟款,所以我們要把耗時(shí)的操作都放在揖庄,
之線程中操作,所以這個(gè)時(shí)候我們可以痛喲Block傳遞參數(shù)欠雌,把操作放在子線程中蹄梢,就不會(huì)造成主線程卡頓
dispatch_async(dispatch_get_global_queue(0,0), ^{
// 2.獲取文件夾里面所有文件
// subpathsAtPath:獲取文件夾里面所有子路徑,包含多級(jí).
NSArray*subpaths = [mgrsubpathsAtPath:directoryPath];
NSIntegertotalSize =0;
// 3.遍歷文件夾里所有文件
for(NSString*fileNameinsubpaths) {
// 4.拼接文件全路徑
NSString*filePath = [directoryPathstringByAppendingPathComponent:fileName];
//判斷下是否是隱藏文件或者是文件夾
if([fileNamehasPrefix:@"."])continue;//隱藏文件
//判斷下是否是文件夾
BOOLisDirectory;
[mgrfileExistsAtPath:filePathisDirectory:&isDirectory];
if(isDirectory)continue;//文件夾
// 5.獲取文件屬性
NSDictionary*attr = [mgrattributesOfItemAtPath:filePatherror:nil];
// 6.疊加文件尺寸
totalSize += [attrfileSize];
}
dispatch_sync(dispatch_get_main_queue(), ^{
/**
*一定要記得回到主線程
*/
if(completion) {
completion(totalSize);
}
});
});
54、精華界面的搭建
關(guān)于精華界面的搭建富俄,如果我們使用UIScrollerView就會(huì)造成離屏渲染禁炒,渲染也會(huì)創(chuàng)建很多對(duì)象,比較消耗內(nèi)存
所以我們可以使用霍比,UICollectionView來(lái)代替UIScrollerView幕袱,collectionView幫我們
實(shí)現(xiàn)了離屏渲染的問(wèn)題。因?yàn)閏ell的重用機(jī)制
那么如何處理數(shù)據(jù)的錯(cuò)亂呢悠瞬,我們可以在馬上要顯示的Cell上一處之前的view们豌,再把我們喲啊吸顯示的view添加到我們的cell上
55、如何顯示topView頂部條的標(biāo)題
我們可以仿照tabBar的設(shè)計(jì)浅妆。來(lái)設(shè)置頂部條望迎,因?yàn)槊總€(gè)控制器都有,一個(gè)titel屬性凌外,所以辩尊,我們可以把控制器的title屬性賦值,然后創(chuàng)建頂部條的標(biāo)題時(shí)康辑,把控制器的條內(nèi)容賦值給Btn
56摄欲、監(jiān)聽頂部按鈕的點(diǎn)擊
但點(diǎn)擊按鈕的時(shí)候讓對(duì)應(yīng)的按鈕處于選中狀態(tài)(重要的三部曲)
57、監(jiān)聽滾動(dòng)完成然tableView處于對(duì)應(yīng)的狀態(tài)
1疮薇、點(diǎn)擊按鈕的時(shí)候把要顯示的view添加到cell上
2胸墙、滾動(dòng)cell的時(shí)候讓按鈕 滾動(dòng)到對(duì)應(yīng)的位置
58、添加按鈕底部條的下劃線
可以在添加按鈕的時(shí)候按咒,把底部條迟隅,默認(rèn)放在第一個(gè)按鈕的下邊,但點(diǎn)擊
按鈕的時(shí)候把底部條改變X的的位置,處于對(duì)應(yīng)按鈕的下邊玻淑,當(dāng)滾動(dòng)cell的時(shí)候讓其處于對(duì)應(yīng)的按鈕下邊
59嗽冒、對(duì)于一個(gè)App里面我們可以重復(fù)利用的界面呀伙,可以進(jìn)行封裝补履,方便我們重復(fù)利用
封裝的要求是:把不改變的進(jìn)行封裝,改變的另外寫一個(gè)類剿另。
60箫锤、對(duì)于不等高的cell的搭建
對(duì)于比較復(fù)雜的cell我們需要靜心模塊封裝,防止以后對(duì)要變動(dòng)的改變
eg:我們的精華cell可以分為雨女,頂部View谚攒,中間View,熱評(píng)的View氛堕,底部View
61馏臭、頂部View的搭建
頂部View建議通過(guò)XIB+代碼的方式進(jìn)行搭建,
62讼稚、請(qǐng)求數(shù)據(jù)
通過(guò)AFN第三方框架我們進(jìn)行請(qǐng)求數(shù)據(jù)括儒,
查看接口文檔-查看請(qǐng)求參數(shù)-發(fā)送請(qǐng)求-進(jìn)行文檔解析 -數(shù)據(jù)轉(zhuǎn)模型
63、解析數(shù)據(jù)的過(guò)程
先要查看數(shù)據(jù)結(jié)構(gòu)--看是否需要序列化--不需要序列化截取我們需要的shuju
--字典轉(zhuǎn)模型--刷新列表
64锐想、分析控件的frame
想要計(jì)算空間的frame帮寻,必須在我們請(qǐng)求數(shù)據(jù)成功之后進(jìn)行frame計(jì)算
??:盡量不要在heightforRow計(jì)算我們的行高,因?yàn)檎{(diào)用過(guò)于頻繁赠摇,會(huì)造成界面卡頓
計(jì)算cell的高度固逗,可以通過(guò)獲取字體的字號(hào)和文字的寬度進(jìn)行計(jì)算
65、MVVM框架
VM :視圖模型 ?專門處理界面的業(yè)務(wù)邏輯藕帜,(計(jì)算空間的位置烫罩,點(diǎn)擊事件)
思路:進(jìn)行數(shù)據(jù)轉(zhuǎn)模型完之后,這個(gè)時(shí)候我們需要計(jì)算出空間的行高洽故,如果在控制器中計(jì)算顯得控制器代碼過(guò)于臃腫嗡髓,這個(gè)時(shí)候我們可以使用MVVM框架來(lái)對(duì)控制器進(jìn)行減負(fù)處理,把控制器管理
控件的frame和點(diǎn)擊等事件靜心VM處理收津。
VM的處理饿这,就是把數(shù)據(jù)模型傳遞給視圖模型,視圖模型把計(jì)算好的frame儲(chǔ)存到視圖模型撞秋,然后給視圖傳遞視圖模型长捧,展示數(shù)據(jù)。
66吻贿、搭建中間圖片的View
中間圖片的View搭建串结,其實(shí)和頂部視圖搭建方法相似,參考頂部view的搭建過(guò)程
67、關(guān)于中間圖片frame高度的計(jì)算
首先判斷是不是文本cell肌割,如果不是卧蜓,就計(jì)算cell的frame
關(guān)于frameH的計(jì)算,讓圖片的高度和寬度進(jìn)行等比列計(jì)算把敞,
68弥奸、關(guān)于cell的循環(huán)利用
當(dāng)是文本的時(shí)候我們需要隱藏cell的中間view,不是文本的時(shí)候讓hidden的屬性為NO
69奋早、對(duì)于大圖的處理
我們可以設(shè)置當(dāng)圖片尺寸大于屏幕的高度的高度的時(shí)候設(shè)置圖片的高度盛霎,這個(gè)時(shí)候還需要設(shè)置圖片的壓縮性,
70耽装、關(guān)于大圖的處理
對(duì)于大圖不能占據(jù)屏幕寬度愤炸,我們可是使用繪制圖片獲得一張新圖,來(lái)重新布置圖片
71掉奄、加載圖片的進(jìn)度處理
我們一般使用第三方框架來(lái)處理规个,對(duì)于精華加載圖片的樣式可以使用DALabeledCircularProgressView來(lái)調(diào)用其中的方法來(lái)實(shí)現(xiàn),加載圖片的進(jìn)度
72姓建、加載音頻
加載音頻的過(guò)程和之前加載圖片的過(guò)程基本相似
創(chuàng)建音頻的View--通過(guò)XIB進(jìn)行設(shè)計(jì)音頻的圖形設(shè)計(jì)--查看接口文檔定義屬性
--傳遞視圖模型--設(shè)置圖形的frame诞仓,給音頻View傳遞數(shù)據(jù),連線設(shè)置數(shù)據(jù)
73引瀑、搭建視頻View
和加載音頻過(guò)程類似:
創(chuàng)建視頻的View--通過(guò)XIB進(jìn)行設(shè)計(jì)視頻的圖形設(shè)計(jì)--查看接口文檔定義屬性
--傳遞視圖模型--設(shè)置圖形的frame狂芋,給視頻View傳遞數(shù)據(jù),連線設(shè)置數(shù)據(jù)
74憨栽、搭建最熱評(píng)論
過(guò)程和加載視頻過(guò)程類似
創(chuàng)建最熱評(píng)論的View--通過(guò)XIB進(jìn)行設(shè)計(jì)最熱評(píng)論的圖形設(shè)計(jì)--查看接口文檔定義屬性
--傳遞視圖模型--設(shè)置圖形的frame帜矾,給最熱評(píng)論View傳遞數(shù)據(jù),連線設(shè)置數(shù)據(jù)
??加載最熱評(píng)論的數(shù)據(jù)屬性:
其中涉及到加載過(guò)程屬性嵌套的問(wèn)題屑柔,這個(gè)時(shí)候我們需要對(duì)數(shù)據(jù)進(jìn)行分析屡萤,MJE不會(huì)幫我們轉(zhuǎn)換NSArray的屬性,這個(gè)時(shí)候我們需要告訴它掸宛,我們要加載的數(shù)組屬性是哪個(gè)類或者再次使用MJ轉(zhuǎn)換模型
- (void)setTop_cmt:(NSArray*)top_cmt
{
_top_cmt= top_cmt;
if(top_cmt.count) {
NSDictionary*commentDict = top_cmt.firstObject;
_hotCommentItem= [XMGCommentItemmj_objectWithKeyValues:commentDict];
}
}
/*****************************************/
//告訴MJ,數(shù)組中字典轉(zhuǎn)換成哪個(gè)模型
+ (NSDictionary*)mj_objectClassInArray
{
return@{@"top_cmt":@"XMGCommentItem"};
}
//在賦值之前,MJ就已經(jīng)把這個(gè)數(shù)組中字典轉(zhuǎn)換好模型,把模型包裝到數(shù)組,傳遞給你
- (void)setTop_cmt:(NSArray*)top_cmt
{
_top_cmt= top_cmt;
if(top_cmt.count) {
_hotCommentItem= top_cmt.firstObject;
}
}
??:如果模型中有模型會(huì)自動(dòng)幫我們轉(zhuǎn)換為模型
如果模型中有數(shù)組死陆,就不會(huì)幫我們轉(zhuǎn)換為模型
//如果模型中有模型,會(huì)自動(dòng)幫你轉(zhuǎn)換好
//如果模型中有數(shù)組,數(shù)組中是字典,就不會(huì)把數(shù)組中字典轉(zhuǎn)換成模型
@interfaceXMGCommentItem :NSObject
@property(nonatomic,strong)NSString*content;
@property(nonatomic,strong)NSString*voicetime;
@property(nonatomic,strong)NSString*voiceuri;
@property(nonatomic,strong)XMGUserItem*user;
75、底部工具條的搭建
創(chuàng)建底部工具條的View--通過(guò)XIB進(jìn)行設(shè)計(jì)底部工具條的圖形設(shè)計(jì)--查看接口文檔定義屬性
--傳遞視圖模型--設(shè)置圖形的frame唧瘾,給底部工具條View傳遞數(shù)據(jù)措译,連線設(shè)置數(shù)據(jù)
??:底部接受的數(shù)據(jù)進(jìn)行處理。
if(count >10000.0) {
CGFloatvalue = count /10000.0;
title = [NSStringstringWithFormat:@"%.1f萬(wàn)",value];
title = [titlestringByReplacingOccurrencesOfString:@".0"withString:@""];
}elseif(count >0){
title = [NSStringstringWithFormat:@"%ld",count];
}
[buttonsetTitle:titleforState:UIControlStateNormal];
76饰序、關(guān)于cell外觀的設(shè)計(jì)
主要是cell的方法set frame的應(yīng)用领虹。
77、cell頂部點(diǎn)擊更多的處理求豫。
主要是當(dāng)點(diǎn)擊更多數(shù)據(jù)的傳遞塌衰,(代理诉稍,block,通知的應(yīng)用)
//通知:讓兩個(gè)沒(méi)有關(guān)系對(duì)象,產(chǎn)生聯(lián)系,用于多級(jí)傳遞
//代理:1.逆?zhèn)?.封裝自己控件
// block:1.用于參數(shù)2.逆?zhèn)?替換代理)
2)想要拿到控制器做事情最疆,就想到根控制器
// Modal =>只要有控制器
//以后想要快速獲取控制器,就拿窗口的根控制器
[[UIApplicationsharedApplication].keyWindow.rootViewControllerpresentViewController:alertVcanimated:YEScompletion:nil];
78杯巨、關(guān)于時(shí)間的處理
NSDateFormatter時(shí)間格式的處理
關(guān)于NSCalendar日期元素的獲取
//?利用NSCalendar處理日期
NSCalendar*calendar?=?[NSCalendarcurrentCalendar];
NSIntegermonth?=?[calendar?component:NSCalendarUnitMonthfromDate:date];
NSIntegerhour?=?[calendar?component:NSCalendarUnitHourfromDate:date];
NSIntegerminute?=?[calendar?component:NSCalendarUnitMinutefromDate:date];
獲取時(shí)間的間隔:
//?獲得createdAtDate和nowDate的時(shí)間間隔(間隔多少秒)
//? ? NSTimeInterval?interval?=?[nowDate?timeIntervalSinceDate:createdAtDate];
NSTimeIntervalinterval?=?[createdAtDate?timeIntervalSinceNow];
//?獲得日期之間的間隔
NSCalendarUnitunit?=NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
NSDateComponents*cmps?=?[calendar?components:unit?fromDate:createdAtDate?toDate:otherDate?options:0];
NSLog(@"%@",?cmps);
增加的日期分類
- (NSDateComponents*)deltaWithNow
{
//獲取當(dāng)前時(shí)間
NSDate*currentDate = [NSDatedate];
//獲取日歷
NSCalendar*calendar = [NSCalendarcurrentCalendar];
//獲取兩個(gè)日期差值
return[calendarcomponents:NSCalendarUnitHour|NSCalendarUnitMinutefromDate:selftoDate:currentDateoptions:NSCalendarWrapComponents];
}
- (BOOL)isThisYear
{
//獲取當(dāng)前時(shí)間
NSDate*currentDate = [NSDatedate];
//獲取當(dāng)前時(shí)間年份日期組件對(duì)象
NSCalendar*calendar = [NSCalendarcurrentCalendar];
//指定一個(gè)日期,就返回這個(gè)日期的日期組件
//獲取當(dāng)前時(shí)間日期組件
NSDateComponents*curCmp = [calendarcomponents:NSCalendarUnitYearfromDate:currentDate];
//獲取發(fā)布時(shí)間日期組件
NSDateComponents*postCmp = [calendarcomponents:NSCalendarUnitYearfromDate:self];
//判斷下年份是否與當(dāng)前時(shí)間相等
returncurCmp.year== postCmp.year;
}
- (BOOL)isToday
{
//獲取當(dāng)前日歷類
NSCalendar*curCalendar =[NSCalendarcurrentCalendar];
return[curCalendarisDateInToday:self];
}
- (BOOL)isYesterday
{
//獲取當(dāng)前日歷類
NSCalendar*curCalendar =[NSCalendarcurrentCalendar];
return[curCalendarisDateInYesterday:self];
}
79、大圖的展示
創(chuàng)建控制器展示想要展示的圖片
80努酸、關(guān)于圖片的縮放
因?yàn)閟crollerView自帶縮放功能服爷,所以只要我們實(shí)現(xiàn)代理方法,實(shí)現(xiàn)代理方法
告訴系統(tǒng)我們要讓那個(gè)控件具有縮放功能蚊逢,
然后設(shè)置視圖的縮放比列即可层扶,
81箫章、如何向系統(tǒng)相冊(cè)保存一張圖片
首先獲取要保存的圖片烙荷,然后實(shí)現(xiàn)系統(tǒng)寫入照片的方法,
UIImageWriteToSavedPhotosAlbum(_imageView.image,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);
必須調(diào)用系統(tǒng)指定的方法檬寂,然后用指示器告訴用戶保存成功和失敗
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{
if(error) {
//保存失敗
[SVProgressHUDshowErrorWithStatus:@"保存失敗"];
}else{
//保存成功
[SVProgressHUDshowSuccessWithStatus:@"保存成功"];
}
}
82终抽、如何把下載好的相冊(cè)保存到自己的相冊(cè)中
蘋果保存圖片到自己的相冊(cè)中有自己的邏輯,先把相冊(cè)保存到系統(tǒng)中桶至,然后再把相冊(cè)從系統(tǒng)中昼伴,拷貝一份到自己的
相冊(cè)中
photos框架:專門處理相冊(cè)
如何學(xué)習(xí)新的框架:1、學(xué)習(xí)這個(gè)框架中常用的類镣屹,怎么知道框架中哪些類常用圃郊,
(百度/蘋果的官方文檔)
photos常用的類:PHPhotosLibrary:相簿(所有相冊(cè)的集合)
PHAsset:圖片(資源文件)
PHAssetCollection :相冊(cè)
PHAssetCreatRequest:創(chuàng)建,修改女蜈,刪除圖片
PHAssetCollectionResquest:創(chuàng)建持舆,修改刪除相冊(cè)
photos框架使用的規(guī)則: ? 要操縱相冊(cè)或者相片,必須發(fā)送請(qǐng)求
如何了結(jié)一個(gè)類怎么使用:
1伪窖、跳轉(zhuǎn)頭文件逸寓,查看怎么使用
2、按住option覆山,查看PHPhotosLibrary
業(yè)務(wù)邏輯:
在相薄中進(jìn)行
1竹伸、創(chuàng)建自己的相冊(cè)(相冊(cè)請(qǐng)求類創(chuàng)建相冊(cè))
2、創(chuàng)建圖片請(qǐng)求
3簇宽、添加圖片到相冊(cè)
4勋篓、用戶授權(quán)
83、怎樣解決魏割,每次添加圖片都會(huì)重新創(chuàng)建一個(gè)新的相冊(cè)
通過(guò)獲取系統(tǒng)相冊(cè)譬嚣,然后遍歷系統(tǒng)所有相冊(cè),看是否有相冊(cè)和要?jiǎng)?chuàng)建的相冊(cè)同名
有就返回见妒,沒(méi)有救不返回孤荣,
然后判斷系統(tǒng)是否有相冊(cè)甸陌,有相冊(cè)就創(chuàng)建圖片請(qǐng)求
沒(méi)有救創(chuàng)建相冊(cè)
84、相冊(cè)的封裝
85盐股、添加上拉刷新钱豁,
其實(shí)就是添加tableView的底部footerView
86、上拉刷新邏輯
什么時(shí)候進(jìn)行上拉刷新數(shù)據(jù)
上拉控件疯汁,完全顯示的時(shí)候牲尺,才會(huì)加載數(shù)據(jù)
當(dāng)用戶拖動(dòng)的時(shí)候,判斷上拉什么時(shí)候現(xiàn)實(shí)完畢刷新數(shù)據(jù)
怎樣知道是刷新的新數(shù)據(jù)幌蚊,必須記錄上一頁(yè)最大的maxTime
記錄下來(lái)
87谤碳、關(guān)于下拉懸浮的處理
就是在下拉停止拖動(dòng)的時(shí)候設(shè)置下拉偏移量。