Как использовать кнопку в UITableViewCell для добавления TextView - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь получить UITableView из UITableViewCells, который включает в себя ярлык элемента с кнопкой рядом с ним. Когда таблица первоначально загружена, она просто показывает метку и кнопку, но когда кнопка нажата, я бы хотел, чтобы textView увеличился, а высота строки для этой одной ячейки увеличилась.

Я использую конструктор интерфейса и автоматически устанавливаю высоту строки. Я начинаю с textView в IB с высотой 0, поэтому я могу ограничить высоту ячейки до 5 от нижней части textView. Мой план состоял в том, чтобы изменить высоту textView (textView.frame.size.height = 100), и высота строки автоматически увеличится. Но этого не происходит.

Я рассмотрел множество разных способов, но большая часть моего поиска в Google заканчивается вопросами о динамическом увеличении высоты текста при наборе текста, а это не то, что мне нужно. Я хотел бы опубликовать некоторый код, но я пробовал так много разных вещей (примерная высота строки, ручная настройка фрейма ячейки, делегатов и протоколов, tableView.reloadData(), tableView.recalculateRowHeight(), ручная настройка высоты строки и т. Д. И убежище). не добились большого успеха. Если я смогу получить совет о том, как лучше всего это сделать, я опубликую пример кода, если у меня все еще будут проблемы. В лучшем случае это будет анимация, но на данный момент мне не нужно это анимированный.

Я добавил ссылку на проект GitLab: https://gitlab.com/vever343/expandingrow (в этом примере кода я начинаю с высоты textView, равной 10, а затем увеличиваю ее кнопкой)

TableViewController код:

import UIKit

class MainVC: UIViewController, UITableViewDelegate, UITableViewDataSource, cellProtocol {

    @IBOutlet weak var tableView: UITableView!

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? TableViewCell {
            cell.delegate = self
            return cell
        } else {
            return TableViewCell()
        }
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

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

    func rowExpanded() {
        tableView.reloadData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }
}

UITableViewCell Код:

import UIKit

protocol cellProtocol {
    func rowExpanded()
}

class TableViewCell: UITableViewCell {

    @IBOutlet weak var textView: UITextView!
    var delegate:MainVC?

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    @IBAction func buttonPressed(_ sender: Any) {
        textView.frame.size.height = 100
        delegate?.rowExpanded()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

Создайте NSLayoutConstraint для ограничения высоты просмотра текста, затем поиграйте с ним вместо textview.frame.size

import UIKit

protocol cellProtocol {
    func rowExpanded()
}

class TableViewCell: UITableViewCell {

    @IBOutlet weak var textView: UITextView!
    @IBOutlet var textViewHeightConstraint: NSLayoutConstraint!
    var delegate:MainVC?

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    @IBAction func buttonPressed(_ sender: Any) {
        self.textViewHeightConstraint.constant = 100
        UIView.animate(withDuration: 0.3) {    
          self.layoutIfNeeded()   
          self.delegate?.rowExpanded()
        }   

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

А для анимации

func rowExpanded() {
   self.tableView.beginUpdates()  
   self.tableView.endUpdates() 
}

Обновление: если вы хотите, чтобы при просмотре таблицы сохранялось состояние просмотра текста, вам также следует взглянуть на этот пример.

0 голосов
/ 06 мая 2019

@ Ответ Оканала верен, но я нашел другой способ сделать это, пока я продолжал свою разработку, что немного проще. Если вы поместите все элементы в StackView, тогда вы можете использовать stackView.isHidden, и Auto Layout автоматически позаботится о высоте строки, если она будет правильно ограничена.

0 голосов
/ 04 мая 2019

Попробуйте установить высоту просмотра таблицы для строки следующим образом

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

        return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 40  // this can be an estimated value you choose
} 

убедитесь, что выравнивание вашего textview установлено на естественное. Когда кнопка нажата, перезагрузите таблицу

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