IOS工程項(xiàng)目創(chuàng)建完整過(guò)程

一 、使用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è)置下拉偏移量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溢豆,一起剝皮案震驚了整個(gè)濱河市蜒简,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漩仙,老刑警劉巖搓茬,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異队他,居然都是意外死亡卷仑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門麸折,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锡凝,“玉大人,你說(shuō)我怎么就攤上這事垢啼〈芫猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵膊夹,是天一觀的道長(zhǎng)衬浑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)放刨,這世上最難降的妖魔是什么工秩? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任骚亿,我火速辦了婚禮促脉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘燕雁。我一直安慰自己螟碎,他們只是感情好眉菱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掉分,像睡著了一般俭缓。 火紅的嫁衣襯著肌膚如雪克伊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天华坦,我揣著相機(jī)與錄音愿吹,去河邊找鬼。 笑死惜姐,一個(gè)胖子當(dāng)著我的面吹牛犁跪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歹袁,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坷衍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了条舔?” 一聲冷哼從身側(cè)響起枫耳,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逞刷,沒(méi)想到半個(gè)月后嘉涌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妻熊,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夸浅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扔役。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帆喇。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亿胸,靈堂內(nèi)的尸體忽然破棺而出坯钦,到底是詐尸還是另有隱情,我是刑警寧澤侈玄,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布婉刀,位于F島的核電站,受9級(jí)特大地震影響序仙,放射性物質(zhì)發(fā)生泄漏突颊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一潘悼、第九天 我趴在偏房一處隱蔽的房頂上張望律秃。 院中可真熱鬧,春花似錦治唤、人聲如沸棒动。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)船惨。三九已至柜裸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱锐,已是汗流浹背粘室。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卜范,地道東北人衔统。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像海雪,于是被迫代替她去往敵國(guó)和親锦爵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)奥裸、插件险掀、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評(píng)論 4 62
  • 2017.02.22 可以練習(xí),每當(dāng)這個(gè)時(shí)候湾宙,腦袋就犯困樟氢,我這腦袋真是神奇呀,一說(shuō)讓你做事情侠鳄,你就犯困埠啃,你可不要太...
    Carden閱讀 1,342評(píng)論 0 1
  • 今天辦公室里一同事問(wèn)我,看了最近大火的《摔跤吧伟恶!爸爸》了嗎碴开?我答看了。他立馬說(shuō):“我竟然看哭了博秫,你呢潦牛?”(男同事)...
    左佳妮閱讀 168評(píng)論 0 0
  • 你滿懷自信的參加考試巴碗,經(jīng)過(guò)充分的學(xué)習(xí)和準(zhǔn)備,到了考場(chǎng)上即寒,才發(fā)現(xiàn)自己學(xué)的和考的內(nèi)容壓根就不一樣橡淆。 你自信滿滿的追一個(gè)...
    洃少Huisir閱讀 430評(píng)論 7 3
  • 我不過(guò)是一只大城市的小螻蟻 每月忙碌只為了那份杯水車薪的工資 生活中所有的不易 其實(shí)并不會(huì)真有人愿意跟你分擔(dān) 一...
    Violin_0922閱讀 770評(píng)論 0 0