【问题标题】:UITableViewCell desn't update it's heigh to fit custom UIControl heightUITableViewCell 不会更新其高度以适应自定义 UIControl 高度
【发布时间】:2020-11-24 18:14:27
【问题描述】:

我创建了一个继承自 UIControl 的自定义滑块并将其传递给 UITableViewCell

问题是当我的自定义滑块的内容大于 UITableViewCell 的高度时,单元格不会更新它的高度以适应滑块的内容高度

这是我的 TableViewCell 层次结构

这就是它的样子(背景蓝色视图是一个单元格)。我在自定义滑块控件的代码中创建的所有视图:

这是它在设备上的样子:

如您所见,我的自定义控件内容较大,但单元格不想更新其约束以适应控件的内容。还有一件事,正如您在第一个屏幕截图中看到的那样,我的高度限制 >= 60,但如果我删除此限制,我的自定义滑块将根本不可见:

这是我的自定义滑块代码,但我想我搞砸了更新父视图(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()
}

【问题讨论】:

  • 您的自定义控件是在 xib 中设计的吗?还是全部通过代码?您是否在自定义控件的子视图上使用约束来定义其高度?
  • @DonMag 我完全通过代码进行了控制。不,我只在 UITableVIewCell 中的自定义控件上使用约束。内部控制我只使用框架来计算子视图的位置
  • OK - 要让表格视图单元格自动调整其高度,您确实需要使用约束。发布自定义控件的代码?
  • @DonMag 好吧,我已经添加了约束并且它有效!非常感谢!发布您的答案,我会将其标记为解决方案,谢谢!

标签: ios swift uitableview tableview uicontrol


【解决方案1】:

根据 OP...

您缺少自动调整单元格高度所需的约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多