高性能圖文混排框架帚豪,構(gòu)架順滑的iOS應(yīng)用

About GallopGallop是一個(gè)功能強(qiáng)大诚欠、性能優(yōu)秀的圖文混排框架顽染。

Features

主要用于解決以下需求:

滾動(dòng)列表的性能優(yōu)化。Gallop使用異步繪制轰绵、視圖層級(jí)合并粉寞、觀察mainRunloop、對(duì)布局模型預(yù)先緩存等方法左腔,能在實(shí)現(xiàn)復(fù)雜的圖文混排界面時(shí)唧垦,仍然保持一個(gè)相當(dāng)優(yōu)秀的滾動(dòng)性能(FPS基本保持在60)。

項(xiàng)目內(nèi)有使用Gallop構(gòu)建的微信朋友圈Demo

實(shí)現(xiàn)圖文混排界面液样,比如在文本中添加表情振亮,對(duì)文字添加點(diǎn)擊鏈接。Gallop還提供了方便的方法可以直接完成表情鞭莽、URL鏈接坊秸、@用戶、#話題#等的解析澎怒。

簡便地實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)圖片和本地圖片的圓角和模糊處理褒搔,并能提供緩存,無需重復(fù)處理,優(yōu)化性能星瘾。

方便的解析HTML渲染生成原生iOS頁面走孽。項(xiàng)目內(nèi)有使用Gallop構(gòu)建的知乎日?qǐng)?bào)Demo

滾動(dòng)性能請(qǐng)使用真機(jī)調(diào)試查看效果

Demo Snapshot

Modifications

v0.3.5

LWImageStorage 新增一個(gè)屬性isBlur。本地圖片時(shí)琳状,將在子線程進(jìn)行模糊處理磕瓷;當(dāng)網(wǎng)絡(luò)圖片時(shí),將在子線程進(jìn)行模糊處理并直接緩存模糊的版本念逞。詳見Demo困食。

v0.3.4

支持CoreData來緩存布局模型

v0.3.3

更改了集成方式,解決了與SDWebImage部分文件沖突的問題肮柜。

v0.3.2

現(xiàn)在陷舅,設(shè)置了圓角半徑的網(wǎng)絡(luò)圖片將額外緩存一份倒彰,解決了內(nèi)存消耗過大的問題审洞。

v0.3.1

解析HTML渲染生成原生iOS頁面時(shí),圖片可以按照原圖比例自適應(yīng)高度了待讳。

v0.3.0

增加了解析HTML渲染生成原生iOS頁面的功能芒澜。

v0.2.5

對(duì)圖片加載進(jìn)行了優(yōu)化。

v0.2.4

增加了TransactionGroup创淡,LWTransaction痴晦,CALayer+LWTransaction。

v0.2.3

文字添加了描邊繪制模式琳彩。

v0.2.2

增加了一個(gè)方法

- (void)lw_addLinkForWholeTextStorageWithData:(id)data linkColor:(UIColor *)linkColor highLightColor:(UIColor *)highLightColor;

?

廢棄了方法

- (id)initWithFrame:(CGRect)frame maxImageStorageCount:(NSInteger)maxCount;

?

現(xiàn)在誊酌,LWAsyncDisplayView內(nèi)部將自動(dòng)維護(hù)一個(gè)復(fù)用池,可以為LWStorage設(shè)置一個(gè)NSString*類型的Identifier露乏,來復(fù)用內(nèi)部的相關(guān)UIView,簡化API碧浊。

修復(fù)了對(duì)文字添加鏈接重疊而發(fā)生沖突的bug.

TODO

對(duì)視頻、音頻的支持瘟仿。

Requirements

使用Gallop實(shí)現(xiàn)網(wǎng)絡(luò)圖片加載部分依賴于SDWebImage 'SDWebImage', '~>3.7'

HTML解析依賴libxml2庫

Installation

在XCode的Build Phases-> Link Binary With Libraries中添加libxml2.tbd庫

在XCode的Build Setting->Header Search Paths中添加‘/usr/include/libxml2’

安裝SDWebImage

將Gallop文件夾下的.h及.m文件添加到你的工程當(dāng)中

