拜讀YYKit微博篇

最近看了看YY微博的實現(xiàn)渗勘,用小本子記了記筆記。
先上一個簡略的流程圖:


圖1.png
  • 首先后臺線程異步的去請求數(shù)據(jù)(從JSON文件取)张惹,初始化WBStatusLayout類來接受數(shù)據(jù),然后根據(jù)數(shù)據(jù)計算好業(yè)務(wù)所需要的布局信息(這個類就是核心類)岭洲,這個工作結(jié)束后回到主線程刷新UITableView宛逗。
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    for (int i = 0; i <= 7; i++) {
    NSData *data = [NSData dataNamed:[NSString stringWithFormat:@"weibo_%d.json",i]];
    WBTimelineItem *item = [WBTimelineItem modelWithJSON:data];
    for (WBStatus *status in item.statuses) {
    WBStatusLayout *layout = [[WBStatusLayout alloc] initWithStatus:status style:WBLayoutStyleTimeline];
    [_layouts addObject:layout];
    }
    }

      // 復(fù)制一下,讓列表長一些盾剩,不至于滑兩下就到底了
      [_layouts addObjectsFromArray:_layouts];
      
      dispatch_async(dispatch_get_main_queue(), ^{
          self.title = [NSString stringWithFormat:@"Weibo (loaded:%d)", (int)_layouts.count];
          [indicator removeFromSuperview];
          self.navigationController.view.userInteractionEnabled = YES;
          [_tableView reloadData];
      });
    

    });

  • 下面這個方法就是WBStatusLayout類根據(jù)存儲圖片數(shù)據(jù)的個數(shù)來布局“9宮格圖片雷激。WBStatusLayout會計算出每個 cell的高度和相關(guān)布局信息緩存下來。這樣再次滑動UITableView直接從緩存里面提取就好了彪腔,并不會再次計算侥锦。

   - (void)_layoutPicsWithStatus:(WBStatus *)status isRetweet:(BOOL)isRetweet {
   if (isRetweet) {
    _retweetPicSize = CGSizeZero;
    _retweetPicHeight = 0;
   } else {
    _picSize = CGSizeZero;
    _picHeight = 0;
   }
    if (status.pics.count == 0) return;

     CGSize picSize = CGSizeZero;
     CGFloat picHeight = 0;

     CGFloat len1_3 = (kWBCellContentWidth + kWBCellPaddingPic) / 3 - kWBCellPaddingPic;
     len1_3 = CGFloatPixelRound(len1_3);
     switch (status.pics.count) {
    case 1: {
        WBPicture *pic = _status.pics.firstObject;
        WBPictureMetadata *bmiddle = pic.bmiddle;
        if (pic.keepSize || bmiddle.width < 1 || bmiddle.height < 1) {
            CGFloat maxLen = kWBCellContentWidth / 2.0;
            maxLen = CGFloatPixelRound(maxLen);
            picSize = CGSizeMake(maxLen, maxLen);
            picHeight = maxLen;
        } else {
            CGFloat maxLen = len1_3 * 2 + kWBCellPaddingPic;
            if (bmiddle.width < bmiddle.height) {
                picSize.width = (float)bmiddle.width / (float)bmiddle.height * maxLen;
                picSize.height = maxLen;
            } else {
                picSize.width = maxLen;
                picSize.height = (float)bmiddle.height / (float)bmiddle.width * maxLen;
            }
            picSize = CGSizePixelRound(picSize);
            picHeight = picSize.height;
        }
    } break;
    case 2: case 3: {
        picSize = CGSizeMake(len1_3, len1_3);
        picHeight = len1_3;
    } break;
    case 4: case 5: case 6: {
        picSize = CGSizeMake(len1_3, len1_3);
        picHeight = len1_3 * 2 + kWBCellPaddingPic;
    } break;
    default: { // 7, 8, 9
        picSize = CGSizeMake(len1_3, len1_3);
        picHeight = len1_3 * 3 + kWBCellPaddingPic * 2;
    } break;
   }

    if (isRetweet) {
    _retweetPicSize = picSize;
    _retweetPicHeight = picHeight;
    } else {
    _picSize = picSize;
    _picHeight = picHeight;
   }
   }
  • 通過下面協(xié)議方法去給Cell相關(guān)信息。非常簡潔德挣。
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellID = @"cell";
    WBStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (!cell) {
    cell = [[WBStatusCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    cell.delegate = self;
    }
    [cell setLayout:_layouts[indexPath.row]];
    return cell;
    }

YY的代碼真心寫的非常的漂亮恭垦。特別是把Cell所有的事件通過WBStatusCellDelegate代理進行統(tǒng)一的管理,提高了代碼的可讀性格嗅。

  /// 點擊了 Cell
  - (void)cellDidClick:(WBStatusCell *)cell;
  /// 點擊了 Card
  - (void)cellDidClickCard:(WBStatusCell *)cell;
  /// 點擊了轉(zhuǎn)發(fā)內(nèi)容
  - (void)cellDidClickRetweet:(WBStatusCell *)cell;
  /// 點擊了Cell菜單
  - (void)cellDidClickMenu:(WBStatusCell *)cell;
  /// 點擊了關(guān)注
  - (void)cellDidClickFollow:(WBStatusCell *)cell;
  /// 點擊了轉(zhuǎn)發(fā)
  - (void)cellDidClickRepost:(WBStatusCell *)cell;
  /// 點擊了下方 Tag
  - (void)cellDidClickTag:(WBStatusCell *)cell;
  /// 點擊了評論
  - (void)cellDidClickComment:(WBStatusCell *)cell;
 /// 點擊了贊
  - (void)cellDidClickLike:(WBStatusCell *)cell;
  /// 點擊了用戶
 - (void)cell:(WBStatusCell *)cell didClickUser:(WBUser *)user;
  /// 點擊了圖片
- (void)cell:(WBStatusCell *)cell didClickImageAtIndex:(NSUInteger)index;
/// 點擊了 Label 的鏈接
- (void)cell:(WBStatusCell *)cell didClickInLabel:(YYLabel *)label textRange:(NSRange)textRange;

在這里我只是簡略的去做了一個梳理番挺。如果您有興趣可以去github上下載下來讀讀源碼。
YYkit github : https://github.com/ibireme/YYKit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屯掖,一起剝皮案震驚了整個濱河市玄柏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贴铜,老刑警劉巖粪摘,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绍坝,居然都是意外死亡徘意,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門轩褐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椎咧,“玉大人,你說我怎么就攤上這事把介∏诜恚” “怎么了蟋座?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脚牍。 經(jīng)常有香客問我向臀,道長,這世上最難降的妖魔是什么莫矗? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任飒硅,我火速辦了婚禮,結(jié)果婚禮上作谚,老公的妹妹穿的比我還像新娘三娩。我一直安慰自己,他們只是感情好妹懒,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布雀监。 她就那樣靜靜地躺著,像睡著了一般眨唬。 火紅的嫁衣襯著肌膚如雪会前。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天匾竿,我揣著相機與錄音瓦宜,去河邊找鬼。 笑死岭妖,一個胖子當(dāng)著我的面吹牛临庇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昵慌,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼假夺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斋攀?” 一聲冷哼從身側(cè)響起已卷,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淳蔼,沒想到半個月后侧蘸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鹉梨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年闺魏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俯画。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖司草,靈堂內(nèi)的尸體忽然破棺而出艰垂,到底是詐尸還是另有隱情泡仗,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布猜憎,位于F島的核電站娩怎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胰柑。R本人自食惡果不足惜截亦,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柬讨。 院中可真熱鬧崩瓤,春花似錦、人聲如沸踩官。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔗牡。三九已至颖系,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辩越,已是汗流浹背嘁扼。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留黔攒,地道東北人趁啸。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像亏钩,于是被迫代替她去往敵國和親莲绰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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