折疊單元格使用第三方RATreeView展示實(shí)現(xiàn)步驟詳解

折疊單元格的樣式如圖:


展開(kāi)后的折疊單元格樣式

昨天完成使用第三方RATreeView實(shí)現(xiàn)折疊效果,組長(zhǎng)說(shuō)要把怎么使用的過(guò)程詳細(xì)的記錄下來(lái)以便以后用到很快上手,我覺(jué)得很有道理.所以你們看到了現(xiàn)在的它

RATreeView是對(duì)TableView的一成封裝,和TableView的使用樣式幾乎一模一樣

首先要pod RATreeView

下載下來(lái)之后不著急,先做個(gè)數(shù)據(jù)模型出來(lái),這個(gè)數(shù)據(jù)模型有一點(diǎn)需要大家注意,必須有一個(gè)子節(jié)點(diǎn)數(shù)組屬性,不然就沒(méi)有使用這個(gè)第三方的理由了,為什么呢?因?yàn)槲覀冋故镜臉?shù)狀結(jié)構(gòu)就是一個(gè)節(jié)點(diǎn)套另一個(gè)節(jié)點(diǎn),如果不需要嵌套直接使用UItableView就可以展示了.回歸到代碼

#import@interface RaTreeModel : NSObject

@property (nonatomic,copy) NSString *name;//標(biāo)題

@property (nonatomic,strong) NSArray *children;//子節(jié)點(diǎn)數(shù)組

//初始化一個(gè)model
- (id)initWithName:(NSString *)name children:(NSArray *)array;

//遍歷構(gòu)造器
+ (id)dataObjectWithName:(NSString *)name children:(NSArray *)children;

@end
#import "RaTreeModel.h"

@implementation RaTreeModel

- (id)initWithName:(NSString *)name children:(NSArray *)children
{
    self = [super init];
    if (self) {
        self.children = children;
        self.name = name;
    }
    return self;
}
+ (id)dataObjectWithName:(NSString *)name children:(NSArray *)children
{
    return [[self alloc] initWithName:name children:children];
}
@end

完成了模型

那么接下來(lái)我們來(lái)做用來(lái)展示的cell,在這里我直接使用xib了,使用xib的一個(gè)注意點(diǎn):就是不要勾選 Use Auto Layout,不然cell的布局會(huì)不起作用


去掉自動(dòng)布局的截圖

使用xib創(chuàng)建的cell樣式,可以根據(jù)自己的需求來(lái)改變cell的樣式


#import <UIKit/UIKit.h>
#import <RATreeView.h>
@interface RaTreeViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIImageView *iconView;//圖標(biāo)
@property (weak, nonatomic) IBOutlet UILabel *titleLable;//標(biāo)題
//賦值
- (void)setCellBasicInfoWith:(NSString *)title level:(NSInteger)level children:(NSInteger )children;
+ (instancetype)treeViewCellWith:(RATreeView *)treeView;
@end
#import "RaTreeViewCell.h"
@interface RaTreeViewCell()


@end
@implementation RaTreeViewCell
+ (instancetype)treeViewCellWith:(RATreeView *)treeView
{
    RaTreeViewCell *cell = [treeView dequeueReusableCellWithIdentifier:@"RaTreeViewCell"];
   
    if (cell == nil) {
        
        cell = [[[NSBundle mainBundle] loadNibNamed:@"ModelCell" owner:nil options:nil] firstObject];
    }

    
    
    return cell;
}

