27

如何UITableViewCellheightForRowAtIndexPath方法中获得when,即给定indexPath?

(然后我可以访问我创建的内容视图来增加它们的高度)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // How to get the UITableViewCell associated with this indexPath?
}

谢谢

编辑:事实上真的有一个有效的方法可以做到这一点吗?当我发表一些NSLog声明时,它似乎heightForRowAtIndexPath在调用之前调用了几次cellForRowAtIndexPath(这是我UILabels在单元格中设置的位置)?这种暗示我可能会尝试使用一种不起作用的技术,即我希望heightForRowAtIndexPath访问每个单元格中已经创建的标签以获取它们的高度并将它们加在一起以获得整个单元格行高度,但是如果他们没有'还没有设置(在cellForRowAtIndexPath)那么我想我的方法真的行不通吗?

4

6 回答 6

24

您可以使用 tableview 的委托而不是 tableView 本身。

id cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

在这里检查答案

更新

在新的 iOS 版本中并使用正确的自动约束,您不再需要引用单元格来计算单元格的高度。

在这里检查

https://www.raywenderlich.com/129059/self-sizing-table-view-cells

于 2014-03-31T09:28:33.850 回答
19

这个问题没有意义,因为在

heightForRowAtIndexPath

尚未创建任何单元格。下面是 tableView 的工作原理:

  1. TableView 询问它的数据源它将有多少部分。-numberOfSectionsInTableView
  2. 询问它的数据源每个部分将有多少行(知道滚动条应该有多大等)-numberOfRowsInSection
  3. 询问每个可见行的代表高度。知道细胞的位置。- heightForRowAtIndexPath
  4. 最后它要求数据源给它一个单元格以显示在给定的索引路径-cellForRowAtIndexPath

因此,您无法访问单元格,heightForRowAtIndexPath因为最有可能的单元格尚未创建。


但是,如果我误解了您的问题,请尝试:

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
于 2013-11-28T15:27:17.933 回答
14

显而易见的答案是调用cellForRowAtIndexPath,但您可能已经发现其中存在一些问题。如果您还没有,请参阅此问题:UITableView flexible/dynamic heightForRowAtIndexPath

对于我的上一个项目,我使用了 UICell 的自定义子类并实现了这样的方法。然后我从table:heightForRowAtIndexPath:(在查找该行的内容之后)调用它。

+ (CGFloat) heightOfContent: (NSString *)content
{
    CGFloat contentHeight = 
           [content sizeWithFont: DefaultContentLabelFont
               constrainedToSize: CGSizeMake( DefaultCellSize.width, DefaultContentLabelHeight * DefaultContentLabelNumberOfLines )
                   lineBreakMode: UILineBreakModeWordWrap].height;
    return contentHeight + DefaultCellPaddingHeight;
}
于 2011-03-10T02:40:35.073 回答
4

我建议您table:heightForRowAtIndexPath:使用您的数据结构(文本、图像、多行文本等的高度)计算行的正确高度。

-(void) layoutSubviews并在他们的方法中更改组件高度。

于 2011-03-10T02:52:11.933 回答
1

如果要访问单元格,请使用标签。但正如@Jhaliya 所说,最好根据单元格的内容计算高度。如果您关心的是单元格的位置,那么我建议您使用滚动视图并自己在任何地方实现单元格。

于 2013-01-08T09:44:11.930 回答
-19

对于iOS8

override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 80
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

或者

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            return UITableViewAutomaticDimension

    }

但是对于iOS7 来说,关键是计算 autolayout 后的高度,

func calculateHeightForConfiguredSizingCell(cell: GSTableViewCell) -> CGFloat {
        cell.setNeedsLayout()
        cell.layoutIfNeeded()
        let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height + 1.0
        return height

    }

笔记:

1)如果多行标签,不要忘记设置numberOfLines为0。

2)不要忘记label.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds)

于 2011-03-10T02:35:26.027 回答