iOS開發--從TQRichTextViewDemo中學會分析工程,tqrichtextview
:
http://code4app.com/ios/TQRichTextView/5244fe9c6803fa0862000000
1.首先找到AppDelegate類,無論一個工程有多麼複雜,多麼多的類,但入口只有一個就是AppDelegate類的didFinishLaunchingWithOptions方法。我們閱讀別人原始碼的時候可以從這裡入手。在TQRichTextViewDemo工程中,這個方法中僅建立了一個TQViewController並設定為window的rootViewController。
2.去看TQViewController的實現。首先也是從初始化方法開始,沒有initWithNib,那麼就看viewDidLoad。在這個方法中,只建立了一個TQRichTextView,設定了frame,text,backgroundColor,delegate等屬性,然後添加到了self.view上。看完viewDidLoad方法,發現這是系統調用的最後一個方法,那麼結合模擬器的運行效果,我們可以猜測,文字的解析和繪製過程被封裝到了TQRichTextView中。
3.去看TQRichTextView。
執行TQRichTextURLRun的一個方法,傳入result和array的指標。
- 同上,直接去看這個方法的實現。從和TQRichTextEmojiRun的命名格式類似,調用的方法名類似,我們可以猜測這個方法是解析URL的,那麼就直接看重點。發現,如果找到匹配的字串,就建立一個TQRichTextURLRun的對象,設定range=URL的range,originText = URL,然後把對象添加到傳進來的數組中,最後返回string。
- 通過看TQRichTextURLRun的init方法,發現同上初始化時設定了兩個變數,來自父類TQRichTextBaseRun,分別設定了TQRichTextRunType和是否響應觸摸。發現TQRichTextEmojiRun繼承自TQRichTextImageRun,TQRichTextImageRun繼承自TQRichTextBaseRun。
- 跳出這個方法,回到analyzeText中,繼續往下看。
遍曆richTextRunsArray中的對象,每個對象調用setOriginalFont方法,傳入參數self.font。通過閱讀上面的兩個方法的內部實現明白richTextRunsArray中儲存的是TQRichTextEmojiRun和TQRichTextURLRun對象,所以去看這兩個對象的setOriginalFont方法。
- 這個設定的是繼承自父類TQRichTextBaseRun的屬性。
- 回到analyzeText繼續往下看。
返回result,跳出這個方法,繼續看drawRect。
接下來是建立NSAttrbutedString,並賦值一些屬性。
文本處理,遍曆richTextRunsArray中的對象,每個對象調用replaceTextWithAttributedString方法。
- 在TQRichTextEmojiRun沒有找到replaceTextWithAttributedString方法,那就去TQRichTextImageRun中找,閱讀該方法。
- 傳入的attrString刪除佔位的空格字元。
- 建立CTRunDelegateCallbacks,返現設定的寬高為OriginalFont的高度的1.1倍。
- 建立空格NSAttrbutedString對象,添加CTRunDelegateRef屬性。
- 把空格NSAttrbutedString對象插入至傳入的attrString。
- 查看super方法,發現在這段range上還設定了一個鍵值對,key為TQRichTextAttribute,value為自己。
- 同上閱讀TQRichTextURLRun的replaceTextWithAttributedString方法。
- 為該段range的文字添加藍色字型。
- 調用super方法,為該段range添加同上的key-value鍵值對。
- 返回繼續閱讀drawRect。
下面是繪製的準備工作,不想研究咋繪製的粗讀就行。
清空richTextRunRectDic
繪製,不想研究的也可粗讀略過。
找重點,繪製替換過的特殊文本單元。
- 遍曆取出每一個run,取出run的attributes中key為TQRichTextAttribute的值。
- 如果值存在,則說明,這個run是特殊的run。
- 求run的frame,粗讀略過。
- 調用drawRunWithRect方法,並將返回值賦給idDraw變數。
- TQRichTextEmojiRun的drawRunWithRect方法中繪製了表情圖片,返回YES。
- TQRichTextURLRun的drawRunWithRect方法返回NO。
- TQRichTextBaseRun的drawRunWithRect方法返回NO。
- 判斷run的isResponseTouch屬性,尋找後發現是TQRichTextBaseRun的屬性,注釋說是是否響應觸摸
- 如果響應觸摸
- 在richTextRunRectDic中添加鍵值對,key為rect,value為run。
設定迴圈的條件,釋放CF類型的變數。CF類型的變數不支援ARC。
繼續尋找TQRichTextView中重載系統的方法。返現touchesBegan和touchesEnd方法。閱讀這兩個方法。
- 拿到觸摸的點,轉換點的座標為以左下角為原點是的座標。
- 判斷是否能只想delegate
- 遍曆richTextRunRectDic,判斷點是否在rect中。如果在則調用delegate方法。
主要功能分析完畢。
通讀TQRichTextBaseRun,瞭解其它屬性和一些屬性的預設值。
至此,整個TQRichTextViewDemo基本分析完畢。可得出如下結論。
- 類的結構關係
- TQRichTextEmojiRun—> TQRichTextImageRun—> TQRichTextBaseRun。
- TQRichTextURLRun—> TQRichTextBaseRun。
- TQRichTextEmojiRun和TQRichTextURLRun分別實現了analyzeText:runsArray方法用來從字串中取出所需要的文字,並建立TQRichTextBaseRun對象添加進數組儲存。
- TQRichTextEmojiRun和TQRichTextURLRun分別重載了replaceTextWithAttributedString方法來在字串的特定range處添加Attributed屬性。
- TQRichTextEmojiRun和TQRichTextURLRun分別重載了drawRunWithRect方法實現了自訂位置,並返回是否繪製了內容。
- 流程
- 給TQRichTextView更改屬性。
- 調用drawRect。
- 調用TQRichTextEmojiRun和TQRichTextURLRun的analyzeText:runsArray方法解析字串。
- 建立NSAttributedString。
- 為NSAttributedString添加屬性。
- 調用TQRichTextEmojiRun和TQRichTextURLRun的replaceTextWithAttributedString方法為字串添加屬性。
- CoreText繪製NSAttributedString。
- 調用TQRichTextEmojiRun和TQRichTextURLRun的drawRunWithRect方法實現自訂繪製。
- 儲存run和rect進字典,從字典取值判斷是否能點擊。
- 有以上可以得出結論,若要更換表情和文字的解析規則,則只需去TQRichTextEmojiRun或TQRichTextURLRun修改analyzeText:runsArray,replaceTextWithAttributedString,drawRunWithRect三個方法。
- analyzeText:runsArray修改解析規則。
- replaceTextWithAttributedString修改添加屬性。
- drawRunWithRect修改自訂繪製。
- 若要實現點擊,只需設定isResponseTouch為YES並實現TQRichTextViewDelegate。
由以上閱讀代碼發現如下缺陷
- TQRichTextView的awakeFromNib方法沒實現,如過使用xib拖拽,則無法為TQRichTextView添加預設屬性。
- 解決方案,添加awakeFromNib方法,並在其中為預設屬性賦值。
- sizeWithFont和boundingRectWithSize:options:attributes:context:方法計算時不會計算行間距,TQRichTextView的lineSpacing若不設定為0會導致兩方法計算的高度比TQRichTextView實際顯示需要的高度小。
- 解決方案,TQRichTextView的lineSpacing設定為0。
IOS開發多久可以學會
每個人的情況都不一樣,有C和C++基礎的肯定學得快一點,有一個好老師帶著入門,自己悟性好肯定也學得快一點的。做應用的話,有基礎的人,兩三個月時間,就可以自己單獨做一些簡單的應用了。如果是做遊戲開發的話,難度有點大,時間會更長一些。
怎學習ios開發可以學會?
沒基礎的話自學很困難,遇到不會的問題解決太耗時間,所以不建議你自學,可以找家好的培訓機構,雖然會花點錢,但是能學到很多技術,現在千鋒ios開發培訓很不錯,你可以去那裡看看。