我有一个 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/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U