在运行时调整 UITableView 的单元格

Posted

技术标签:

【中文标题】在运行时调整 UITableView 的单元格【英文标题】:adjusting UITableView's cell at runtime 【发布时间】:2011-05-15 16:40:03 【问题描述】:

我对 UITableViewCell 进行了子类化。我想要的是当我单击单元格时,我在单元格的底部添加了一个 UIView 并相应地调整了单元格的高度。这是我的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
   
MyCell* cell = (MyCell *) [self.table cellForRowAtIndexPath:indexPath]; 
UIView * options = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height - 27, cell.frame.size.width, 27)];
UIButton* button1 = [UIButton buttonWithType:UIButtonTypeCustom];
[options addSubview:button1];
UIButton* button2 = [UIButton buttonWithType:UIButtonTypeCustom];
[options addSubview:button2];
UIButton* button3 = [UIButton buttonWithType:UIButtonTypeCustom];
[options addSubview:button3];
//did some layout calculation here to position the button
[cell addSubview:options];

这是一个说明问题的video

我还尝试将我的单元格的附件视图从我的自定义 UIButton 更改为常规 UITableViewCellAccessoryDisclosure,但它没有工作

MyCell * cell = (MyCell *)[self.table cellForRowAtIndexPath:temp];
     [cell.accessoryView removeFromSuperview];
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

如果您对我想要做什么感到好奇,我正在尝试创建一个 tweetbot uitableviewcell,您可以在其中按下单元格/行,它会为您提供其他选项(转推等),并且还会显示动画。

【问题讨论】:

相关边栏中UITableView with dynamic cell heights -- what do I need to do to fix scrolling down?的可能重复项。 不确定为什么将其声明为重复...该问题并未询问有关将子视图添加到单元格并调整其大小 在我看来,这个问题的主体可以回答你的问题。但是,我可能是错的,这就是自动生成的注释显示“可能”的原因。 【参考方案1】:

我不知道我是否正确理解了您要执行的操作。但是,如果您确实想为 UITableViewCell 的高度变化设置动画,请尝试在 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 内调整它并调用

[tableView beginUpdates];
[tableView endUpdates];

【讨论】:

我想如果你看视频你就会明白。在我执行 addSubview 之后会调用 heightForRowAtIndexPath 委托吗? 其实我看过你的视频。不,这个委托不是通过简单地添加一个子视图来调用的。但实际上,当您使用这些 beginUpdates 和 endUpdates 方法时,它会被调用。 (看我的回答)在添加子视图时简单地包括它们。【参考方案2】:

将控件放入另一个单元格并使用

insertRowsAtIndexPaths:withRowAnimation:   

显示它和

deleteRowsAtIndexPaths:withRowAnimation: 

隐藏它。

【讨论】:

我也想过这种方法,但是我的 UITable 数据源来自消息的 NSArray,这意味着我需要向数据源添加不是消息的东西吗?这样好吗?然后我还需要修改 cellForRowAtIndexPath 来处理这种特殊情况,对吗? 基本上,是的。每当控件未隐藏时,您的 tableView:numberOfRowsInSection: 应该返回 number_of_items + 1 并且 tableView:cellForRowAtIndexPath: 应该返回适​​当的控件单元格。

以上是关于在运行时调整 UITableView 的单元格的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局在屏幕更改时调整自定义单元格中的 UIButton 字体

嵌套集合视图单元格未在方向更改时调整大小

在旋转时调整 UICollectionViewCells 的大小会更改当前可见的单元格 [重复]

当边界 UICollectionView 更改时调整单元格大小

单击Swift 4中的自定义按钮时调整单元格大小

自定义 UITableViewCell 中的 UIImageView 在单击时调整大小