UITableViewCell 不会更新其高度以适应自定义 UIControl 高度
UITableViewCell desn't update it's heigh to fit custom UIControl height
我创建了一个继承自 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()
}
根据 OP...
您缺少 auto-size 单元格高度所需的约束。
我创建了一个继承自 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()
}
根据 OP...
您缺少 auto-size 单元格高度所需的约束。