Переменная высота UITableViewCell расширяется после прокрутки до конца списка и поворота

ОБНОВЛЕНИЕ

Я знаю, в чем причина этого странного нарушения макета. Это настройка аксессуара (UITableViewCellAccessory). Если я перестану указывать аксессуар, макет не сломается. Я не добавил это в качестве ответа, потому что для ответа потребуется решение, которое дает мне аксессуар без нарушения макета

Большинство проблем, которые я вижу у людей с пользовательскими ячейками динамической высоты, заключаются в том, что они не имеют правильной высоты, пока они не будут повернуты. Однако я вижу обратное: все ячейки имеют высоту, допустимую для их динамического содержимого. Прокрутка вверх и вниз не нарушает этого. Однако, если я прокручу до конца списка, затем поверну устройство, а затем поверну назад, одна строка станет в 0,5–1,5 раза больше высоты экрана.

Дальнейшее вращение или дальнейшая прокрутка вернут строки к ожидаемой высоте. Я включил пару скриншотов до и после

Таблица перед прокруткой

Таблица после прокрутки и поворота

UITableView определяется следующим образом

this.rootChildrenTable = new UITableView()
            {
                TranslatesAutoresizingMaskIntoConstraints = false,
                AccessibilityIdentifier = "rootChildrenTable",
                RowHeight = UITableView.AutomaticDimension,
                EstimatedRowHeight = 44.0f,
                BackgroundColor = UIColor.GroupTableViewBackgroundColor,
                TableFooterView = new UIView(),
                TableHeaderView = this.searchBar,
                KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
            };

Обратите внимание, что обычные подозреваемые установлены RowHeight и EstimatedRowHeight. Как только я удаляю Lines = 0 из метки, делая все строки одинаковой высоты, проблема исчезает.

Любая идея, на что еще я должен смотреть?


person Pat Long - Munkii Yebee    schedule 13.09.2016    source источник
comment
Я думаю, вы можете наблюдать за вращением и вызывать beginUpdate и endUpdate, чтобы обновить высоту ячейки.   -  person Tj3n    schedule 13.09.2016
comment
Я мог бы это сделать, но у меня много таблиц динамической высоты, и я обычно не получаю этого, поэтому наверняка должно быть правильное решение для этого, а не неуверенность в том, что происходит, поэтому давайте принудительно и обновим высоту ячейки   -  person Pat Long - Munkii Yebee    schedule 13.09.2016
comment
Вы используете UITableViewController или UITableView внутри UIViewController?   -  person farzadshbfn    schedule 24.09.2016
comment
Можете ли вы показать, как устроены клетки? Используете ли вы ограничения автомакета?   -  person Sven-Michael Stübe    schedule 25.09.2016
comment
Как вы устанавливаете текст в свою ячейку. Вы делаете это в ячейке cellForRowAt indexPath или в ячейке willDisplay. Я заметил, что если вы установите текст в ячейке willDisplay, динамическая высота ячейки не будет работать правильно.   -  person Geeroz    schedule 28.09.2016
comment
@farzadshbfn У меня есть UITableView внутри UIViewController   -  person Pat Long - Munkii Yebee    schedule 28.09.2016
comment
@Sven-MichaelStübe Я пробовал несколько вариантов AutoLayout. Один использовал ячейку по умолчанию и полагался на нее для сортировки своего макета, другой заключался в том, чтобы прикрепить метку Description по умолчанию к краям ContentView, третий должен был добавить новый UILabel как Subview и закрепить его в ContentView. Все с разной степенью отказа   -  person Pat Long - Munkii Yebee    schedule 28.09.2016


Ответы (1)


Я столкнулся с той же проблемой в моем проекте. Я преодолел это следующим образом, чтобы установить высоту строки.

 //calculate the height by this way
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return self.heightForBasicCell(at: indexPath)
    }


    func heightForBasicCell(at indexPath: IndexPath) -> CGFloat {
        var sizingCell: YourCell? = nil
        var onceToken: dispatch_once_t
        dispatch_once(onceToken, {() -> Void in
            sizingCell = tableView.dequeueReusableCell(withIdentifier: YourCell.cellIdentifier())!
        })
        self.configureBasicCell(sizingCell, at: indexPath)
        return self.calculateHeight(forConfiguredSizingCell: sizingCell)
    }

    func calculateHeight(forConfiguredSizingCell sizingCell: YourCell) -> CGFloat {
        sizingCell!.bounds = CGRect(x: 0.0, y: 0.0, width: CGRectGetWidth(tableView.frame), height: CGRectGetHeight(sizingCell!.bounds))
        sizingCell!.setNeedsLayout()
        sizingCell!.layoutIfNeeded()
        var size = sizingCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
        return size.height + 1.0
        // Add 1.0f for the cell separator height
    }

    func configureBasicCell(_ cell: YourCell, at indexPath: IndexPath) {
//set your text here
    cell(“text”)
    }

Измените код в соответствии с вашими потребностями. Я только что преобразовал объективный код C в быстрый.

person Vishnuvardhan    schedule 28.09.2016
comment
Мне не нужно вычислять высоту вручную. Я не делаю этого больше нигде в нашем приложении. - person Pat Long - Munkii Yebee; 28.09.2016
comment
Вы правы. вы не рассчитываете высоту вручную. Я предполагаю, что вы используете автоматические макеты. В ячейке на основе длины текста, установленной с ячейкой метки, их высота должна увеличиваться правильно? Для этого вам нужно рассчитать только вышеуказанным способом. Попробуйте один раз. Это сработает. - person Vishnuvardhan; 28.09.2016