- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常,您会使用 cellForRowAtIndexPath
委托(delegate)方法来设置单元格。单元格的信息集对于单元格的绘制方式和大小非常重要。
不幸的是,heightForRowAtIndexPath
委托(delegate)方法在 cellForRowAtIndexPath
委托(delegate)方法之前调用,因此我们不能简单地告诉委托(delegate)返回单元格的高度,因为这将是那时为零。
所以我们需要在表格中绘制单元格之前计算其大小。幸运的是,有一个方法可以做到这一点,sizeWithFont
,它属于 NSString 类。然而存在问题,为了动态计算正确的大小,它需要知道单元格中的元素将如何呈现。我将通过一个例子来阐明这一点:
想象一个 UITableViewCell
,其中包含一个名为 textLabel
的标签。在 cellForRowAtIndexPath
委托(delegate)方法中,我们放置 textLabel.numberOfLines = 0
,它基本上告诉标签它可以有尽可能多的行来呈现特定宽度的文本。如果我们为 textLabel 指定的文本大于最初指定给 textLabel 的宽度,就会出现问题。第二行将会出现,但单元格的高度不会自动调整,因此我们会得到一个看起来很困惑的表格 View 。
如前所述,我们可以使用 sizeWithFont
来计算高度,但它需要知道使用哪种 Font、宽度等。如果为了简单起见,我们只关心width,我们可以硬编码宽度约为 320.0(不考虑填充)。但是,如果我们使用 UITableViewStyleGrouped 而不是普通的,会发生什么,宽度将在 300.0 左右,单元格将再次困惑。或者如果我们从纵向切换到横向会发生什么,我们有更多的空间,但由于我们硬编码了 300.0,所以不会使用它。
在这种情况下,在某些时候您必须问自己这样的问题:您可以在多大程度上避免硬编码。
您可以调用属于 UITableView 类的 cellForRowAtIndexPath
方法来获取特定部分和行的单元格。我读过几篇文章说你不想这样做,但我不太明白。是的,我同意它已经分配了单元格,但是仅对可见的单元格调用 heightForRowAtIndexPath
委托(delegate)方法,因此无论如何都会分配单元格。如果正确使用 dequeueReusableCellWithIdentifier,单元格将不会在 cellForRowAtIndexPath 方法中再次分配,而是使用指针并仅调整属性。那么问题出在哪里呢?
请注意,单元格不是在 cellForRowAtIndexPath
委托(delegate)方法中绘制的,当 TableView 单元格变得可见时,脚本将调用 UITableVieCell 上的 setNeedDisplay
方法,该方法会触发drawRect
方法来绘制单元格。因此直接调用 cellForRowAtIndexPath
委托(delegate)不会损失性能,因为它需要绘制两次。
好吧,通过在 heightForRowAtIndexPath
委托(delegate)方法中调用 cellForRowAtIndexPath
委托(delegate)方法,我们可以收到有关单元格的所有信息,以确定其大小。
也许您可以创建自己的 sizeForCell
方法来运行所有选项,如果单元格采用 Value1 样式或 Value2 等样式该怎么办?
这只是我在想法中描述的一个理论,我想知道我写的是否正确。或者也许还有另一种方法可以完成同样的事情。请注意,我希望能够尽可能灵活地做事情。
最佳答案
Yes, I agree it will already allocate the cell, but the heightForRowAtIndexPath delegate method is only called for the cells that will be visible so the cell will be allocated anyway.
这是不正确的。 TableView 需要为 TableView 中的所有行调用 heightForRowAtIndexPath
(如果已实现),而不仅仅是当前显示的行。原因是它需要计算出其总高度才能显示正确的滚动指示器。
关于iphone - UITableView 灵活/动态 heightForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213024/
我需要从 tableView:heightForRowAtIndexPath: 访问表格中的单元格因为我想使用客户单元格中的数据来进行高度计算。我发现获取单元格的唯一方法是调用 tableView:c
我很难理解 UITableViewController 的流程。基本上这是我的结构: 我有一个tableViewController,它当然包含一个tableView。在这里,我使用 getCellC
我正在尝试创建一个包含 3 个组的分组 TableView ,每个组都有不同高度的单元格。我在我的 Storyboard 中设置了 3 个具有适当高度的原型(prototype)单元,并设置了我的 U
我有一个包含200-300个不同高度的单元格的表+一个包含UITextView的单元格(该表用于读取和发送消息)。我需要在键入文本时动态调整单元格(包含UITextView)的高度。我使用下一个代码来
我有大约 30 个 View Controller ,它们都有一个实现“heighForRowAtIndexPath”的通用基类。现在我们最近删除了 iOS 7 支持,这让我们可以使用 AutoLay
我正在尝试在我的 tableView 中显示具有正确宽高比的图像。我已经预先计算了图像的长宽比,它似乎在实际图像上正常工作,但在它显示的单元格上却不起作用。 单元格中图像的代码: private va
我想学习一种通用且正确的自定义单元格高度计算方法。 我的单元格是从 nib 加载的,它们有两个多行 UILabels,一个在另一个之上。 目前,我在 viewDidLoad 中创建特殊配置单元格,并在
heightForRowAtIndexPath 函数有一个奇怪的问题。我需要第 3 行的高度更高,但它总是设置下一行(在本例中为第 4 行)的高度。 我会解释: - (CGFloat)tableVie
我正在我的应用中实现聊天功能,并且我正在滚动自己的 UIViewController 来实现此功能。我使用 UITableView 而不是 UICollectionView,因为它更适合我的需求。 我
我在 iOS 应用程序中遇到线程问题。这是一个已经发展了几年的大型应用程序。 (我是这个项目的许多贡献者之一,并且只对它的某些部分有深刻的理解)。 在某些情况下,应用会进行后台刷新,从而触发 tabl
在我的表格 View 中,表格被加载,图像被加载,当图像被加载时,我想从我配置单元格的 ProductTableViewCell.swift 文件再次调用这个函数。 override func tab
我的应用程序有大约 30 个活跃用户和 500 多个注册用户,这个问题只发生在一个使用 iPhone 6 的 9.2 用户身上。 我从崩溃报告中可以看出她已经发生了 60 多次崩溃,并且她说问题有时是
长话短说,iOS8 在 UITableViewAutomaticDimension 上有一个错误 因此,您不能只调用 tableView.rowHeight = UITableViewAutomati
我有一张包含静态单元格的表格。对于一个单元格,我想根据标签的高度(在该单元格内)更改其高度,同时保持所有其他单元格的高度不变。如何获得当前单元格的高度?或者也许有更好的方法? - (CGFloat)t
我有一个表格 View ,我将所有的奇数单元格高度设置为 0,在奇数单元格中我有一些标签。当它显示表格 View 时,奇数单元格中的标 checkout 现在偶数单元格中。有什么办法可以让标签消失吗?
我需要在表格 View 的单元格中加载 HTML。我使用 UIWebView 而不是 UILabel 以便解释 html 标签。WebView 的大小不同,所以我这样做 - (void)webView
我有一个UITableView (分组!)并且需要计算两种样式单元格的高度:UITableViewCellStyleDefault和UITableViewCellStyleValue2 . 我就是这样
在我的 heightForRowAtIndexPath 方法中,我只想为某些行自定义高度。对于其余的事情,我希望框架能够照顾好。我该怎么做? 最佳答案 您可以只返回tableView.rowHeigh
谁能解释一下 tableView:heightForRowAtIndexPath 方法的生命周期。这个方法在什么时候被调用。 第一次填充 TableView 时的示例。 除此之外,任何时候调用此方法?
我正在尝试在 UITableViewController 中使用 heightForRowAtIndexPath 方法。但是当我尝试重写该方法时,它说它不会重写其父类(super class)中的任何
我是一名优秀的程序员,十分优秀!