簡體   English   中英

UITableViewCell 不會更新它的高度以適應自定義 UIControl 高度

[英]UITableViewCell desn't update it's heigh to fit custom UIControl height

我創建了一個繼承自UIControl的自定義 slider 並將其傳遞給UITableViewCell

問題是當我的自定義 slider 的內容大於 UITableViewCell 的高度時,單元格不會更新它的高度以適應滑塊的內容高度

這是我的 TableViewCell 層次結構

在此處輸入圖像描述

這就是它的樣子(背景藍色視圖是一個單元格)。 我在自定義 slider 控件的代碼中創建的所有視圖:

在此處輸入圖像描述

這是它在設備上的樣子:

在此處輸入圖像描述

如您所見,我的自定義控件內容更大,但單元格不想更新其約束以適應控件的內容。 還有一件事,正如您在第一個屏幕截圖中看到的那樣,我的高度限制 >= 60,但如果我刪除此限制,我的自定義 slider 將根本不可見:

在此處輸入圖像描述

這是我的自定義 slider 代碼,但我想我搞砸了更新父視圖(UITableViewCell)的約束或計算設置父視圖的(UITableViewCell)內容高度:

private func updateValueLabelFrame() {
    func positionForValueInTrack() -> CGFloat {
        return trackView.frame.width * ((value - minimumValue) / (maximumValue - minimumValue))
    }
    
    func originForValueInTrack(height: CGFloat) -> CGPoint {
        let x = positionForValueInTrack() - height / 2
        return CGPoint(x: x, y: (trackView.frame.height - height) / 2)
    }
    trackView.setNeedsDisplay()
    valueLabel.sizeToFit()
    let biggerSize = valueLabel.frame.width > valueLabel.frame.height ? valueLabel.frame.width : valueLabel.frame.height
    var valueViewHeight = self.frame.height - (self.frame.height * 0.3)
    
    if biggerSize > valueViewHeight {
        valueViewHeight = biggerSize + 20
        self.frame.size = CGSize(width: self.frame.width, height: valueViewHeight / 0.7)
        self.setNeedsLayout()
    }
    let valueViewSize = CGSize(width: valueViewHeight, height: valueViewHeight)
    self.valueView.frame = CGRect(origin: originForValueInTrack(height: valueViewHeight), size: valueViewSize)
    
    let valueLabelSize = valueLabel.sizeThatFits(valueViewSize)
    let valueLabelOrigin = CGPoint(x: valueView.bounds.midX - valueLabelSize.width / 2, y: valueView.bounds.midY - valueLabelSize.height / 2)
    valueLabel.frame = CGRect(origin: valueLabelOrigin, size: valueLabelSize)
    
    valueView.layer.cornerRadius = valueView.frame.size.width / 2
}

private func updateFrame() {
    minimumLabel.sizeToFit()
    maximumLabel.sizeToFit()
    minimumLabel.frame.origin = CGPoint(x: self.bounds.minX + minMaxLabelsOffsetToBorder, y: self.bounds.midY - minimumLabel.frame.height / 2)
    maximumLabel.frame.origin = CGPoint(x: self.bounds.maxX - (maximumLabel.frame.width + minMaxLabelsOffsetToBorder), y: self.bounds.midY - maximumLabel.frame.height / 2)
    let trackLayerSize = CGSize(width: (maximumLabel.frame.minX - trackLayerOffsetFromLabels) - (minimumLabel.frame.maxX + trackLayerOffsetFromLabels), height: self.bounds.height / 3)
    let trackLayerOrigin = CGPoint(x: minimumLabel.frame.maxX + trackLayerOffsetFromLabels, y: self.bounds.midY - trackLayerSize.height / 2)
    trackView.frame = CGRect(origin: trackLayerOrigin, size: trackLayerSize)
    createReplicatorLayer()
    updateValueLabelFrame()
}

根據 OP...

您缺少自動調整單元格高度所需的約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM