首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
图层几何学,附tableViewTips及单选删除
发布时间:2020-04-07 02:52
浏览次数:

这一次分享并记录一下tableView的多选删除,并附加记录一下单选删除及tableView的安装小技术。

本书翻译自:iOS Core Animation: Advanced Techniques

本书翻译自:iOS Core Animation: Advanced Techniques

几近些日子无数app会有点击cell展现越多音讯这种地方,例如买东西,查看订单等等,作者这里写了三个轻便易行的demo给大家参谋一下先看看效果图吧,看看是否你们想要的样子.

1、先上原图

知识是人类前行的台阶,重在享用

文化是全人类提高的阶梯,重在享用

图片 1

图片 2

翻译,喵~

翻译,喵~

代码的笔触就是每条数据是贰个分区,每一种分区2个cell,通过判别是进展照旧撤除来展现种种分区是回来1个cell照旧2个cell.思路非常粗大略吗,看看代码吧.

2、然后编辑图如下

译者为:

译者为:

#import "ViewController.h"#import "InfoCell.h"#import "MoreInfoCell.h"@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>@property (strong, nonatomic) IBOutlet UITableView *tableView;@property (nonatomic,strong)NSMutableArray * dataSource;@end@implementation ViewController- viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _dataSource = @[@{@"isShow":@"0"}, @{ @"isShow":@"1"}, @{@"isShow":@"0"}, ].mutableCopy; UIView *view = [[UIView alloc]initWithFrame:CGRectZero]; _tableView.tableFooterView = view;}#pragma mark UITableViewDataSource----UITableViewDelegate-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return _dataSource.count;}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ if ([[_dataSource[section] objectForKey:@"isShow"] isEqualToString:@"0"]) { return 1; } return 2;}-tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 86;}-tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 15;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == 0) { static NSString *CellIdentifier = @"infocell"; //自定义cell类 InfoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; cell.zhankai.tag = 1000 + indexPath.section; [cell.zhankai addTarget:self action:@selector(showMoreInfo:) forControlEvents:UIControlEventTouchUpInside]; return cell; }else{ static NSString *CellIdentifier = @"moreinfo"; //自定义cell类 MoreInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; cell.shouqi.tag = 1000 + indexPath.section; [cell.shouqi addTarget:self action:@selector(showMoreInfo:) forControlEvents:UIControlEventTouchUpInside]; return cell; }}-showMoreInfo:(UIButton *)button{ NSInteger i = button.tag - 1000; NSLog; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:_dataSource[i]]; if ([[dic objectForKey:@"isShow"]isEqualToString:@"1"]) { [dic setObject:@"0" forKey:@"isShow"]; }else { [dic setObject:@"1" forKey:@"isShow"]; } _dataSource[i] = dic; [_tableView reloadSections:[NSIndexSet indexSetWithIndex:i] withRowAnimation:UITableViewRowAnimationFade]; [_tableView reloadData];}

图片 3

AttackOnDobby

AttackOnDobby

好了,代码就好像此多,希望我们天天都能开发进取一丢丢.

3、编辑步骤:

evenluo

evenluo

  • 点击右上角按键编辑,界面展现编辑状态尾部删除开关弹出
  • 选择删除cell项,点击右下角删除可去除
  • 点击右上角,退出编辑状态,底部删除开关退出分界面

