当前设置:
具有自动计算高度的 TableView:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 152.0;
self.tableView.estimatedSectionHeaderHeight = 50.0;
每当 fetched results controller 更新它的数据时,tableview 就会重新加载:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView reloadData];
}
该单元使用 Xib 配置。第一个标签被固定到单元格的顶部,每个后续标签被固定到它上面的标签的顶部,底部的标签被固定到单元格的底部。
问题:
每次我在 TableView 中的项目上设置“收藏夹”属性时,获取的结果 Controller 会被触发以重新加载表并更改滚动位置。我试图修复的正是滚动位置的这种变化。
附加信息
如果我使用固定的单元格高度,它可以解决问题,但我需要 UITableViewAutomaticDimension,因为第一个标签可以覆盖两行,其余标签可能存在也可能不存在。
示例
注意 - 当我选择 Fav 按钮时,它会在核心数据中设置 fav 属性并重新加载表格。为什么 table 会跳来跳去?
最佳答案
它的发生是由于以下顺序:
-tableView:heightForRowAtIndexPath: 在显示每个单元格之前询问其委托(delegate)人的确切高度。contentOffset.y 现在是 220。contentOffset.y 是 220。UITableView 现在开始填充其内容。首先,它需要知道其内容的大小以正确调整其滚动指示器的大小和位置。它还需要知道哪些对象 - 表头、部分标题、行、部分页脚和表页脚 - 它应该根据其当前 bounds 显示,哪个位置也由 contentOffset。要开始放置可见对象,它首先需要跳过不可见垂直范围 [0…220] 内的对象。
estimated... 属性提供值并且没有实现任何 tableViewController:estimated... 方法,那么 UITableView 会询问它的委托(delegate)关于确切的高度通过调用适当的委托(delegate)方法(例如 -tableView:heightForRowAtIndexPath:)来处理页眉、页脚和行。如果您的代表报告的对象数量和高度与重新加载前相同,那么您将看不到任何表格元素的位置和大小发生任何视觉变化。当你的表应该显示大量行时,这种“海峡”行为的缺点变得很明显,比方说 50000。UITableView 询问它的委托(delegate)关于这 50000 行中每一行的高度,你必须通过测量每个相应行的文本来自己计算它对象,或者当使用 UITableViewAutomaticDimension UITableView 做同样的测量本身,询问它的代表填充文本的单元格。相信我,它很慢。每次重新加载都会导致几秒钟的界面卡住。estimatedRowHeight 或 -tableView:estimatedHeightForRowAtIndexPath: 中为行提供的值以及节页眉和页脚的相应方法进行计数。通过将 estimatedRowHeight 设置为 60,您告诉 UITableView 跳过三行 (60 * 3 = 180) 并将第 4 行放置在距顶部可见边缘偏移量为 -40 的位置。因此,视觉“跳跃”了 40 个像素。此处“正确”的解决方案是不调用 reloadData。仅为更改的对象重新加载行,使用 -reloadRowsAtIndexPaths:withRowAnimation:。在 NSFetchedResultsController + UITableView 的情况下使用这个 classic scheme .
关于ios - 由具有 UITableViewAutomaticDimension 的 FetchedResultsController 提供支持的 UITableView - 重新加载表格时单元格移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107130/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
鉴于我有以下迁移: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
我收到这个错误: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
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c
我们目前正在为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使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里