#import "Gallop.h"

Usage

API

Quickstart

#import "Gallop.h"

1.生成一個(gè)文本模型

LWTextStorage* textStorage = [[LWTextStorage alloc] init];
textStorage.text = @"waynezxcv";
textStorage.font = [UIFont systemFontOfSize:15.0f];
textStorage.textColor = RGB(113, 129, 161, 1);
/***  為文本添加點(diǎn)擊鏈接事件  ***/
[textStorage addLinkWithData:data
inRange:NSMakeRange(0,statusModel.name.length)
linkColor:RGB(113, 129, 161, 1)
highLightColor:RGB(0, 0, 0, 0.15)];
/***  點(diǎn)擊鏈接回調(diào)  ***/
- (void)lwAsyncDisplayView:(LWAsyncDisplayView *)asyncDisplayView didCilickedLinkWithfData:(id)data;
/***  用本地圖片替換掉指定位置的文字  ***/
[textStorage lw_replaceTextWithImage:[UIImage imageNamed:@"img"]
contentMode:UIViewContentModeScaleAspectFill
imageSize:CGSizeMake(60, 60)
alignment:LWTextAttachAlignmentTop
range:NSMakeRange(webImageTextStorage.text.length - 7, 0)];
/***  用網(wǎng)絡(luò)圖片替換掉指定位置的文字  ***/
[textStorage lw_replaceTextWithImageURL:[NSURL URLWithString:@"https://avatars0.githubusercontent.com/u/8408918?v=3&s=460"]
contentMode:UIViewContentModeScaleAspectFill
imageSize:CGSizeMake(60, 60)
alignment:LWTextAttachAlignmentTop
range:NSMakeRange(webImageTextStorage.text.length - 7, 0)];
/***  用UIView替換掉指定位置的文字  ***/
[textStorage lw_replaceTextWithView:[[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 60.0f, 30.0f)]
contentMode:UIViewContentModeScaleAspectFill
size:CGSizeMake(60.0f, 30.0f)
alignment:LWTextAttachAlignmentTop
range:NSMakeRange(1,0)];

?

2.生成一個(gè)圖片模型

/***  本地圖片  ***/
LWImageStorage* imamgeStorage = [[LWImageStorage alloc] init];
imamgeStorage.contents = [UIImage imageNamed:@"pic.jpeg"];
imamgeStorage.frame = CGRectMake(textStorage.left, textStorage.bottom + 20.0f, 80, 80);
imamgeStorage.cornerRadius = 40.0f;//設(shè)置圓角半徑
/***  網(wǎng)絡(luò)圖片  ***/
LWImageStorage* imamgeStorage = [[LWImageStorage alloc] init];
imamgeStorage.contents = [NSURL URLWithString:@"https://avatars0.githubusercontent.com/u/8408918?v=3&s=460"];
imamgeStorage.frame = CGRectMake(textStorage.left, textStorage.bottom + 20.0f, 80, 80);
imamgeStorage.cornerRadius = 40.0f;
/***  點(diǎn)擊圖片回調(diào)  ***/
- (void)lwAsyncDisplayView:(LWAsyncDisplayView *)asyncDisplayView didCilickedImageStorage:(LWImageStorage *)imageStorage touch:(UITouch *)touch;

?

3.生成布局模型

LWLayout* layout = [[LWLayout alloc] init];
/***  將LWstorage實(shí)例添加到layout當(dāng)中  ***/
[layout addStorage:textStorage];
[layout addStorage:imamgeStorage];

?

4.創(chuàng)建LWAsyncDisplayView箱锐,并將LWLayout實(shí)例賦值給創(chuàng)建LWAsyncDisplayView對(duì)象

LWAsyncDisplayView* asyncDisplayView = [[LWAsyncDisplayView alloc] initWithFrame:CGRectZero];
asyncDisplayView.layout = layout;
[self.view addSubview:asyncDisplayView];

?

5.解析HTML生成iOS原生頁面

