我从这里开始使用CollapsibleTableView,并根据我的要求对其进行了修改,以实现可折叠部分。这是现在的样子。
由于根据UI设计,我的节有一个边框,因此我选择了节标题作为我的UI元素,以折叠和展开模式保存数据。
原因: 我尝试过,但无法在下面说明的此模型中正常工作-
**在节标题中有我的标题元素,并在其单元格中包含每个项目的详细信息。默认情况下,该节处于折叠状态。当用户点击标题时,该单元格将切换为显示。就像我说的那样,由于需要在整个节(点击的标题及其单元格)上显示边框,因此我选择节标题作为操作的UI元素。这是我的tableView代码-
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return sections.count } func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { switch indexPath.row { case 0: return sections[indexPath.section].collapsed! ? 0 : (100.0 + heightOfLabel2!) case 1: return 0 case 2: return 0 default: return 0 } } 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 header.titleLabel.text = "No_Vouchers".localized() } 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) let stringRepresentation = sections[section].items.joinWithSeparator(", ") header.benefitDetailText1.text = stringRepresentation 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 } else { if sections[section].isNearExpiration == true { header.benefitAlertImage.hidden = false header.benefitAlertText.hidden = false } else { header.benefitAlertImage.hidden = true header.benefitAlertText.hidden = true } } if appLanguageDefault == "nl" { self.totalAmountLabel.text = "€ \(sections[section].totalAvailableBudget)" } else { self.totalAmountLabel.text = "\(sections[section].totalAvailableBudget) €" } } return header }
切换折叠/展开的功能 -我在部分内使用“动态变化” UILabel的高度值,然后使用这些值来扩展边框(使用其layoutconstraint)。
func toggleSection(header: CollapsibleTableViewHeader, section: Int) { let collapsed = !sections[section].collapsed header.benefitAlertImage.hidden = true header.benefitAlertText.hidden = true // Toggle collapse sections[section].collapsed = collapsed header.setCollapsed(collapsed) // Toggle Alert Labels show and hide if sections[section].collapsed == true { header.cornerRadiusViewBtmConstraint.constant = 0.0 header.cornerRadiusViewTopConstraint.constant = 20.0 header.benefitAlertImage.hidden = true header.benefitAlertText.hidden = true } else { heightOfLabel2 = header.benefitDetailText2.bounds.size.height if sections[section].isNearExpiration == true { header.benefitAlertImage.hidden = false header.benefitAlertText.hidden = false header.cornerRadiusViewBtmConstraint.constant = -100.0 - heightOfLabel2! header.cornerRadiusViewTopConstraint.constant = 10.0 if let noOfDays = sections[section].daysUntilExpiration { if appLanguageDefault == "nl" { header.benefitAlertText.text = "(nog \(noOfDays) dagen geldig)" } else { header.benefitAlertText.text = "(valable encore \(noOfDays) jour(s))" } } } else { header.cornerRadiusViewBtmConstraint.constant = -80.0 - heightOfLabel2! header.cornerRadiusViewTopConstraint.constant = 20.0 header.benefitAlertImage.hidden = true header.benefitAlertText.hidden = true } } // Adjust the height of the rows inside the section tableView.beginUpdates() for i in 0 ..< sections.count { tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: i, inSection: section)], withRowAnimation: .Automatic) } tableView.endUpdates() }
问题: 根据某些条件,在第一次启动视图时,默认情况下需要扩展此表视图中的几个节标题。当我计算标签的高度并使用这些高度来设置边框的顶部和底部约束时,按照设计显示扩展节头变得很困难。
由于默认情况下我的UILabel的高度为21,因此内容超出了边界。
更新 :行高仅在滚动浏览视图或在折叠/展开之间切换时才会更改
问题: 如何在第一次启动视图时计算我的Section标头中存在的UILabel的高度?(这意味着,在我的REST调用完成后,将提取数据,然后需要获取UIlabel的高度)。
目前,我正在使用 heightOfLabel2 = header.benefitDetailText2.bounds.size.height
heightOfLabel2 = header.benefitDetailText2.bounds.size.height
(要么)
有没有更好的方法来实现这一目标?
提前致谢!
您可以尝试使用String扩展来计算边界矩形
extension String { func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) return boundingBox.height } }