gpt4 book ai didi

ios - 加载推文时更新 UITableView 高度

转载 作者:可可西里 更新时间:2023-11-01 03:59:59 25 4
gpt4 key购买 nike

我有一个 UITableViewCell,其中包含一个具有自动布局的 TWTRTweetView。我正在加载这样的推文:

Constraints

Height contraint details

- (void)loadTweetWithId:(NSString *)tweetId {

if (mTweetId == nil || ![mTweetId isEqualToString:tweetId]) {
mTweetId = tweetId;
[[[TWTRAPIClient alloc] init] loadTweetWithID:tweetId completion:^(TWTRTweet *tweet, NSError *error) {
if (tweet) {
NSLog(@"Tweet loaded!");
[mTweetView configureWithTweet:tweet];
[mTweetView setShowActionButtons:YES];
//[mTweetView setDelegate:self];
[mTweetView setPresenterViewController:self.viewController];
[mTweetView setNeedsLayout];
[mTweetView layoutIfNeeded];
[mTweetView layoutSubviews];
hc.constant = mTweetView.frame.size.height;
[self updateConstraints];
[self layoutIfNeeded];
[self layoutSubviews];
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
[self.tableView layoutSubviews];
} else {
NSLog(@"Tweet load error: %@", [error localizedDescription]);
}
}];
}
}

当 tweet 加载的单元格不会调整大小时,除非我将其向外滚动并向后滚动。正如您在代码片段中看到的那样,我已经尝试了几种方法。但这些都不起作用。我的表格 View 使用全自动布局方法,该方法未实现行功能的单元格高度。我该如何解决这个问题?

更新:

使用:

[self.tableView beginUpdates];
[self.tableView endUpdates];

是不可能的,因为当我这样做时,所有单元格都被重绘并且发生非常大的跳跃,这是 Not Acceptable 。我还确认推文完成 block 在主线程中运行。

Jump video

更新 2:

我还尝试使用推文 ID 缓存推文 View 并重新加载相关索引路径的单元格,并为推文 ID 提供相同的推文 View 。单元格高度已更正,但在滚出/滚入之前它不会变得可见。

更新 3:

我在单元格的 xib 中对推文 View 进行约束,并连接了高度约束。所以这不是主线程问题。我还提到在索引处重新加载特定单元格不起作用。

在使用其他解决方案时,我看到了一些示例 TwitterKit 代码,它们使用 TWTRTweetTableViewCell 但预加载推文以配置单元格。所以我也做了同样的事情。这当然是一种解决方法。

最佳答案

更新的答案:

你做错了几件可能导致(或至少促成)跳跃的事情:

  • 永远不要自己调用 layoutSubviews它是系统调用的一种方法来解决您的约束。连续调用setNeedsLayoutlayoutIfNeeded时自动触发。

  • 这同样适用于 updateConstraints 它在布局过程中由系统调用。您可以通过随后调用 setNeedsUpdateContraintsupdateConstraintsIfNeeded 来手动触发它。此外,它只有在您实际在自定义 View (或单元格)中实现(覆盖)该方法时才会起作用。

  • 当您在 View 上调用 layoutIfNeeded 时,它会布局其 subview 。因此,当您更改约束 mTweetView 的约束常量时,它可能不会产生任何影响(除非 View 层次结构在触发布局过程中无效)。您需要在 mTweetView 的 super View (单元格的内容 View )上调用 layoutIfNeeded(根据您添加到帖子中的屏幕截图判断):

    [contentView layoutIfNeeded];

此外,您还需要注意一件事,它也可能导致闪烁:

  • 正在回收 TableView 中的单元格。每次重复使用一个单元格时,您都会加载一条新推文。我猜这是来自异步网络请求?如果是这样,当您滚动得非常快时,您为该单元格实例加载的第一条推文的完成 block 有可能在您为该(回收的)单元格加载的第二条推文的完成 block 之后返回或者你的互联网连接真的很慢。确保在您的单元格被重复使用时取消请求或以某种方式使其无效(prepareForReuse 方法)。

请确保您已解决所有这些问题并查看动画现在是否按预期运行。 (我在下面的原始答案仍然有效。)


原答案:

我很确定

[self.tableView beginUpdates];
[self.tableView endUpdates];

是让单元格在显示时自动调整大小的唯一方法

原因:

出于历史性能原因,UITableView 始终使用固定高度的单元格(内部)。即使通过设置 estimatedRowHeight 等使用自调整单元格时, TableView 也会在单元格出列时计算单元格的高度,即单元格出现在屏幕上时之前。然后,它会向单元格添加一些内部约束,为其提供固定宽度固定高度,恰好与自动布局计算出的尺寸相匹配。

这些内部约束仅在需要时更新,即重新加载行时。现在,当您在单元格内添加任何约束时,您将“对抗”这些具有必需 优先级(又名 1000)的内部约束。换句话说:没有办法赢!

更新这些内部(固定)单元格约束的唯一方法是告诉 TableView 它应该这样做。据我所知,唯一公开的(记录在案的)API 是

- (void)beginUpdates;
- (void)endUpdates;

所以剩下的唯一问题是:

为什么这种方法不适合您?

我认为在调整大小后重新绘制单元格是合理的。当您展开单元格以显示比之前更长的推文时,单元格需要无论如何都要重新绘制!

您可能不会(也不应该)一直调整所有 可见单元格的大小。 (这会让用户感到困惑......)

关于ios - 加载推文时更新 UITableView 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44735698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com