iOS開發--從TQRichTextViewDemo中學會分析工程,tqrichtextview

來源:互聯網
上載者:User

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的指標。
    1. 同上,直接去看這個方法的實現。從和TQRichTextEmojiRun的命名格式類似,調用的方法名類似,我們可以猜測這個方法是解析URL的,那麼就直接看重點。發現,如果找到匹配的字串,就建立一個TQRichTextURLRun的對象,設定range=URL的range,originText = URL,然後把對象添加到傳進來的數組中,最後返回string。
    2. 通過看TQRichTextURLRun的init方法,發現同上初始化時設定了兩個變數,來自父類TQRichTextBaseRun,分別設定了TQRichTextRunType和是否響應觸摸。發現TQRichTextEmojiRun繼承自TQRichTextImageRun,TQRichTextImageRun繼承自TQRichTextBaseRun。
    3. 跳出這個方法,回到analyzeText中,繼續往下看。
  • 遍曆richTextRunsArray中的對象,每個對象調用setOriginalFont方法,傳入參數self.font。通過閱讀上面的兩個方法的內部實現明白richTextRunsArray中儲存的是TQRichTextEmojiRun和TQRichTextURLRun對象,所以去看這兩個對象的setOriginalFont方法。
    1. 這個設定的是繼承自父類TQRichTextBaseRun的屬性。
    2. 回到analyzeText繼續往下看。
  • 返回result,跳出這個方法,繼續看drawRect。
  • 接下來是建立NSAttrbutedString,並賦值一些屬性。
  • 文本處理,遍曆richTextRunsArray中的對象,每個對象調用replaceTextWithAttributedString方法。
    1. 在TQRichTextEmojiRun沒有找到replaceTextWithAttributedString方法,那就去TQRichTextImageRun中找,閱讀該方法。
      1. 傳入的attrString刪除佔位的空格字元。
      2. 建立CTRunDelegateCallbacks,返現設定的寬高為OriginalFont的高度的1.1倍。
      3. 建立空格NSAttrbutedString對象,添加CTRunDelegateRef屬性。
      4. 把空格NSAttrbutedString對象插入至傳入的attrString。
      5. 查看super方法,發現在這段range上還設定了一個鍵值對,key為TQRichTextAttribute,value為自己。
    2. 同上閱讀TQRichTextURLRun的replaceTextWithAttributedString方法。
      1. 為該段range的文字添加藍色字型。
      2. 調用super方法,為該段range添加同上的key-value鍵值對。
    3. 返回繼續閱讀drawRect。
  • 下面是繪製的準備工作,不想研究咋繪製的粗讀就行。
  • 清空richTextRunRectDic
  • 繪製,不想研究的也可粗讀略過。
  • 找重點,繪製替換過的特殊文本單元。
    1. 遍曆取出每一個run,取出run的attributes中key為TQRichTextAttribute的值。
    2. 如果值存在,則說明,這個run是特殊的run。
    3. 求run的frame,粗讀略過。
    4. 調用drawRunWithRect方法,並將返回值賦給idDraw變數。
      1. TQRichTextEmojiRun的drawRunWithRect方法中繪製了表情圖片,返回YES。
      2. TQRichTextURLRun的drawRunWithRect方法返回NO。
      3. TQRichTextBaseRun的drawRunWithRect方法返回NO。
    5. 判斷run的isResponseTouch屬性,尋找後發現是TQRichTextBaseRun的屬性,注釋說是是否響應觸摸
    6. 如果響應觸摸
      1. 在richTextRunRectDic中添加鍵值對,key為rect,value為run。
  • 設定迴圈的條件,釋放CF類型的變數。CF類型的變數不支援ARC。
  • 繼續尋找TQRichTextView中重載系統的方法。返現touchesBegan和touchesEnd方法。閱讀這兩個方法。
    1. 拿到觸摸的點,轉換點的座標為以左下角為原點是的座標。
    2. 判斷是否能只想delegate
    3. 遍曆richTextRunRectDic,判斷點是否在rect中。如果在則調用delegate方法。
  • 主要功能分析完畢。
  • 通讀TQRichTextBaseRun,瞭解其它屬性和一些屬性的預設值。
  • 至此,整個TQRichTextViewDemo基本分析完畢。可得出如下結論。
    1. 類的結構關係
      1. TQRichTextEmojiRun—> TQRichTextImageRun—> TQRichTextBaseRun。
      2. TQRichTextURLRun—> TQRichTextBaseRun。
      3. TQRichTextEmojiRun和TQRichTextURLRun分別實現了analyzeText:runsArray方法用來從字串中取出所需要的文字,並建立TQRichTextBaseRun對象添加進數組儲存。
      4. TQRichTextEmojiRun和TQRichTextURLRun分別重載了replaceTextWithAttributedString方法來在字串的特定range處添加Attributed屬性。
      5. TQRichTextEmojiRun和TQRichTextURLRun分別重載了drawRunWithRect方法實現了自訂位置,並返回是否繪製了內容。
    2. 流程
      1. 給TQRichTextView更改屬性。
      2. 調用drawRect。
      3. 調用TQRichTextEmojiRun和TQRichTextURLRun的analyzeText:runsArray方法解析字串。
      4. 建立NSAttributedString。
      5. 為NSAttributedString添加屬性。
      6. 調用TQRichTextEmojiRun和TQRichTextURLRun的replaceTextWithAttributedString方法為字串添加屬性。
      7. CoreText繪製NSAttributedString。
      8. 調用TQRichTextEmojiRun和TQRichTextURLRun的drawRunWithRect方法實現自訂繪製。
      9. 儲存run和rect進字典,從字典取值判斷是否能點擊。
    3. 有以上可以得出結論,若要更換表情和文字的解析規則,則只需去TQRichTextEmojiRun或TQRichTextURLRun修改analyzeText:runsArray,replaceTextWithAttributedString,drawRunWithRect三個方法。
      1. analyzeText:runsArray修改解析規則。
      2. replaceTextWithAttributedString修改添加屬性。
      3. drawRunWithRect修改自訂繪製。
    4. 若要實現點擊,只需設定isResponseTouch為YES並實現TQRichTextViewDelegate。
  • 由以上閱讀代碼發現如下缺陷
    1. TQRichTextView的awakeFromNib方法沒實現,如過使用xib拖拽,則無法為TQRichTextView添加預設屬性。
      1. 解決方案,添加awakeFromNib方法,並在其中為預設屬性賦值。
    2. sizeWithFont和boundingRectWithSize:options:attributes:context:方法計算時不會計算行間距,TQRichTextView的lineSpacing若不設定為0會導致兩方法計算的高度比TQRichTextView實際顯示需要的高度小。
      1. 解決方案,TQRichTextView的lineSpacing設定為0。

  • IOS開發多久可以學會

    每個人的情況都不一樣,有C和C++基礎的肯定學得快一點,有一個好老師帶著入門,自己悟性好肯定也學得快一點的。做應用的話,有基礎的人,兩三個月時間,就可以自己單獨做一些簡單的應用了。如果是做遊戲開發的話,難度有點大,時間會更長一些。
     
    怎學習ios開發可以學會?

    沒基礎的話自學很困難,遇到不會的問題解決太耗時間,所以不建議你自學,可以找家好的培訓機構,雖然會花點錢,但是能學到很多技術,現在千鋒ios開發培訓很不錯,你可以去那裡看看。
     

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.