Анимировать выбранную строку при нажатии кнопки

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

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

Вот код, который у меня сейчас есть...

Главный ViewController:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "reusableCell", for: indexPath) as! CustomCell

        let data = items[indexPath.row]

        cell.displayProductName.text = data.productName

        cell.buttonAction = { sender in
            print("Button tapped...")
        }

        return cell
    }
}

Пользовательская ячейка

class CustomCell: UITableViewCell {
    var buttonAction: ((UIButton) -> Void)?

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

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

    @IBAction func activeInactive(_ sender: UIButton) {
        self.buttonAction?(sender)
    }
}

Таблица

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

Как я могу анимировать ширину строки, в которой была нажата кнопка?


person fs_tigre    schedule 10.07.2019    source источник


Ответы (3)


Вы можете создать подкласс UIButton и добавить свойство index, где вы можете хранить представленный индекс для кнопки:

import UIKit

class UIButtonWithIndex: UIButton {

    var representedIndex: Int?

}

Тогда вы должны использовать этот класс в раскадровке вместо UIButton.

После этого добавьте кнопку в качестве выхода в свою ячейку и подключитесь в Интерфейсном Разработчике.

class CustomCell: UITableViewCell {
    @IBOutlet weak var button: UIButtonWithIndex!

    var buttonAction: ((UIButtonWithIndex) -> Void)?

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

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

    @IBAction func activeInactive(_ sender: UIButtonWithIndex) {
        self.buttonAction?(sender)
    }

    // Reset the represented index when reusing the cell
    override func prepareForReuse() {
        //Reset content view width
        button.representedIndex = nil
    }
}

Затем, когда вы удаляете ячейку из очереди в cellForRowAt indexPath, установите свойство representedIndex. Теперь в вашем buttonAction у вас должен быть индекс строки, в которой была нажата кнопка.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "reusableCell", for: indexPath) as! CustomCell

    let data = items[indexPath.row]

    cell.displayProductName.text = data.productName

    cell.button.representedIndex = indexPath.item
    cell.buttonAction = { sender in
        print("Button tapped... \(sender.representedIndex)")
    }

    return cell
}

Получив индекс, вы можете получить ячейку с помощью cellForRowAtIndexPath

person LorenzOliveto    schedule 10.07.2019
comment
Я попробую и дам вам знать. Быстрый вопрос, откуда взялся item? Спасибо. - person fs_tigre; 10.07.2019
comment
Это сработало, большое спасибо! К вашему сведению. Вот как я получил ячейку... let currentCell = self.myTableView.cellForRow(at: IndexPath(row:sender.representedIndex!, section: 0)) - person fs_tigre; 11.07.2019

Я бы рекомендовал:

  1. Создайте подвид, назовем его "resizeableContentView"
  2. Добавьте «resizeableContentView» в качестве дочернего элемента в «contentView» ячейки.
  3. Добавьте свои представления в «resizeableContentView» как дочерний
  4. Установите .clearColor для ячейки и цвет фона «contentView», если необходимо.
  5. Установите ширину для «resizeableContentView» действием
  6. Не забудьте сбросить ячейку, когда она используется повторно
person MakART    schedule 10.07.2019

вы можете попробовать этот шаблонный код:

cell.buttonAction = { sender in
            UIView.animate(withDuration: 0.5) {
                cell.frame = CGRect(x: 0, y: 0, width: 150, height: 50)
            }
        }
person CAGRI COLAK    schedule 10.07.2019
comment
@cagri colak - Но как мне получить выбранную строку в методе cellForRowAt indexPath:? Мне нужно знать, какая строка была нажата. - person fs_tigre; 10.07.2019
comment
например: func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { UIView.animate (withDuration: 0,5) { tableView.cellForRow (at: indexPath)?.frame = CGRect (x: 0, y: 0, ширина: 150, высота: 50) } } - person CAGRI COLAK; 11.07.2019
comment
Но я не нажимаю на строку напрямую, у меня есть кнопка внутри ячейки, которая будет нажата. Смотрите, решение LorenzOliveto. - person fs_tigre; 11.07.2019