- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 UITableViewCell
,其中包含一个具有自动布局的 TWTRTweetView
。我正在加载这样的推文:
- (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 在主线程中运行。
更新 2:
我还尝试使用推文 ID 缓存推文 View 并重新加载相关索引路径的单元格,并为推文 ID 提供相同的推文 View 。单元格高度已更正,但在滚出/滚入之前它不会变得可见。
更新 3:
我在单元格的 xib 中对推文 View 进行约束,并连接了高度约束。所以这不是主线程问题。我还提到在索引处重新加载特定单元格不起作用。
在使用其他解决方案时,我看到了一些示例 TwitterKit
代码,它们使用 TWTRTweetTableViewCell
但预加载推文以配置单元格。所以我也做了同样的事情。这当然是一种解决方法。
最佳答案
你做错了几件可能导致(或至少促成)跳跃的事情:
永远不要自己调用 layoutSubviews
。它是系统调用的一种方法来解决您的约束。连续调用setNeedsLayout
和layoutIfNeeded
时自动触发。
这同样适用于 updateConstraints
。 它在布局过程中由系统调用。您可以通过随后调用 setNeedsUpdateContraints
和 updateConstraintsIfNeeded
来手动触发它。此外,它只有在您实际在自定义 View (或单元格)中实现(覆盖)该方法时才会起作用。
当您在 View 上调用 layoutIfNeeded
时,它会布局其 subview 。因此,当您更改约束 mTweetView
的约束常量时,它可能不会产生任何影响(除非 View 层次结构在触发布局过程中无效)。您需要在 mTweetView
的 super View (单元格的内容 View )上调用 layoutIfNeeded
(根据您添加到帖子中的屏幕截图判断):
[contentView layoutIfNeeded];
此外,您还需要注意一件事,它也可能导致闪烁:
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/
我是一名优秀的程序员,十分优秀!