/*** 創(chuàng)建LWHTMLDisplayView  ***/
LWHTMLDisplayView* htmlView = [[LWHTMLDisplayView alloc] initWithFrame:self.view.bounds];
htmlView.parentVC = self;
htmlView.displayDelegate = self;
[self.view addSubview:htmlView];
/***  獲取LWStorageBuilder  ***/
LWStorageBuilder* builder = htmlView.storageBuilder;
/***  創(chuàng)建LWLayout  ***/
LWLayout* layout = [[LWLayout alloc] init];
/***  創(chuàng)建LWHTMLTextConfig  ***/
LWHTMLTextConfig* contentConfig = [[LWHTMLTextConfig alloc] init];
contentConfig.font = [UIFont fontWithName:@"Heiti SC" size:15.0f];
contentConfig.textColor = RGB(50, 50, 50, 1);
contentConfig.linkColor = RGB(232, 104, 96,1.0f);
contentConfig.linkHighlightColor = RGB(0, 0, 0, 0.35f);
/***  創(chuàng)建另一個(gè)LWHTMLTextConfig  ***/
LWHTMLTextConfig* strongConfig = [[LWHTMLTextConfig alloc] init];
strongConfig.font = [UIFont fontWithName:@"STHeitiSC-Medium" size:15.0f];
strongConfig.textColor = [UIColor blackColor];
/***  通過XPath解析HTML并生成LWStorage  ***/
/***  通過UIEdgeInsets設(shè)置布局傳入第二個(gè)參數(shù) ***/
/*** 標(biāo)簽名對(duì)應(yīng)的LWHTMLTextConfig以字典的Key-Value格式傳入最后一個(gè)參數(shù) ***/
[builder createLWStorageWithXPath:@"http://div[@class='content']/p"
edgeInsets:UIEdgeInsetsMake([layout suggestHeightWithBottomMargin:10.0f], 10.0f, 10.0, 10.0f)
configDictionary:@{@"p":contentConfig,
@"strong":strongConfig,
@"em":strongConfig}];
/***  獲取生成的LWStorage實(shí)例數(shù)組  ***/
NSArray* storages = builder.storages;
/***  添加到LWLayout實(shí)例  ***/
[layout addStorages:storages];
/***  給LWHTMLDisplayView對(duì)象并賦值  ***/
htmlView.layout = layout;

?

原文地址:http://code4app.com/forum.php?mod=viewthread&tid=10375&extra=page%3D2%26filter%3Dsortid%26orderby%3Ddateline%26sortid%3D1?


長按關(guān)注:

QQ群:427763454

歡迎你的投稿,展示的你的技術(shù)文章:812920365@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劳较,隨后出現(xiàn)的幾起案子驹止,更是在濱河造成了極大的恐慌,老刑警劉巖观蜗,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臊恋,死亡現(xiàn)場離奇詭異,居然都是意外死亡墓捻,警方通過查閱死者的電腦和手機(jī)抖仅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岸售,你說我怎么就攤上這事践樱。” “怎么了凸丸?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵拷邢,是天一觀的道長。 經(jīng)常有香客問我屎慢,道長瞭稼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任腻惠,我火速辦了婚禮环肘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘集灌。我一直安慰自己悔雹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布欣喧。 她就那樣靜靜地躺著腌零,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唆阿。 梳的紋絲不亂的頭發(fā)上益涧,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音驯鳖,去河邊找鬼闲询。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浅辙,可吹牛的內(nèi)容都是我干的扭弧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摔握,長吁一口氣:“原來是場噩夢啊……” “哼寄狼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氨淌,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤泊愧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盛正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體删咱,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年豪筝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痰滋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘能。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敲街,靈堂內(nèi)的尸體忽然破棺而出团搞,到底是詐尸還是另有隱情,我是刑警寧澤多艇,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布逻恐,位于F島的核電站,受9級(jí)特大地震影響峻黍,放射性物質(zhì)發(fā)生泄漏复隆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一姆涩、第九天 我趴在偏房一處隱蔽的房頂上張望挽拂。 院中可真熱鬧,春花似錦骨饿、人聲如沸亏栈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仑扑。三九已至,卻和暖如春置鼻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜓竹。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工箕母, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俱济。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓嘶是,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛛碌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聂喇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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