澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

多层展开与收起demo,tableview的cell打开收起原理

来源:http://www.bhtsgq.com 作者:计算机知识 人气:98 发布时间:2020-05-06
摘要:法规供给: tableview有多层,相仿于xcode文件目录的层级关系,每贰个最早始显得的层姑且称之为根目录吧,况兼,种种根目录下的层数不定。 与文件目录相符,种种目录下得以有例外层

法规供给:

  • tableview 有多层,相仿于xcode文件目录的层级关系,每贰个最早始显得的层姑且称之为根目录吧,况兼,种种根目录下的层数不定。
  • 与文件目录相符,种种目录下得以有例外层级的目录同有的时候候实行,不过相像等级次序中唯有一层是张开的,即要张开B等级次序的某一层,则要求收起B档期的顺序全体其他的层级。
  • 最尾巴部分是三个个文书,不能够再举办(这里在专业逻辑上用场是:跳转到分裂的页面卡塔尔(قطر‎。
前言:

近日做超级市场项目时候,做到tableViewCell 的张开和减弱的时候境遇贰个难题,正是当一行在 tableview 尾部时候, tableview 暗许是或不是会上移的,那样实行的剧情就能被屏蔽,看不到效果,现身的难点如下图:

图片 1

Untitled02.gif

想达成的效果与利益是:借使进展的是一列在 tableView 的底层的时候,tableView 会自动演变,那样就可以以知道见进展的内容,效果如:

图片 2

Untitled01.gif

基本原理:
用一个数组记录全数的section是或不是张开cell,具体效果达成是决定其cell的数目来得以达成,跟是不是隐身和校订frame那种思路不相似。当中手势发挥很入眼的效果。

思路是:

想法:

  • 整套界面是一个tableview,层级关系用cell中的label之处表现,而tableview的数据源是四个一维数组_resultArray,个中,张开是在一定岗位插入数据,收起是在特确定工作岗位位删除数据。
  • 每一层目录存款和储蓄着下一层的引用,就是包涵了下一层的整个多少。张开该层的时候就算将下一层的多寡参预_多层展开与收起demo,tableview的cell打开收起原理。resultArray,收起该层时,是将该层的有所下层的数码从_resultArray中删除。
分析:

自己项目中贯彻的笔触是 购买套餐 是个 label 然后加了点击手势来监听点击事件的,然后能够获得点击之处,决断在是否在 tableView 的最后一行的范围内,如在的话就让 tableview 上移贰个列的莫斯中国科学技术大学学
现实的贯彻代码:

 CGPoint point = [recognizer locationInView:self.tableView];
    CGFloat point_y = point.y;
    // 96 是每组的高度
    if (point_y > self.tableView.frame.size.height - 96) { // 点击是最最后一行

        // 每组下的分行的高度是 60 加上间隔和"购买服务"几个字的高度 = 80
       [self.tableView  setContentOffset:CGPointMake(0, self.tableView.contentOffset.y   80)];
    }

容器 蕴含{ 彰显的选项内容, 遮盖的选项内容, 开关--越多选拔/收起}

数量存款和储蓄

//每个目录的数据结构如下:@interface OpenTest : NSObject@property (copy, nonatomic) NSString *title; //非首层展示的标题@property (assign, nonatomic) NSInteger level; //决定偏移量大小@property (copy, nonatomic) NSString *openUrl; //最后一层跳转的规则@property (copy, nonatomic) NSMutableArray *detailArray; //下一层的数据@property (assign, nonatomic) BOOL isOpen; //是否要展开@property (copy, nonatomic) NSString *imageName; //首层的图片@end

里头,因为detailArray中积累的靶子也理应是OpenTest, 所以须要在OpenTest.m中依靠MJExtension (在github上下载并步向到品种中State of Qatar进行显式转变。

#import "OpenTest.h"@implementation OpenTest- (instancetype)init { self = [super init]; if  { [OpenTest mj_setupObjectClassInArray:^NSDictionary *{ return @{ @"detailArray" : [OpenTest class] }; }]; } return self;}@end

轻便易行的显得和抽出

数据管理

发端修造源数据dataArray,该数组可明明层级关系,并且赢得呈现数组_resultArray。建造进程如下:

- initData {_dataArray = [NSMutableArray new];_resultArray = [NSMutableArray new];NSMutableArray *secondArray1 = [NSMutableArray new];NSMutableArray *threeArray1 = [NSMutableArray new];NSMutableArray *fourArray1 = [NSMutableArray new];NSArray *FirstTitleArray = @[@"FirstTitle1", @"FirstTitle2", @"FirstTitle3", @"FirstTitle4", @"FirstTitle5", @"FirstTitle6", @"FirstTitle7", @"FirstTitle8", @"FirstTitle9", @"FirstTitle10"];NSArray *SecondTitleArray = @[@"SecondTitle1", @"SecondTitle2", @"SecondTitle3"];NSArray *ThreeTitleArray = @[@"ThreeTitle1", @"ThreeTitle2", @"ThreeTitle3", @"ThreeTitle4"];NSArray *FourTitleArray = @[@"FourTitle1", @"FourTitle2", @"FourTitle3"];NSArray *imageArray = @[@"scroller1", @"scroller2", @"scroller3", @"scroller4", @"scroller5", @"scroller6", @"scroller7", @"scroller8", @"scroller9", @"scroller10"];//第四层数据for (int i = 0; i < FourTitleArray.count; i  ) { OpenTest *model = [[OpenTest alloc] init]; model.title = FourTitleArray[i]; model.level = 3; model.isOpen = NO; [fourArray1 addObject:model];}//第三层数据for (int i = 0; i < ThreeTitleArray.count; i  ) { OpenTest *model = [[OpenTest alloc] init]; model.title = ThreeTitleArray[i]; model.level = 2; model.isOpen = NO; model.detailArray = fourArray1; [threeArray1 addObject:model];}//第二层数据for (int i = 0; i < SecondTitleArray.count; i  ) { OpenTest *model = [[OpenTest alloc] init]; model.title = SecondTitleArray[i]; model.level = 1; model.isOpen = NO; model.detailArray = [threeArray1 mutableCopy]; [secondArray1 addObject:model];}//第一层数据for (int i = 0; i < FirstTitleArray.count; i  ) { OpenTest *model = [[OpenTest alloc] init]; model.title = FirstTitleArray[i]; model.level = 0; model.isOpen = NO; model.detailArray = [secondArray1 mutableCopy]; model.imageName = imageArray[i]; [_dataArray addObject:model];}//处理源数据,获得展示数组_resultArray[self dealWithDataArray:_dataArray];}/** 将源数据数组处理成要展示的一维数组,最开始是展示首层的所有的数据 @param dataArray 源数据数组 */- dealWithDataArray:(NSMutableArray *)dataArray {for (OpenTest *model in dataArray) { [_resultArray addObject:model]; if (model.isOpen && model.detailArray.count > 0) { [self dealWithDataArray:model.detailArray]; }}}

当首层没有进行数据时,点击首层展开第二层数据,比较容易完毕,即在_resultArray增添下一层数据。增加数量方式如下:

/** 在指定位置插入要展示的数据 @param dataArray 数据数组 @param row 需要插入的数组下标 */- addObjectWithDataArray:(NSMutableArray *)dataArray row:(NSInteger)row {for (int i = 0; i < dataArray.count; i  ) { OpenTest *model = dataArray[i]; model.isOpen = NO; [_resultArray insertObject:model atIndex:row]; row  = 1;}}

收下方法实现如下:

/** 删除要收起的数据 @param dataArray 数据 @param count 统计删除数据的个数 @return 删除数据的个数 */- deleteObjectWithDataArray:(NSMutableArray *)dataArray count:(NSInteger)count {for (OpenTest *model in dataArray) { count  = 1; if (model.isOpen && model.detailArray.count > 0) { count = [self deleteObjectWithDataArray:model.detailArray count:count]; } model.isOpen = NO; [_resultArray removeObject:model];}return count;}

在早已实行的时候点击其它一个目录,要先收起再开展。因为各类等级次序只有一个目录是开展的,所以收起的时候,只需求跟同档案的次序的目录数据比较,假如是一度开采的,则删除展开目录的富有子层。方法如下:

/** 与点击同一层的数据比较,然后删除要收起的数据和插入要展开的数据 @param model 点击的cell对应的model @param row 点击的在tableview的indexPath.row,也对应_resultArray的下标 */- compareSameLevelWithModel:(OpenTest *)model row:(NSInteger)row {NSInteger count = 0;NSInteger index = 0; //需要收起的起始位置//如果直接用_resultArray,在for循环为完成之前,_resultArray会发生改变,使程序崩溃。NSMutableArray *copyArray = [_resultArray mutableCopy];for (int i = 0; i < copyArray.count; i  ) { OpenTest *openModel = copyArray[i]; if (openModel.level == model.level) { //同一个层次的比较 if (openModel.isOpen) { //删除openModel所有的下一层 count = [self deleteObjectWithDataArray:openModel.detailArray count:count]; index = i; openModel.isOpen = NO; break; } }}//插入的位置在删除的位置的后面,则需要减去删除的数量。if (row > index && row > count) { row -= count;}[self addObjectWithDataArray:model.detailArray row:row   1];}

手提式有线电话机-商品刷选

界面

系统的tableviewcell 无法修正textLabel的地方,供给校正偏移量有二种办法:1、世襲UITableViewCell, 然后重写父类的点子 - layoutSubviews, 在该格局中期维修改textLabel的frame。2、在cell.contentView 中增添叁个label。

自个儿那边运用的是第三种方法:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; cell.selectionStyle = UITableViewCellSelectionStyleNone; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, UI_SCREEN_WIDTH / 2, 32)]; label.font = [UIFont systemFontOfSize:14]; label.tag = LabelTag; [cell.contentView addSubview:label]; } for (UIView *view in cell.contentView.subviews) { if (view.tag == LabelTag) { ((UILabel *)view).text = model.title; ((UILabel *)view).frame = CGRectMake(15   (model.level - 1) * SpaceWidth , 0, UI_SCREEN_WIDTH / 2, 32); } }

谈到底在didSelectRowAtIndexPath方法中贯彻点击张开与吸收接纳,方法如下:

- tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {NSInteger row = indexPath.row;OpenTest *model = _resultArray[row];if (model.isOpen) { //原来是展开的,现在要收起,则删除model.detailArray存储的数据 [self deleteObjectWithDataArray:model.detailArray count:0];}else { if (model.detailArray.count > 0) { //原来是收起的,现在要展开,则需要将同层次展开的收起,然后再展开 [self compareSameLevelWithModel:model row:row]; } else { //点击的是最后一层数据,跳转到别的界面 NSLog; }}model.isOpen = !model.isOpen;//滑动到屏幕顶部for (int i = 0; i < _resultArray.count; i  ) { OpenTest *openModel = _resultArray[i]; if (openModel.isOpen && openModel.level == 0) { //将点击的cell滑动到屏幕顶部 NSIndexPath *selectedPath = [NSIndexPath indexPathForRow:i inSection:0]; [tableView scrollToRowAtIndexPath:selectedPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; }}[tableView reloadData];}

网络:移动4G 联通3G 电信 3G

效果

图片 3demo.png

将demo放到了百度云,合意的能够下载。

价钱:5000以上 4000-4999 3000-3999

特点:JDPhone计划 '0' 元购机 防水 长待机

更加多选项

var phn=document.getElementById("hpn");

alert(phn);

var str=document.getElementById("strHref");

str.onclick=function(){

if( phn.style.display=='none'){

phn.style.display='block';

this.innerHMTL='收起';

}else{

phn.style.display='none';

this.innerHMTL='更多选拔 ';

}

}

本文由澳门新葡亰发布于计算机知识,转载请注明出处:多层展开与收起demo,tableview的cell打开收起原理

关键词: iOS17.06 澳门新 多层 tableview demo

最火资讯