Не удается плавно расширить текстовое представление в iOS 11 Swift

Я пытаюсь развернуть текстовое представление, когда нажимаю кнопку «Подробнее». Он работает на устройстве ниже iOS 11, но не может плавно расширяться в версии iOS 11. Зачем?

Когда я нажму кнопку «Читать дальше», запустится этот код.

tableView.beginUpdates()
let txtView = cell2.aboutTxtView!
let txtStr = cell2.aboutTxtView.text!
let btn = cell2.aboutReadBtn!

if self.aboutTag == 0{
    let height = getRowHeightFromTextView(strText: txtStr, txtView: txtView)
    cell2.aboutTxtView_HeightConstraint.constant = height
    self.view.layoutIfNeeded()
    btn.setTitle("Show Less", for: .normal)
    self.aboutTag = 1
    self.aboutHeight = 140.0 + height - 84.0
    tableView.endUpdates()
}
else
{
    cell2.aboutTxtView_HeightConstraint.constant = 84
    self.view.layoutIfNeeded()
    btn.setTitle("Read More", for: .normal)
    self.aboutTag = 0
    self.aboutHeight = 140.0
    tableView.endUpdates()
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.section == 1
    {
        return aboutHeight
    }
}

Ниже версии iOS 11

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

Версия iOS 11

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

Что я пробовал.

(1)

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

(2)

override func viewDidAppear(_ animated: Bool)
{
    super.viewDidAppear(animated)

    if #available(iOS 11, *)
    {
        self.tableView.contentInsetAdjustmentBehavior = .never
    }
}

person Lester    schedule 02.03.2018    source источник


Ответы (3)


Если ответ @Sid не решит вашу проблему.

Вы должны вызывать layoutIfNeeded, self.view.layoutIfNeeded() после любых обновлений пользовательского интерфейса. Также используйте для этого основную очередь.

DispatchQueue.main.async {
   self.view.layoutIfNeeded()
}

Это обновит кадры просмотров.

person Naresh    schedule 02.03.2018
comment
Я также пробовал self.tableView.layoutIfNeeded() и cell2.layoutIfNeeded() - person Lester; 02.03.2018
comment
да, cell2.aboutTxtView_HeightConstraint.constant, это ограничение по высоте - person Lester; 02.03.2018

Не обновляйте табличное представление, просто обновите одну ячейку внутри табличного представления и установите высоту для ячейки.

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.section == 1
    {
        return aboutHeight
    }
    return UITableViewAutomaticDimension
}

Затем обновите только ячейку Обо мне. Он будет обновлять только одну ячейку, поэтому расширение ячейки будет плавным.

// Add your code to update cell height 
self.tableView.beginUpdates()
let indexPath = IndexPath(row: 0, section: 1)
self.tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
self.tableView.endUpdates()

Обновление:

self.tableView.beginUpdates()
let indexPath = IndexPath(row: 0, section: 1)

let txtView = cell2.aboutTxtView!
let txtStr = cell2.aboutTxtView.text!
let btn = cell2.aboutReadBtn!

if self.aboutTag == 0{
    let height = getRowHeightFromTextView(strText: txtStr, txtView: txtView)
    cell2.aboutTxtView_HeightConstraint.constant = height
    btn.setTitle("Show Less", for: .normal)
    self.aboutTag = 1
    self.aboutHeight = 140.0 + height - 84.0
}
else
{
    cell2.aboutTxtView_HeightConstraint.constant = 84
    btn.setTitle("Read More", for: .normal)
    self.aboutTag = 0
    self.aboutHeight = 140.0
}
tableView.endUpdates()

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.section == 1
    {
        return aboutHeight
    }
    return UITableViewAutomaticDimension
}
person Sid Mhatre    schedule 02.03.2018
comment
Попробуйте удалить estimatedHeightForRowAt. - person Sid Mhatre; 02.03.2018
comment
Проверьте обновление и используйте тот же код и удалите self.view.layoutIfNeeded() и то, что я пробовал 1 и 2. - person Sid Mhatre; 02.03.2018
comment
Я удалил код в том, что у меня есть. и высота ограничения текстового представления не будет обновляться, если я удалю self.view.layoutIfNeeded() , а также эффект «запаздывания» или «прокрутки вверх», который все еще присутствует, когда я нажал кнопку - person Lester; 02.03.2018
comment
self.view.layoutIfNeeded() Не требуется для расширения ячейки в Uitableview. Если вы измените высоту и содержимое ячейки, она будет обновлена. - person Sid Mhatre; 02.03.2018

Я исправил это, добавив эти три кода.

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

Источник: https://stackoverflow.com/a/46350318/8393564
Источник: https://stackoverflow.com/a/46257601/8393564

person Lester    schedule 02.03.2018