0

名前付きのヘッダーがCollapsibleTableViewHeaderあり、その高さはに基づいて動的であり、その中UILabelsUIViews含まれています。

だから、私は以下にこの機能を持っています -

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は重要な使用方法の 1 つですが、ここでの使用方法がわかりません。

質問がばかげている場合は、申し訳ありません!助けてください

PS:私はすでに試しautomaticDimensionましたが、これらのセルを折りたたみ/展開可能なセルとして持っているので、とにかく役に立ちません。

viewForHeaderInSection編集1:コードを追加

// 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
    }
4

2 に答える 2

1

メソッドで計算した各セルの高さをcellForRow配列に格納してから、heightForRowAtIndexPath関数にロードする必要があります

例えば:

var heights = [Int]()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as!  Cell
    heights.append(calculationResult)
    return cell
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return heights[indexPath.row]
}
于 2017-06-29T14:14:27.980 に答える