我有一个用自定义UITableViewCells填充的UITableView。在这些自定义单元格中,我有一个UITextField和一个“查看更多”UIButton。 UIButton的目的是在用户希望阅读更多文本时动态扩展特定的UITableCell。同样,当用户希望返回原始大小时,用户再次单击Button,UITableViewCell将缩小到原始大小。
由于没有选择单元格,我在Custom Cell中设置了一个IBAction,如下所示:
//在CustomCell.m
中- (IBAction)showMoreText:(id)sender
{
//instance bool variable to flag whether the cell has been resized
self.hasBeenResized = YES;
//turn off mask to bounds, otherwise cell doesnt seem to resize
[[self.cellView layer] setMasksToBounds:NO];
// Calculate the new sizes and positions for the textView and the button
CGRect newTextViewFrame = self.textView.frame;
newTextViewFrame.size.height = self.textView.contentSize.height;
self.textView.frame = newTextViewFrame;
CGFloat bottomYPos = self.textView.frame.origin.y + self.textView.frame.size.height;
CGRect buttonFrame = self.showMoreButton.frame;
buttonFrame.origin.y = bottomYPos;
self.showMoreButton.frame = buttonFrame;
// Call begin and end updates
[(UITableView*) self.superview beginUpdates];
[(UITableView*) self.superview endUpdates];
// Set mask and put rounded corners on the cell
[[self.cellView layer] setMasksToBounds:YES];
[[self.cellView layer] setCornerRadius:10.0];
}
在此之后,我在ViewController类中有这个:
// Within ViewController.m
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"heightForRowAtIndexPath");
CustomCell *cell = (CustomCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
if([cell hasBeenResized] == NO)
{
return cell.frame.size.height + 20;
}
else
{
return cell.frame.size.height + cell.textView.frame.origin.y + cell.textView.frame.size.height + cell.showMoreButton.frame.size.height + 20;
}
}
现在发生的是我可以看到自定义单元格更改其textview的大小,但是,表格不会更新该特定单元格的行高。检查那里的If-else语句,看起来hasBeenResized始终为false,即使我在CustomCell的IBACtion中将其设置为YES。
我在这里看过其他解决方案,但它们似乎都涉及到didSelectRowAtIndexPath,我在这个实例中不能使用它(当它被选中时,我对该单元有另一种行为)。
我这样做完全错了吗?理想情况下,我想要做的是在文本视图展开时让“显示更多”按钮向下动画,反之亦然。
谢谢!
答案 0 :(得分:3)
方法beginUpdates
不会为您调用reloadData
- 您必须手动执行此操作。
对于您的情况,最好致电:
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
并将showMoreText
代码放入tableView:cellForRowAtIndexPath:
方法(仅适用于所选单元格)
答案 1 :(得分:0)
要更新tableView,您必须重新加载它。
[tableView reloadData];