当前位置: 首页 > 面试题库 >

Swift-tableView行高仅在滚动或切换展开/折叠后才更新

谷光誉
2023-03-14
问题内容

我从这里开始使用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

(要么)

有没有更好的方法来实现这一目标?

提前致谢!


问题答案:

您可以尝试使用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
    }
}


 类似资料:
  • 我创建了一个由某些菜单项组成的垂直列表菜单。单击任何菜单项时,列表将展开以显示其内部子菜单项。 还有,当页面加载时,其中一个菜单会根据页面自动展开。我使用了jquery toggle来实现这个功能,它工作得很好。 现在,我用这个菜单放置了折叠/展开箭头,类似于jquery accordian中的菜单,它们在click事件时切换。 我的问题是,当页面加载时,其中一个菜单项折叠,但箭头没有随之折叠,当

  • 问题内容: 我能够展开和折叠单元格,但我想在UITableViewCell内调用函数(展开和折叠)以更改按钮标题。 问题答案: 如果你想在细胞获得更大的身体,那么,你有你的店,在使用: 然后,当您想在didSelectRow中展开一个时: 编辑 这将使单元动画自己变大,您不需要单元中额外的动画块。 编辑2

  • 展开或折叠代码 操作步骤: 菜单栏:Code —> Folding —> Expand 快捷键: Mac: command + “+” Windows\/Linux: Ctrl + "+" 展开或折叠代码 操作步骤: 菜单栏:Code —> Folding —> Collapse 快捷键: Mac: command + “-” Windows\/Linux: Ctrl + "-" 展开或折叠当前代

  • 我正在尝试在我的android应用程序中实现折叠工具栏。我可以按我希望的方式显示工具栏,但滚动时它不会塌陷。 我正在使用以下代码 activity.xml main_toolbar.xml 下面是屏幕的外观

  • 这让我快发疯了。 我只想有一个按钮来显示和隐藏Bootstrap4中的DIV,每当我切换class=“collapse”时,DIV会显示但不会折叠。 在页面加载div折叠,按钮只工作一次,看着开发者视图在Chrome每当点击按钮它从折叠切换到collapse.show?再次单击它,它每次都会填充collapse.show。 JQuery在标题中。 感谢任何帮助,这让我发疯。在多个设备/浏览器上测试

  • 简单的问题,但我找不到答案。如何以编程方式折叠或展开? ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