(排行不分前后相继,感激她们的交由!卡塔尔

(排行不分前后相继,感激他们的交给!卡塔尔(قطر‎

1、设置允许tableView编辑状态下允大多选

小兵将ZsIsMe的gitbook搬运至简书上,方便大家查看。

小兵将ZsIsMe的gitbook搬运至简书上,方便我们查看。

_mainTableView.allowsMultipleSelectionDuringEditing = YES;

倘若在阅读进程中发觉有哪些难题,请到这里(本E-BOOK在github上之处)开issue,作者会尽快改良来。

举例在阅读进程中发觉有哪些难点,请到这里(本E-BOOK在github上之处)开issue,我会尽快改良来。

2、将cell设置为可挑选的风骨(下边代码是在自定义Cell内部)

嗯,圆和椭圆还不易,但如假诺带圆角的矩形呢?大家今后能成就那么了么?史蒂芬·Jobs

不熟知几何学的人就绝不来此地了 --Plato大学入口的签订协议

self.selectionStyle = UITableViewCellSelectionStyleDefault;

大家在第三章『图层几何学』中钻探了图层的frame,第二章『寄宿图』则探讨了图层的寄宿图。不过图层不仅能够是图形或是颜色的容器;还会有一种种内建的特色使得创立优越高贵的令人深远的分界面成分变为或者。在这里一章,大家将会追查一些力所能致透过选用CALayer属性达成的视觉效果。

在第二章里面,大家介绍了图层背后的图纸,和部分决定图层坐标和旋转的性质。在这里一章中,大家就要看一看图层内部是何等依照父图层和兄弟图层来决定地方和尺寸的。此外大家也会涉及什么保管图层的几何构造,以致它是如何被电动调节和活动布局影响的。

表达:因为自认为系统的当选状态很无耻,所以在cell的基类里已经把 selectionStyle 设置为None,可是想要多选必需将其开垦,大家记住。

圆角矩形是iOS的一个标识性审美国特务专门的学业人士职员性。那在iOS的每二个地点都获得了展现,无论是主荧屏Logo,依旧警报弹框,以致是文本框。依据那流行水平,你恐怕会感到一定有不相信赖Photoshop就能够随便创设圆角矩形的措施。恭喜你,猜对了。

UIView有多个相当重大的布局属性:frame,bounds和center,CALayer对应地称呼frame,bounds和position。为了能精晓区分,图层用了“position”,视图用了“center”,不过他们都意味相同的值。

3、不赏识系统的入选状态,可退换选中状态的背景(下边也是在自定义cell内部卡塔尔

CALayer有二个誉为conrnerRadius的习性决定着图层角的曲率。它是四个浮点数,默以为0(为0的时候就算直角),但是你能够把它设置成率性值。暗许情况下,这么些曲率值只影响背景颜色而不影响背景图片或是子图层。不过,就算把masksToBounds设置成YES的话,图层里面包车型大巴保有东西都会被截取。

frame代表了图层的外表坐标(约等于在父图层上占领的上空),bounds是内部坐标({0, 0}经常是图层的左上角),center和position都表示了针锋绝对于父图层anchorPoint所在之处。anchorPoint的性质将会在三番一遍介绍到,今后把它想成图层的宗旨点就好了。图3.1来得了这几个属性是怎么互相正视的。

 UIView *view = [[UIView alloc] init]; view.backgroundColor = UIColorFromRGB; self.selectedBackgroundView = view;

咱俩得以因此贰个轻松的体系来演示这么些效应。在Interface Builder中,大家放置一些视图,他们有一部分子视图。并且那个子视图有一部分压倒了边界。你可能不能够看出她们超越了界线,因为在编写分界面包车型地铁时候,超过的有个别总是被Interface Builder裁切除了。不过,你相信本人就好了 :State of Qatar

图片 4图3.1 UIView和CALayer的坐标系.jpeg

4、右上角点击事件

图片 5图4.1 多个反革命的大视图,他们都富含了小一些的浅浅莲灰视图。.png

视图的frame,bounds和center属性仅仅是存取方法,当垄断(monopoly卡塔尔视图的frame,实际上是在改换坐落于视图下方CALayer的frame,不可以见到独立于图层之外改换视图的frame。

 [self.viewModel.rightViewModel.clickSubject subscribeNext:^ { @strongify; if (self.mainTableView.editing) { self.viewModel.rightViewModel.title = @"编辑"; [UIView animateWithDuration:0.5 animations:^{ [self.mainTableView mas_remakeConstraints:^(MASConstraintMaker *make) { @strongify; make.edges.equalTo; }]; }]; } else { self.viewModel.rightViewModel.title = @"确定"; [UIView animateWithDuration:0.5 animations:^{ [self.mainTableView mas_remakeConstraints:^(MASConstraintMaker *make) { @strongify; make.left.right.top.equalTo; make.bottom.equalTo; }]; }]; } [self.mainTableView setEditing:!self.mainTableView.editing animated:YES]; }];

然后在代码中,我们设置角的半径为18个点,并裁剪掉第五个视图的当先部分。技艺上的话,这么些属性都足以在Interface Builder的探测板中分别通过『客商定义运营时属性』和勾选『裁剪子视图』(Clip Subviews卡塔尔(قطر‎采用框来平素设置属性的值。可是,在此个示例中,代码可以代表得更明亮。图4.2是运作代码的结果

对此视图只怕图层来说,frame却非四个特别明晰的性质,它实际上是三个杜撰属性,是依靠bounds,position和transform总结而来,所以当此中任何三个值产生改动,frame都会转变。相反,改良frame的值相似会耳闻则诵到她们中间的值

5、右下角删除事件

清单4.1 设置cornerRadius和masksToBounds

深深记住当对图层做转变的时候,比如旋转恐怕缩放,frame实际上意味着了覆盖在图层旋转之后的方方面面轴对齐的矩形区域,也便是说frame的宽高或许和bounds的宽高不再一致了

 [[[self.deleteBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_willDeallocSignal] subscribeNext:^ { @strongify; NSMutableArray *deleteArray = [NSMutableArray array]; for (NSIndexPath *indexPath in self.mainTableView.indexPathsForSelectedRows) { [deleteArray addObject:self.viewModel.dataArray[indexPath.row]]; } NSMutableArray *currentArray = self.viewModel.dataArray; [currentArray removeObjectsInArray:deleteArray]; self.viewModel.dataArray = currentArray; [self.mainTableView deleteRowsAtIndexPaths:self.mainTableView.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationLeft];//删除对应数据的cell dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (1.0 * NSEC_PER_SEC)); dispatch_after(delayTime, dispatch_get_main_queue(), ^{ @strongify; [self.mainTableView reloadData]; }); }];
@interface ViewController ()@property (nonatomic, weak) IBOutlet UIView *layerView1;@property (nonatomic, weak) IBOutlet UIView *layerView2;@end@implementation ViewController- viewDidLoad{ [super viewDidLoad]; //set the corner radius on our layers self.layerView1.layer.cornerRadius = 20.0f; self.layerView2.layer.cornerRadius = 20.0f; //enable clipping on the second layer self.layerView2.layer.masksToBounds = YES;}@end

图片 6图3.2 旋转八个视图只怕图层之后的frame属性.jpeg

1、系统左滑

图片 74.2.png

早先涉嫌过,视图的center属性和图层的position属性都内定了anchorPoint相对于父图层的职分。图层的anchorPoint通过position来支配它的frame的职位,你能够以为anchorPoint是用来运动图层的把柄。

#pragma mark - delete- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete;}- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"删除此经验";}- tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { [self.viewModel.deleteCommand execute:indexPath];}

右图中,水晶色的子视图沿角半径被裁剪了

私下认可来讲,anchorPoint坐落于图层的中心,所以图层的将会以那么些点为主旨放置。anchorPoint属性并未有被UIView接口暴表露来,那也是视图的position属性被号称“center”的原由。可是图层的anchorPoint能够被挪动,举个例子您能够把它内置图层frame的左上角,于是图层的剧情将会向右下角的position方向移动,并不是居中了。

证实:删除操作数据及UI刷新和多选是均等的,就不上代码了,这里只需注意左滑必要依照的系统代理就能够。

如您所见,左侧的子视图沿边界被裁剪了。

图片 8图3.3 改变anchorPoint的效果.jpeg

2、点击Cell删除

独自己作主宰每一个层的圆角曲率亦非不可能的。要是想创设某个圆角某些直角的图层或视图时,你或然必要一些例外的点子。例如利用一个图层蒙板大概是CAShapeLayer(见第六章『专项使用图层』)。

和第二章提到的contentsRect和contentsCenter属性近似,anchorPoint用单位坐标来描述,也便是图层的相对坐标,图层左上角是{0, 0},右下角是{1, 1},因而暗中认可坐标是{0.5, 0.5}。anchorPoint可以由此内定x和y值小于0或然高于1,使它放置在图层范围之外。

与系统左滑删除的例外仅仅是手动触发删除事件而已。

CALayer其它八个要命有用属性便是borderWidth和borderColor。二者一起定义了图层边的绘图样式。那条线(也被称作stroke)沿着图层的bounds绘制,相同的时间也包括图层的角。

小心在图3.3中,当更换了anchorPoint,position属性保持一定的值并不曾产生改动,不过frame却移动了。

 [[[self.deleteBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_prepareForReuseSignal] subscribeNext:^ { [viewModel.deleteCommand execute:nil]; }];

borderWidth是以点为单位的概念边框粗细的浮点数,默以为0.borderColor定义了边框的颜色,默感觉石青。

那在怎么着地方必要改换anchorPoint呢?既然大家能够随意矫正图层地点,那改变anchorPoint不会招致纠结么?为了例如表达,大家来举一个实用的事例,创制一个仿照挂钟的花色。

单个删除的操作数据和UI刷新也上下代码吧!(尽管有个别重复o

borderColor是CGColorRef类型,实际不是UIColor,所以它不是Cocoa的嵌入对象。不过呢,你势必也明白图层援用了borderColor,纵然属性证明并不可能证实这点。CGColorRef在引用/释放时候的行为表现得与NSObject极度雷同。但是Objective-C语法并不帮助这一做法,所以CGColorRef属性即正是强引用也只可以通过assign关键字来声称。

钟面和原子钟由四张图纸组成,为了容易表明,大家还是用古板的措施来装载和加载图片,使用多少个UIImageView实例(当然你也得以用健康的视图,设置他们图层的contents图片)。

 [[self.viewModel.deleteSubject takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSIndexPath *indexPath) { @strongify; if (self.viewModel.dataArray.count > indexPath.row) { [self.viewModel.dataArray removeObjectAtIndex:indexPath.row]; //删除数组里的数据 [self.mainTableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];//删除对应数据的cell dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (1.0 * NSEC_PER_SEC)); dispatch_after(delayTime, dispatch_get_main_queue(), ^{ @strongify; [self.mainTableView reloadData]; }); } }];

边框是绘制在图层边界里面包车型客车,并且在全体子内容前边,也在子图层在此以前。假如大家在事前的身教重于言教中进入图层的边框,你就能够收见到底是怎么一次事了.

图片 9图3.4 组成钟面和石英表的四张图片.jpeg

1、设置tableView好还是不佳选中(防止cell重复点击也得以应用那条特色卡塔尔国

项目清单4.2 加上边框

机械钟的机件通过IB来排列,那一个图片视图嵌套在贰个容器视图之内,并且自动调解和电动布局都被剥夺了。那是因为机关调治会潜濡默化到视图的frame,而依据图3.2的示范,当视图旋转的时候,frame是会时有爆发改变的,那将会促成有的构造上的失灵。

self.tableView.allowsSelection = NO;
@implementation ViewController- viewDidLoad{ [super viewDidLoad]; //set the corner radius on our layers self.layerView1.layer.cornerRadius = 20.0f; self.layerView2.layer.cornerRadius = 20.0f; //add a border to our layers self.layerView1.layer.borderWidth = 5.0f; self.layerView2.layer.borderWidth = 5.0f; //enable clipping on the second layer self.layerView2.layer.masksToBounds = YES;}@end

咱俩用NSTimer来更新石英钟,使用视图的transform属性来旋转石英钟(假若您对这几个天性不太熟识,不要焦心,大家将会在第5章“转变”个中详细表达),具体代码见清单3.1

友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有