deleteRowsAtIndexPaths动画覆盖上层单元格

时间:2014-03-18 00:08:32

标签: objective-c uitableview

当我尝试将deleteRowsAtIndexPaths与动画UITableViewRowAnimationTop一起使用时,我要删除的单元格覆盖上面的单元格(动画中),然后消失。我做了一个小例子,每个细胞背景都是不同的颜色。

在删除单元格表视图之前,如下所示:

enter image description here

当动画发生时,所选单元格(灰色)在上方单元格的顶部向上滑动然后消失。

enter image description here

最终结果是正确的:

enter image description here

如何让选定的单元格在其上方的单元格下方滑动,而不是在顶部?代码非常简单:

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

4 个答案:

答案 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];