当我尝试将deleteRowsAtIndexPaths
与动画UITableViewRowAnimationTop
一起使用时,我要删除的单元格覆盖上面的单元格(动画中),然后消失。我做了一个小例子,每个细胞背景都是不同的颜色。
在删除单元格表视图之前,如下所示:
当动画发生时,所选单元格(灰色)在上方单元格的顶部向上滑动然后消失。
最终结果是正确的:
如何让选定的单元格在其上方的单元格下方滑动,而不是在顶部?代码非常简单:
TableViewController.h:
@interface TableViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
TableViewController.m:
#import "TableViewController.h"
@implementation TableViewController{
int cellCount;
}
- (void)viewDidLoad
{
[super viewDidLoad];
cellCount=100;
[self.tableView reloadData];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return cellCount;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];
cell.backgroundColor =[self getRandomColor];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
cellCount--;
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];
}
-(UIColor *)getRandomColor
{
CGFloat hue = ( arc4random() % 256 / 256.0 );
CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;
CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;
return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];
}
@end
答案 0 :(得分:4)
我遇到了同样的问题,并通过添加以下内容进行修复:
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.layer.zPosition = -1;
这可确保“远离”动画的图层低于视图中的任何其他图层。
答案 1 :(得分:1)
解决方案是通过将zPosition设置为
来将删除的单元格放在后面[indexPaths enumerateObjectsUsingBlock:^(NSIndexPath *removedIndexPath, NSUInteger idx, BOOL *stop) {
UITableViewCell *removedCell = [tableView cellForRowAtIndexPath:removedIndexPath];
removedCell.layer.zPosition = -1;
}];
您还需要在重用的单元格上将zPosition设置为0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
...
cell.layer.zPosition = 0;
...
}
答案 2 :(得分:0)
我也有同样的问题,而且非常讨厌。我想到了导致它的原因 - 细胞的选择。这仅适用于所选单元格,因此如果您删除选定内容下方的单元格,则会生效。“/ p>
我想出了一个不完美的临时解决方案,但确实正确删除了所选行。不要在 didSelectRowAtIndexPath 中编写代码,而是使用 shouldHighlightRowAtIndexPath :
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView beginUpdates];
[self.items removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
[tableView endUpdates];
return NO;
}
此解决方案的缺点是您没有获得选择效果。我也尝试用sendSubviewToBack发送回选定的单元格,但这并没有改变任何东西。另一个缺点是即使用户错误点击并想要取消操作,行也会被删除。
答案 3 :(得分:0)
我的解决方案:暂时添加tableViewFootView,如下所示:
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height)];
self.tableView.tableFooterView.backgroundColor = self.view.backgroundColor;
//remove data
[self.infoArray removeObjectAtIndex:ip.row];
[CATransaction begin];
[CATransaction setCompletionBlock:^{
self.tableView.tableFooterView = [UIView new];
[self.tableView setNeedsDisplay];
}];
[self.tableView deleteRowsAtIndexPaths:@[ip] withRowAnimation:UITableViewRowAnimationTop];
[CATransaction commit];