我想知道我错过了什么,因为我的单元格在隐藏删除按钮时没有动画。在删除按钮完成动画制作之前,标签会跳回原始位置。
当我点击圆形编辑视图以显示删除按钮时,标签动画将起作用:
然而,当我再次点击它以隐藏删除按钮时,标签的移动不会动画:
注意:这些屏幕截图不是从以下代码创建的。但他们表明了这个问题。
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
homeCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[homeCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Set up the cell
Consumed *drinkObj = [self.appDelegate.consumedDrinksArray objectAtIndex:indexPath.row];
cell.titleLabel.text = drinkObj.drinkName;
NSString *detailTextTime = [NSDate stringFromDate:drinkObj.dateConsumed withFormat:@"h:mma"];
NSString *detailTextrelative = [relativeDateTransformer transformedValue:drinkObj.dateConsumed];
NSString *detailText = [NSString stringWithFormat:@"%@ %@ ", detailTextTime,detailTextrelative];
cell.timeLabel.text = detailText;
cell.stdDLabel.text = @"999.0"; //[NSString stringWithFormat:@"%@", drinkObj.standardDrinks];
cell.stdDLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
cell.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
cell.timeLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
答案 0 :(得分:7)
编辑: 我看到这个bug与我在第一个实例中理解的不同。 让我更正我的答案。 如果我是对的,你的删除按钮会在动画中正确消失,但内容视图会在没有动画的情况下自行调整大小(在按钮动画后面)。
在这种情况下,您必须自己管理动画。 假设您不支持轮换,我会给您代码。如果您想支持轮换,则需要更多代码: - )
这是一个示例项目(有很多代码,因为我使用了标准的主 - 细节xcode模板,只查看自定义单元格):Sample Project
将其应用于您的代码:
首先,更改单元格右侧标签的自动调整大小以固定在左侧。
我不确定正确的标签是否是stdDLabel,我会假设它
// if the right margin is flexible, the left-top-bottom are fixed
cell.stdDLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
在您的单元格子类中,覆盖setEditing:animated:
方法,如下所示:
-(void)setEditing:(BOOL)editing animated:(BOOL)animated
{
// this is an array of the labels / view that you want to animate
NSArray *objectsToMove = @[self.stdDLabel];
// this is the amount of pixel to move - the width of the delete button
float pixelToMove = 70.0f;
float animationDuration = 0.3f;
// calculating the delta. If set editing, move from right to left. otherwise, from left to right
float delta = (editing) ? -pixelToMove : pixelToMove;
// put the move code in a block for avoid repeating code in the if
void (^moveBlock)() = ^{
for (UIView *view in objectsToMove) {
view.center = CGPointMake(view.center.x + delta, view.center.y);
}
};
// we want to move the labels only if editing is different from the current isEditing state
if (editing != self.isEditing)
{
// execute the move block, animated or not
if (animated)
[UIView animateWithDuration:animationDuration animations:moveBlock];
else
moveBlock();
}
// call the super implementation
[super setEditing:editing animated:animated];
}
答案 1 :(得分:3)
我没有检查你的所有代码,但肯定你需要在删除的每一面添加开始/结束更新...
[self.drinksTableView beginUpdates];
[self.drinksTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.drinksTableView endUpdates];
...获取动画。
答案 2 :(得分:3)
您可以使用gesturerecognizer执行此任务。它可以帮助您管理您的单元格。还可以在单元格上添加自定义删除按钮,而不是默认删除按钮。
答案 3 :(得分:2)
tableView:didEndEditingRowAtIndexPath:
执行通过设置框架来手动重新定位UILabel的任务
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
homeCell *cell = (homeCell *)[tableView cellForRowAtIndexpath:indexPath];
UILabel *labelToBeRelocated = (UILabel *)[cell viewWithTag:YOUR_LABEL_TAG];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25f];
[labelToBeRelocated setFrame:CGRectMake(New_PosX , New_PosY , width , height)];
[UIView commitAnimations];
}
由于在UITableViewCell中隐藏了EditingButton(删除按钮)后调用了上述委托方法,因此只有在隐藏删除按钮后,UILabel才会重新定位其位置。 希望它会对你有所帮助。