iOS_CNBlog项目开发 (基于博客园api开发) 上篇
按照慣例, 先上效果圖
?
前言
做這個(gè)項(xiàng)目是因?yàn)閯偤迷诠洳┛蛨@的時(shí)候看到一篇文章?博客園第三方客戶端-i博客園正式發(fā)布App Store, 這里就幫忙貼下鏈接吧.?
整個(gè)項(xiàng)目做下來大概做了半個(gè)月, 今天算是做出1.0版本, 已經(jīng)貼上github(https://github.com/samAroundGitHub/CNBlog), 歡迎各路人士指導(dǎo)交流啦.
項(xiàng)目介紹?
1. 工具和資料
博客園官方open web api網(wǎng)址:(再次感謝桑果, 因?yàn)槲也粫襛pi...(╮(╯▽╰)╭))
第三方框架 (這次主要想說不要用太多第三方, 所以為了開發(fā)效率只用了幾個(gè))
?
2. UI設(shè)計(jì)
這里就貼下我的一些UI杰作好了(^^)
項(xiàng)目中用到的UI, 像appIcon, LaunchImage, 還有一些占位圖標(biāo)我是自己做的(Sketch), 然后有一部分是http://www.easyicon.net上的, 還有一部分是以前項(xiàng)目的圖標(biāo), 我也有從ituns下載app, 打開它的包想拿它的圖片, 竟然沒找到想要的那幾個(gè), 應(yīng)該是發(fā)網(wǎng)絡(luò)請求獲取的吧.
不知道怎么獲取app圖片資源的, 這里推薦一個(gè)網(wǎng)址:iOS,如何模仿一個(gè)App
開發(fā)難點(diǎn)
1. 博客園api數(shù)據(jù)解析
博客園返回的數(shù)據(jù)是xml, 所以我選擇用蘋果官方自帶的NSXMLParser進(jìn)行解析, 為此我特地寫了一個(gè)工具類(SMXMLParserTool), 這里介紹一下用法, 有需要的可以拖到你的項(xiàng)目自己就使用.
.h文件
+ (instancetype)sm_toolWithURLString:(NSString *)urlString nodeName:(NSString *)nodeName completeHandler:(void (^)(NSArray *contentArray, NSError *error))completerHandler; - (instancetype)sm_initWithURLString:(NSString *)urlString nodeName:(NSString *)nodeName completeHandler:(void (^)(NSArray *contentArray, NSError *error))completerHandler;@property (nonatomic, readonly, strong) NSArray *contentArray; @property (nonatomic, strong) NSString *nodeName;使用的時(shí)候只需要調(diào)用類方法, [SMXMLParserTool sm_toolWithURLString:...], 需要傳入一個(gè)xml節(jié)點(diǎn)的名稱, 比如博客園的xml節(jié)點(diǎn)結(jié)構(gòu)如下的話,
<doc><feed><title>博客園_48小時(shí)閱讀排行</title><id>d2e2f719-12cd-414e-ac2c-9d376c950c8a;id=...</id>// 刷新時(shí)間<updated></updated><entry> </entry><entry> </entry><entry> </entry></feed> </doc>// 博客信息 <entry> // 文章id<id></id>// 博客題目<title></title>// 文章概述<summary></summary>// 發(fā)布時(shí)間<published></published>// 獲取時(shí)間<updated></updated>// 發(fā)布人信息<author>// 姓名<name></name>// 博客首頁<uri></uri><avatar>// 頭像<http/></avatar></author><link></link>// 推薦人數(shù)<diggs></diggs>// 閱讀過的人數(shù)<views></views>// 評論數(shù)<comments></comments></entry>你只要傳入@"entry", 然后就會得到節(jié)點(diǎn)entry下以各子節(jié)點(diǎn)為key值為value的dictionary然后存入到contentArray, 在回調(diào)函數(shù)completeHandler中可以直接使用獲得的數(shù)據(jù)contentArray. 如果解析過程發(fā)生錯(cuò)誤, error信息會被打印到控制臺. ?
?
2. 第二個(gè)難點(diǎn)還是博客園api的數(shù)據(jù)解析
因?yàn)椴┛蛨@返回博客的文章格式是html格式的. 所以需要解析html語句.?這里我采用的方法是[UIWebView LoadHtmlString:..];
然后會發(fā)現(xiàn)解析完的頁面圖片會超出顯示范圍, 這是需要用到?[webView stringByEvaluatingJavaScriptFromString:..] 用javaScript改變圖片大小
// 設(shè)置圖片的寬高適應(yīng)屏幕[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"var script = document.createElement('script');""script.type = 'text/javascript';""script.text = \"function ResizeImages() { ""var myImg,oldWidth,oldHeight;""var maxWidth=%f;"// 圖片寬度"for(i=0;i <document.images.length;i++){""myImg = document.images[i];""oldWidth = myImg.width;oldHeight = myImg.height;""var scale = oldWidth/oldHeight;""if(myImg.width > maxWidth){""myImg.width = maxWidth;myImg.height = maxWidth/scale;""}""}""}\";""document.getElementsByTagName('head')[0].appendChild(script);", kScreenW-20]];[webView stringByEvaluatingJavaScriptFromString:@"ResizeImages();"];?這樣就可以把超過的圖片顯示到你要的范圍內(nèi)了.
?
3. 第三個(gè)難點(diǎn)還是博客園api數(shù)據(jù)解析
這次是為什么這樣說呢? 因?yàn)槿绻阋c(diǎn)擊webView下的圖片有響應(yīng), 還得再次用到剛剛的方法?[UIWebView LoadHtmlString:..];
默認(rèn)的情況下點(diǎn)擊是不會觸發(fā)事件的, 所以要用javaScript讓圖片有onclick()方法, 然后改變document.loaction的值, 實(shí)現(xiàn)頁面跳轉(zhuǎn), 在UIWebView代理方法?- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 下捕捉事件進(jìn)行處理
// 添加圖片的onclick方法NSString *setImageOnclickString = [NSString stringWithFormat:@"function setImageOnclick() {\var imgs = document.getElementsByTagName('img');\for(var i=0; i<imgs.length; i++) {\imgs[i].onclick = function(){\document.location = this.src;}}}"];[webView stringByEvaluatingJavaScriptFromString:setImageOnclickString];[webView stringByEvaluatingJavaScriptFromString:@"setImageOnclick()"];?我處理的方法是用蘋果新的內(nèi)嵌SFSafariViewController實(shí)現(xiàn)跳轉(zhuǎn), 這樣的好處是直接可以在app內(nèi)享有safari自帶的功能, 比如保存圖片, 進(jìn)入閱讀模式等等, 而且還是在app內(nèi)沒有離開你的app. ?使用SFSafariViewController前需要?#import <SafariServices/SafariServices.h>
?4. 第四個(gè)難點(diǎn)依然是博客園api數(shù)據(jù)解析
醉了, 是不是. 哈哈. 不過這次我說的難點(diǎn)是在邏輯上不是在技術(shù)上的. 獲取數(shù)據(jù)的數(shù)目上下拉的獲取多少數(shù)據(jù), 總共有多少數(shù)據(jù), 不一次性獲取數(shù)據(jù)的情況下每次獲取多少數(shù)據(jù)可以避免流量浪費(fèi), 反正是一系列邏輯上要解決的問題, 由于情況很多, 我就不貼代碼了, 有遇到問題再交流交流.
5. tarBarHideWhenPush
終于第五個(gè)難點(diǎn)不是api數(shù)據(jù)解析了, 但是其實(shí)tarBarHideWhenPush也不算難點(diǎn), 只是會經(jīng)常走彎路, 當(dāng)UITabBarViewController嵌套UINavgationController附加有UIViewController, 反正關(guān)系一復(fù)雜起來, 就會發(fā)現(xiàn)很多人問hidesBottomBarWhenPushed = YES為什么不管用, 我也百度過試過很多方法, 比如?
self.hidesBottomBarWhenPushed = YES;[self.navigationController pushViewController:.. animated:YES];self.hidesBottomBarWhenPushed = NO;再比如, 在viewDidappear中才加入 self.hidesBottomBarWhenPushed = YES. 反正就是很多說法, 但是都不怎么有效..
我獨(dú)門的解決方法是在你要隱藏tarBar的VC中調(diào)用
// push后隱藏tabBar - (BOOL)hidesBottomBarWhenPushed {return YES; }??
轉(zhuǎn)載于:https://www.cnblogs.com/easyToCode/p/5274410.html
總結(jié)
以上是生活随笔為你收集整理的iOS_CNBlog项目开发 (基于博客园api开发) 上篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 2647 Reward (拓扑排
- 下一篇: Object-c 类、对象方法