【发布时间】:2017-12-03 07:00:28
【问题描述】:
我有一个名为CollapsibleTableViewHeader 的标题,它的高度是动态的,基于其中包含的UILabels 和UIViews。
所以,我下面有这个功能-
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
let header = self.tableView.dequeueReusableHeaderFooterViewWithIdentifier("header") as! CollapsibleTableViewHeader
switch indexPath.row {
case 0:
if sections[indexPath.section].collapsed == true {
return 0
}
else {
return header.iconsViewHeightConstraint.constant + header.shortDescHeightConstraint.constant + header.validityDateHeightConstraint.constant + header.expiryAlertHeightConstraint.constant
}
default:
return 0
}
}
在我的 else 条件下,我需要将标题的高度作为行的高度返回。因此,我将标题中的所有元素相加并返回值(CGFloat)。
高度按预期返回但问题是相同的高度应用于所有单元格。例如如果返回的高度值为 150.0,则相同的 150.0 将应用于所有单元格,无论它们各自的高度如何。
如何获得每个单元格的特定高度? indexPath 是一件很重要的事情,但我不知道如何在这里使用它。
抱歉,如果问题很愚蠢!请帮忙
PS:我已经尝试过automaticDimension,但这无论如何都无济于事,因为我将这些单元格作为折叠/展开单元格。
编辑 1:添加 viewForHeaderInSection 代码
// Header
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let header = self.tableView.dequeueReusableHeaderFooterViewWithIdentifier("header") as! CollapsibleTableViewHeader
if sections.count == 0 {
self.tableView.userInteractionEnabled = false
header.cornerRadiusView.layer.borderWidth = 0.0
header.benefitAlertImage.hidden = true
header.benefitAlertText.hidden = true
header.amountLabel.hidden = true
}
else {
header.amountLabel.hidden = false
header.cornerRadiusView.layer.borderWidth = 1.0
self.tableView.userInteractionEnabled = true
header.titleLabel.text = sections[section].name
header.arrowImage.image = UIImage(named: "voucherDownArrow")
header.setCollapsed(sections[section].collapsed)
header.benefitDetailText2.text = sections[section].shortDesc
header.benefitDetailText3.text = sections[section].untilDate
header.section = section
header.delegate = self
if sections[section].collapsed == true {
header.benefitAlertImage.hidden = true
header.benefitAlertText.hidden = true
header.commerceIconsContainerView.hidden = true
for i in 0..<imagesArray.count {
imagesArray[i].image = UIImage(named: "")
}
}
else {
header.commerceIconsContainerView.hidden = false
if sections[section].items.count > 5 {
header.iconsViewHeightConstraint.constant = 74.0
}
else {
header.iconsViewHeightConstraint.constant = 38.0
}
if sections[section].isNearExpiration == true {
header.benefitAlertImage.hidden = false
header.benefitAlertText.hidden = false
}
else {
header.benefitAlertImage.hidden = true
header.benefitAlertText.hidden = true
}
}
}
return header
}
【问题讨论】:
-
我其实不明白为什么 UITableViewAutomaticDimension 没有帮助你,因为它看起来像一个经典场景。需要详细说明吗?
-
@OhadM:我不知道为什么。我尝试的第一件事是自动维度,但我总是得到一个静态高度。
-
所以您没有按应有的方式实现它。请告诉我你试过什么?另外,请提供您需要动态高度的自动布局视图的屏幕截图。
-
我停止使用 heightForRowAtIndexPath 和 heightForHeaderInSection。在我的 viewDidLoad 中,我添加了estimatedRowHeight 和estimatedHeightForHeader
-
您不会在恒定高度单元格上仅使用动态估计高度,而您的标题 ISN'T 不是动态的。它是,恒定的。唯一动态的是,在用户点击该标题后,您的单元格会出现在标题中,对吗?
标签: ios swift uitableview uitableviewsectionheader