Анимировать выбранную строку по нажатию кнопки - PullRequest
0 голосов
/ 10 июля 2019

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

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

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

Main 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)
    }
}

Вид таблицы

enter image description here

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

Ответы [ 3 ]

1 голос
/ 10 июля 2019

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

cell.buttonAction = { sender in
            UIView.animate(withDuration: 0.5) {
                cell.frame = CGRect(x: 0, y: 0, width: 150, height: 50)
            }
        }
1 голос
/ 10 июля 2019

Вы можете создать подкласс 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

1 голос
/ 10 июля 2019

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

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