尝试从自定义单元格上的UIButton扩展/折叠UITableViewCell

时间:2012-02-24 09:22:04

标签: iphone uitableview

我有一个用自定义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,我在这个实例中不能使用它(当它被选中时,我对该单元有另一种行为)。

我这样做完全错了吗?理想情况下,我想要做的是在文本视图展开时让“显示更多”按钮向下动画,反之亦然。

谢谢!

2 个答案:

答案 0 :(得分:3)

方法beginUpdates不会为您调用reloadData - 您必须手动执行此操作。

对于您的情况,最好致电:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

并将showMoreText代码放入tableView:cellForRowAtIndexPath:方法(仅适用于所选单元格)

答案 1 :(得分:0)

要更新tableView,您必须重新加载它。

[tableView reloadData];