我有一个带有自定义单元格的表格,在单元格中有两个 UIView,顶部始终显示,底部隐藏。
当cellCellForRowAtIndexPath被调用时,所有单元格的高度都会降低,只显示顶部的 UIView。
当用户单击单元格时,该单元格会展开,然后我取消隐藏第二个 UIView。问题是有时第二个 UIView 在第一次单击单元格时不会出现。
再次单击单元格使其全部消失,然后再次单击,它总是完美显示。向下滚动然后选择另一个,第一次单击它可能不会出现或将在错误的位置,再舔两次,它就完美了。
我认为这是一个 ReusableCell 问题,但我不知道如何解决它。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cellID = @"Cell";
customCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
// Test to see if the Cell has already been built
if (cell == nil)
{
cell = [[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
// Check if the selected Cell is being drawn and unhide the pull down view and adjust y origin
if(indexPath.row == selectedCell)
{
// Unhide the view
cell.pullDownView.hidden = NO;
CGRect tempFrame = cell.pullDownView.frame;
tempFrame.origin.y = [[secondViewY objectAtIndex:indexPath.row] floatValue];
cell.pullDownView.frame = tempFrame;
// Image in second view
cell.mainImage2.image = [theImages objectAtIndex:indexPath.row];
}
else
{
cell.pullDownView.hidden = YES;
}
// Image in first view
cell.mainImage.image = [theImages objectAtIndex:indexPath.row];
return cell;
}
所以单击一个单元格会调用如下所示的didSelectRow
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(selectedCell == indexPath.row)
{
selectedCell = -1;
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
else
{
selectedCell = indexPath.row;
}
// [tableView reloadData];
[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
[tableView endUpdates];
}
如您所见,我已经尝试了 reloadData 和 BeginUpdates ,但这仍然不起作用。这是因为我隐藏/取消隐藏应该在选择时将 Alpha 设置为 0 然后 1 吗?这是可重复使用的细胞吗?
哦,为了完整性。您可能会注意到我有一个所有高度都不同的表格,这就是我更改第二个 UIView 的 Y 的原因。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
float returnHeightValue;
if(indexPath.row == selectedCell)
{
returnHeightValue = [[selectedCellHeights objectAtIndex:indexPath.row] floatValue];
}
else
{
returnHeightValue = [[normalCellHeights objectAtIndex:indexPath.row] floatValue];
}
return returnHeightValue;
}