UITableViewCell не обновляет его высоту, чтобы соответствовать пользовательской высоте UIControl - PullRequest
0 голосов
/ 04 августа 2020

Я создал настраиваемый слайдер, унаследованный от UIControl, и передал его в UITableViewCell.

Проблема в том, что, когда содержимое моего настраиваемого слайдера больше высоты UITableViewCell, ячейка выиграла ' t обновить его высоту, чтобы она соответствовала высоте содержимого слайдера

Вот моя иерархия TableViewCell

enter image description here

This is how it looks like(the background blue view is a cell). All views I created in code in custom slider control:

enter image description here

This is how it looks like on the device:

enter image description here

As you can see I have a larger content of my custom control, but the cell doesn't want to update its constraints to fit control's content. One more thing, as you can see on the first screenshot, I have height constraint >= 60, but if I remove this constraint, than my custom slider won't be visible at all:

введите описание изображения здесь

Вот мой код настраиваемого слайдера, но я полагаю, что кое-что испортил в обновлении ограничений родительского представления (UITableViewCell) или вычислении настройки высоты содержимого parentView (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()
}

1 Ответ

0 голосов
/ 04 августа 2020

Согласно OP ...

Вам не хватает ограничений, необходимых для автоматического изменения высоты ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...