iOS 實現(xiàn)微信朋友圈評論回復功能(一)

一、概述
  • iOS開發(fā)中高诺,相信許多開發(fā)者都遇到過碌识,類似于像微信朋友圈的評論回復功能的開發(fā),難點莫過于 Cell里面的子控件布局 虱而、 點擊事件的回調評論回復的邏輯處理筏餐。
  • 筆者將通過 兩種方法來實現(xiàn)微信朋友圈評論回復功能,也將通過一個仿優(yōu)酷視頻評論和回復的Demo 來實戰(zhàn)一番牡拇,本文將通過利用UITableView段頭+cell+段尾來實現(xiàn)魁瞪,希望能為廣大開發(fā)者提供一點思路穆律,少走一些彎路,填補一些細坑佩番。
  • iOS實現(xiàn)微信朋友圈評論回復功能(二)
  • iOS 實現(xiàn)優(yōu)酷視頻的評論回復功能

二 众旗、 效果圖


效果圖.gif
三、利用UITableView段頭+cell+段尾實現(xiàn)
  1. 頁面分析
  1. 技術分析
  • 列表展示數(shù)據(jù)流
    • 列表通常利用tableView來實現(xiàn)趟畏。
    • tableview實現(xiàn)又分為自動布局絕對布局(即Frame布局
      自動布局:個人推薦利用Masonry+UITableView-FDTemplateLayoutCell的方案來實現(xiàn)自動布局贡歧。
      Frame布局: 事先計算出Cell子控件的Frame以及Cell的高度,存入ModelFrame里面赋秀,雖然計算稍微復雜利朵,但是性能好,可控性強猎莲,易動畫绍弟,擴展維護成本低
      兩種布局方式不是本文的重點著洼,依舊個人喜好樟遣,筆者偏好是Frame布局,本文案例也將采用這種方式身笤。
  • Cell里面的昵稱支持點擊跳轉用戶信息
    • 首先明確內容支持 attributedString(富文本)而不是text(普通文本)豹悬。
    • 可以使用 UILabelattributedText,或者采用第三方框架TYAttributedLabelYYText液荸,筆者在此采用的是YYText瞻佛。
3. 技術難點
  • Frame布局計算復雜

    1. 實際項目中,我們從服務器獲取的數(shù)據(jù)娇钱,轉換為數(shù)據(jù)模型(Model),對應的數(shù)據(jù)有些不能直接顯示在視圖(View)上伤柄,需要二次處理。tableviewCell高度計算文搂,是tableView使用以及優(yōu)化的重點對象适刀,最好的方式莫過于高度緩存,筆者這里為每個模型(Model)配備一個模型尺寸(ModelFrame),主要用來計算tableViewCell的高度(cellHeight)煤蹭,以及子控件的尺寸(frame)笔喉,而且保證模型(Model)的純凈性以及減少胖模型的生成。
    2. ModelFrame模型持有Model疯兼,并開放cell中各個子控件的Frame屬性然遏,,以及cellHeight緩存cell高度贫途。注意:這里屬性應該設置為readonly來修飾更為合理吧彪,防止外界修改對應的尺寸(Frame),切記:細節(jié)顯能力丢早。
    3. 重寫ModelFrameModelsetter方法姨裸,計算tabelViewCellheaderView子控件的Frame以及緩存cell的高度cellHeightheaderView的高度height秧倾。
    4. tableViewCellheaderView自身持有各自ModelFrame模型,在tableView的數(shù)據(jù)源給tableViewCellCellheaderView注入ModelFrame時傀缩,確定tabelViewCellheaderView的子控件的布局(Frame)以及數(shù)據(jù)那先。
  • Cell寬度的修改
    只要重寫tableViewCellframesetter方法即可統(tǒng)一修改cell的尺寸。

     - (void)setFrame:(CGRect)frame
     {
           frame.origin.x = MHVideoTopicAvatarWH+2*MHVideoTopicHorizontalSpace;
           frame.size.width = MHMainScreenWidth - frame.origin.x - MHVideoTopicHorizontalSpace;
           [super setFrame:frame];
      }
    
  • 復雜的事件回調
    事件傳遞三種方式delegate赡艰,notification售淡,block。筆者項目采用的是代理delegate慷垮,將所有事件代理給viewController揖闸,事件的傳遞詳情,請查看文章下方給出的Demo地址料身。

四汤纸、細節(jié)處理
  1. 設置文本的額外區(qū)域,防止文字過少芹血,用戶無法點中文本的bug贮泞。
    Label的額外區(qū)域@2x.png
  // 文本
  YYLabel *contentLabel = [[YYLabel alloc] init];

  // 設置文本的額外區(qū)域,修復用戶點擊文本沒有效果
  UIEdgeInsets textContainerInset = contentLabel.textContainerInset;
  textContainerInset.top = MHVideoTopicVerticalSpace;
  textContainerInset.bottom = MHVideoTopicVerticalSpace;
  contentLabel.textContainerInset = textContainerInset;
  
  contentLabel.numberOfLines = 0 ;
  contentLabel.textAlignment = NSTextAlignmentLeft;
  [self.contentView addSubview:contentLabel];
  1. 點擊評論昵稱獲取用戶模型(MHUser
  • 點擊評論昵稱幔烛,在評論模型(MHComment)中通過通知傳遞用戶模型(MHUser)啃擦。雖獲取用戶模型(MHUser)簡單,但使用通知會增加項目的耦合性说贝。
// 文本高亮模型
      YYTextHighlight *toUserHighlight = [YYTextHighlight highlightWithBackgroundColor:[UIColor colorWithWhite:0.000 alpha:0.220]];
      // 這里痛過屬性的userInfo保存User模型议惰,后期通過獲取模型然后獲取User模型
      toUserHighlight.userInfo = @{MHCommentUserKey:self.toUser};
      
      // 點擊用戶的昵稱的事件傳遞
//        toUserHighlight.tapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect)
//        {
//            // 這里通過通知把用戶的模型傳遞出去
//        };
  • 點擊評論昵稱,通過label的點擊事件來獲取乡恕,由于YYLablehighlightTapAction的事件言询,無法獲取YYTextHighlight模型,但是通過KVC可以獲取到YYTextHighlight模型傲宜,從而得到textHighlight.userInfo运杭。這樣一來通過delegate就可將用戶模型(MHUser)傳遞出去。
__weak typeof(self) weakSelf = self;
    contentLabel.highlightTapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
        
        // 利用KVC獲取UserInfo 其實可以在MHComment模型里面利用 通知告知控制器哪個用戶被點擊了
        YYTextHighlight *highlight = [containerView valueForKeyPath:@"_highlight"];
        
        if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(commentCell:didClickedUser:)]) {
            [weakSelf.delegate commentCell:weakSelf didClickedUser:highlight.userInfo[MHCommentUserKey]];
        }       
    };
