自定义 TableViewCells 在重新加载 tableview 时闪烁
Posted
技术标签:
【中文标题】自定义 TableViewCells 在重新加载 tableview 时闪烁【英文标题】:Custom TableViewCells are flickering while reloading tableview 【发布时间】:2020-01-28 07:25:10 【问题描述】:从网上下载了示例聊天演示应用程序。我必须更改两个自定义单元格的布局方向(左侧传入消息,右侧传出消息)。截至目前,传入和传出单元格布局方向均保留。所以,我用 UISemanticContentAttributeForceRightToLeft
改变了传出单元格的方向。
左侧的传入消息,右侧的传出消息都可以正常工作。但是自定义tableview
单元格在重新加载表格视图时会闪烁。
请在不更改传出消息单元的设计的情况下帮助我。
【问题讨论】:
请在此处分享您的某种代码,以便更好地理解您的问题。 输出单元格:dispatch_async(dispatch_get_main_queue(), ^ cell.contentView.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft; ); ***.com/help/how-to-ask - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath static NSString *cellIdentifier = @"MovieCell"; MoviesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; if (indexPath.row%2 == 0) // 偶数行 dispatch_async(dispatch_get_main_queue(), ^ cell.contentView.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft; ); 返回单元格; @HardikS 你明白我的意思了吗? 【参考方案1】:您应该从cellForrowAtIndexPath
中删除dispatch_async
内容。
该函数已在 UI 线程中运行,因此无需将任何内容分派到主队列中。
此外,由于单元格被重复使用,您还应该在indexPath.row%2 != 0
时将semanticContentAttribute
设置为从左到右,否则您最终只能从右到-滚动一段时间后离开单元格:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"MovieCell";
MoviesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if (indexPath.row%2 == 0)
cell.contentView.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
else
cell.contentView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
return cell;
【讨论】:
我想显示偶数行是 RTL,奇数行是 LTR 方向。这是我不改变设计的要求。 是的,但您只设置了 RTL 属性。如果在奇数行上重用“偶数”RTL 单元格,它将保持其 RTL 属性并且不会显示为 LTR,因为在 您的 代码中从未分配 UISemanticContentAttributeForceLeftToRight。 我添加了计时器 [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(reloadTableView) userInfo:nil repeats:YES];我注意到这里闪烁。 RTL 和 LTR 行为仅适用于 dispatch_async。 为什么要每 5 秒重新加载一次 tableView?这不是很明智的表现。您能否更清楚地解释您的要求,并将您的整个 viewController 发布在您的原始问题中。 我想在收到新消息时重新加载 tableview。我添加了用于测试目的的计时器以上是关于自定义 TableViewCells 在重新加载 tableview 时闪烁的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自定义 tableviewcells 正确添加和删除对象到 tableview?
在情节提要中使用自定义 tableviewcells 时,IBOutlet 为零
如何在swift中将标题视图添加到每个自定义tableViewCells
设置高度:具有不同大小的自定义 Nib 的 TableViewCells