- (void)awakeFromNib {
    // Initialization code
    self.selectionStyle = UITableViewCellSelectionStyleNone;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    // Configure the view for the selected state
}
- (void)setCellBasicInfoWith:(NSString *)title level:(NSInteger)level children:(NSInteger )children{
    //有自孩子時(shí)顯示圖標(biāo)
    if (children==0) {
        self.iconView.hidden = YES;
    }
    else { //否則不顯示
        self.iconView.hidden = NO;
    }
    self.titleLable.text = title;
    self.iconView.image = [UIImage imageNamed:@"close"];
    //每一層的布局
    CGFloat left = 10+level*30;
    //頭像的位置
    CGRect  iconViewFrame = self.iconView.frame;
    iconViewFrame.origin.x = left;
    self.iconView.frame = iconViewFrame;
    //title的位置
    CGRect titleFrame = self.titleLable.frame;
    titleFrame.origin.x = 40+left;
    self.titleLable.frame = titleFrame;
}

@end

cell創(chuàng)建完畢 最后一步完成RATreeView 在一開(kāi)始就和大家介紹了說(shuō),RATreeView的用法和UITableView的用法特別的類(lèi)似

#import "ViewController.h"
#import "RaTreeModel.h"
#import "RaTreeViewCell.h"
#import <RATreeView.h>

@interface ViewController ()<RATreeViewDataSource, RATreeViewDelegate>
@property (nonatomic, strong) NSMutableArray *modelArray;
@end

@implementation ViewController
//創(chuàng)建RATreeView 并賦值給控制器的view
- (void)loadView
{
    
    RATreeView *ratreeView = [[RATreeView alloc] initWithFrame:[UIScreen mainScreen].bounds style:RATreeViewStylePlain];
    ratreeView.delegate = self;
    ratreeView.dataSource = self;
    
    self.view = ratreeView;
    self.view.backgroundColor = [UIColor whiteColor];
    [self setData];
}
- (void)setData {
    //寶雞市 (四層)
    RaTreeModel *zijingcun = [RaTreeModel dataObjectWithName:@"紫荊村" children:nil];
    RaTreeModel *chengcunzheng = [RaTreeModel dataObjectWithName:@"陳村鎮(zhèn)" children:@[zijingcun]];
    RaTreeModel *fengxiang = [RaTreeModel dataObjectWithName:@"鳳翔縣" children:@[chengcunzheng]];
    RaTreeModel *qishan = [RaTreeModel dataObjectWithName:@"岐山縣" children:nil];
    RaTreeModel *baoji = [RaTreeModel dataObjectWithName:@"寶雞市" children:@[fengxiang,qishan]];
    //西安市
    RaTreeModel *yantaqu = [RaTreeModel dataObjectWithName:@"雁塔區(qū)" children:nil];
    RaTreeModel *xinchengqu = [RaTreeModel dataObjectWithName:@"新城區(qū)" children:nil];
    RaTreeModel *xian = [RaTreeModel dataObjectWithName:@"西安" children:@[yantaqu,xinchengqu]];
    RaTreeModel *shanxi = [RaTreeModel dataObjectWithName:@"陜西" children:@[baoji,xian]];
    
    self.modelArray = [NSMutableArray array];
    [self.modelArray addObject:shanxi];
}



#pragma mark -----------delegate
//返回行高
- (CGFloat)treeView:(RATreeView *)treeView heightForRowForItem:(id)item {
    return 50;
}
//將要展開(kāi)
- (void)treeView:(RATreeView *)treeView willExpandRowForItem:(id)item {
    RaTreeViewCell *cell = (RaTreeViewCell *)[treeView cellForItem:item];
    cell.iconView.image = [UIImage imageNamed:@"open"];
}
//將要收縮
- (void)treeView:(RATreeView *)treeView willCollapseRowForItem:(id)item {
    RaTreeViewCell *cell = (RaTreeViewCell *)[treeView cellForItem:item];
    cell.iconView.image = [UIImage imageNamed:@"close"];
}
//已經(jīng)展開(kāi)
- (void)treeView:(RATreeView *)treeView didExpandRowForItem:(id)item {
    NSLog(@"已經(jīng)展開(kāi)了");
}
//已經(jīng)收縮
- (void)treeView:(RATreeView *)treeView didCollapseRowForItem:(id)item {
    NSLog(@"已經(jīng)收縮了");
}

//# dataSource方法