五函卒、期待
  1. 文章若對您有點幫助辆憔,請給個喜歡??,畢竟碼字不易报嵌;若對您沒啥幫助虱咧,請給點建議??,切記學無止境锚国。
  2. 針對文章所述內容腕巡,閱讀期間任何疑問;請在文章底部評論指出血筑,我會火速解決和修正問題绘沉。
  3. GitHub地址:https://github.com/CoderMikeHe
六煎楣、代碼

MHDevelopExample_Objective_C - MHTopicOneController.h/m

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市车伞,隨后出現(xiàn)的幾起案子择懂,更是在濱河造成了極大的恐慌,老刑警劉巖另玖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件困曙,死亡現(xiàn)場離奇詭異,居然都是意外死亡谦去,警方通過查閱死者的電腦和手機赂弓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哪轿,“玉大人盈魁,你說我怎么就攤上這事∏运撸” “怎么了杨耙?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飘痛。 經常有香客問我珊膜,道長,這世上最難降的妖魔是什么宣脉? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任车柠,我火速辦了婚禮,結果婚禮上塑猖,老公的妹妹穿的比我還像新娘竹祷。我一直安慰自己,他們只是感情好羊苟,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布塑陵。 她就那樣靜靜地躺著,像睡著了一般蜡励。 火紅的嫁衣襯著肌膚如雪令花。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天凉倚,我揣著相機與錄音兼都,去河邊找鬼。 笑死稽寒,一個胖子當著我的面吹牛扮碧,可吹牛的內容都是我干的。 我是一名探鬼主播瓦胎,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼芬萍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搔啊?” 一聲冷哼從身側響起柬祠,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤揖庄,失蹤者是張志新(化名)和其女友劉穎暴心,沒想到半個月后劲赠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痪宰,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡泥畅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年悲龟,在試婚紗的時候發(fā)現(xiàn)自己被綠了岁经。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地梨。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锨天,死狀恐怖毯盈,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情病袄,我是刑警寧澤搂赋,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站益缠,受9級特大地震影響脑奠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜幅慌,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一宋欺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胰伍,春花似錦齿诞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菩咨,卻和暖如春吠式,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抽米。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工特占, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人云茸。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓是目,卻偏偏與公主長得像,于是被迫代替她去往敵國和親标捺。 傳聞我的和親對象是個殘疾皇子懊纳,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容