在TTCatalog這個Example中, 有一個TTStyleTextLabel如何使用的樣例,就從這個開始入手吧.
1) 創(chuàng)建一個TTStyledTextLabel對象,很簡單,把它加入到view中就可以顯示了
NSString* kText = @"
This is a test of styled labels. Styled labels support
<b>bold text</b>,.......";
TTStyledTextLabel* label1 = [[TTStyledTextLabel alloc] initWithFrame:self.view.bounds] autorelease];
label1.font = [UIFont systemFontOfSize:17];
label1.text = [TTStyledText textFromXHTML:kText lineBreaks:YES URLs:YES];
TTStyleTextLabel自身實(shí)現(xiàn)的功能主要就是監(jiān)聽touch事件,然后反饋給內(nèi)部的鏈接和其他可touch的節(jié)點(diǎn).
2) TTStyleTextLabel的神奇之處在于它包含的 text:TTStyleText
TTStyleText的兩個屬性是核心:
TTStyledNode* _rootNode; // 實(shí)現(xiàn)了內(nèi)部樣式化文本塊的鏈表
TTStyledFrame* _rootFrame; //存儲文本塊所占用的空間的鏈表
在把xhtml解析成多個node后, 使用TTStyledLayout對其計算空間,然后記錄在_rootFrame中
3) TTStyleText對于XHTML文本塊使用解析器: TTStyledTextParser:
TTStyledTextParser* parser = [[TTStyledTextParser alloc] init] autorelease];
parser.parseLineBreaks = lineBreaks;
parser.parseURLs = URLs;
[parser parseXHTML:source];
4) TTStyleTextParser處理<img><b><a>等tag,然后拆分成一塊塊簡單內(nèi)容(文本或者圖片),在_rootNode中串聯(lián)起來
處理xhtmltag的代碼在- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict; 有興趣的童鞋可以去看看.
學(xué)習(xí)Three20和TTStyledTextLabel的初衷是建立一個類似facebook中消息列表中顯示的一個包含文字和圖片的消息.
可惜試了Three20的例子后發(fā)現(xiàn), 只能使用inline的方式排版,看來要實(shí)現(xiàn)更復(fù)雜的布局還是需要自己動手~
初步嘗試寫了一個只是支持多個樣式的UILabel, 還在琢磨在加入圖片后怎么布局. 這個功能就真有點(diǎn)像是一個mini瀏覽器了,就怪apple 的ios sdk的布局功能太弱了......