//返回cell
- (UITableViewCell *)treeView:(RATreeView *)treeView cellForItem:(id)item {
    //獲取cell
    RaTreeViewCell *cell = [RaTreeViewCell treeViewCellWith:treeView];

    //當(dāng)前item
    RaTreeModel *model = item;
    //當(dāng)前層級(jí)
    NSInteger level = [treeView levelForCellForItem:item];
    //賦值
    [cell setCellBasicInfoWith:model.name level:level children:model.children.count];
    return cell;
}
/**
 *  必須實(shí)現(xiàn)
 *
 *  @param treeView treeView
 *  @param item    節(jié)點(diǎn)對(duì)應(yīng)的item
 *
 *  @return  每一節(jié)點(diǎn)對(duì)應(yīng)的個(gè)數(shù)
 */
- (NSInteger)treeView:(RATreeView *)treeView numberOfChildrenOfItem:(id)item
{
    RaTreeModel *model = item;
    if (item == nil) {
        return self.modelArray.count;
    }
    return model.children.count;
}
/**
 *必須實(shí)現(xiàn)的dataSource方法
 *
 *  @param treeView treeView
 *  @param index    子節(jié)點(diǎn)的索引
 *  @param item     子節(jié)點(diǎn)索引對(duì)應(yīng)的item
 *
 *  @return 返回 節(jié)點(diǎn)對(duì)應(yīng)的item
 */
- (id)treeView:(RATreeView *)treeView child:(NSInteger)index ofItem:(id)item {
    RaTreeModel *model = item;
    if (item==nil) {
        return self.modelArray[index];
    }
    return model.children[index];
}
//cell的點(diǎn)擊方法
- (void)treeView:(RATreeView *)treeView didSelectRowForItem:(id)item {
    //獲取當(dāng)前的層
    NSInteger level = [treeView levelForCellForItem:item];
    //當(dāng)前點(diǎn)擊的model
    RaTreeModel *model = item;
    NSLog(@"點(diǎn)擊的是第%ld層,name=%@",level,model.name);
}
//單元格是否可以編輯 默認(rèn)是YES
- (BOOL)treeView:(RATreeView *)treeView canEditRowForItem:(id)item {
    return YES;
}
//編輯要實(shí)現(xiàn)的方法
- (void)treeView:(RATreeView *)treeView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowForItem:(id)item {
    NSLog(@"編輯了實(shí)現(xiàn)的方法");
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

記住不要忘了設(shè)置數(shù)據(jù)源和代理 就這么搞定了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炼邀,隨后出現(xiàn)的幾起案子掺逼,更是在濱河造成了極大的恐慌愿险,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異为牍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岩馍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)碉咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蛀恩,你說(shuō)我怎么就攤上這事疫铜。” “怎么了双谆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵壳咕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我顽馋,道長(zhǎng)谓厘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任寸谜,我火速辦了婚禮竟稳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己他爸,他們只是感情好聂宾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著诊笤,像睡著了一般系谐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盏混,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天蔚鸥,我揣著相機(jī)與錄音,去河邊找鬼许赃。 笑死止喷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的混聊。 我是一名探鬼主播弹谁,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼句喜!你這毒婦竟也來(lái)了预愤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咳胃,失蹤者是張志新(化名)和其女友劉穎植康,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體展懈,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡销睁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了存崖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冻记。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖来惧,靈堂內(nèi)的尸體忽然破棺而出冗栗,到底是詐尸還是另有隱情,我是刑警寧澤供搀,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布隅居,位于F島的核電站,受9級(jí)特大地震影響葛虐,放射性物質(zhì)發(fā)生泄漏军浆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一挡闰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦摄悯、人聲如沸赞季。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)申钩。三九已至,卻和暖如春瘪阁,著一層夾襖步出監(jiān)牢的瞬間撒遣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工管跺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留义黎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓豁跑,卻偏偏與公主長(zhǎng)得像廉涕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艇拍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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