在按钮点击时为选定的行设置动画

Posted

技术标签:

【中文标题】在按钮点击时为选定的行设置动画【英文标题】:Animate selected row on button tap 【发布时间】:2019-07-10 12:14:47 【问题描述】:

我目前有一个带有自定义单元格的表格,其中包含一个按钮和一个标签。一切正常,标签显示产品名称,按钮响应按钮点击。

我希望能够为点击按钮的行/单元格的宽度设置动画。

这是我目前拥有的代码...

主视图控制器:

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)
    

表格视图

如何为点击按钮的行的宽度设置动画?

【问题讨论】:

【参考方案1】:

您可以继承 UIButton 并添加一个 index 属性,您可以在其中存储按钮的表示索引:

import UIKit

class UIButtonWithIndex: UIButton 

    var representedIndex: Int?


那么你应该在故事板中使用这个类而不是UIButton

然后将按钮添加为单元格中的插座并在 Interface Builder 中连接。

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 检索单元格

【讨论】:

我会试试这个,让你知道。快速提问,item 来自哪里?谢谢。 同indexPath.row ***.com/questions/14765730/… 成功了,非常感谢!仅供参考 - 这就是我检索单元格的方式...let currentCell = self.myTableView.cellForRow(at: IndexPath(row:sender.representedIndex!, section: 0))【参考方案2】:

我建议:

    创建子视图,我们称之为“resizeableContentView” 将“resizeableContentView”作为子单元添加到单元格的“contentView” 将您的视图添加到小时候的“resizeableContentView”中 如果需要,为单元格设置 .clearColor 和“contentView”背景颜色 通过操作为“resizeableContentView”设置宽度 重复使用时不要忘记重置单元格

【讨论】:

【参考方案3】:

你可以试试这个样板代码:

cell.buttonAction =  sender in
            UIView.animate(withDuration: 0.5) 
                cell.frame = CGRect(x: 0, y: 0, width: 150, height: 50)
            
        

【讨论】:

@ cagri colak - 但是如何在方法 cellForRowAt indexPath: 中获取选定的行?我需要知道点击了哪一行。 像这样: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) UIView.animate(withDuration: 0.5) tableView.cellForRow(at: indexPath)?.frame = CGRect(x: 0, y: 0, 宽度: 150, 高度: 50) 但我没有直接点击该行,我在单元格内有一个按钮将被点击。见,LorenzOliveto 的解决方案。

以上是关于在按钮点击时为选定的行设置动画的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 在点击时为 div 设置动画

使用 Swift 2 在菜单按钮点击动画视图

javascript [在页面滚动上设置动画粘贴CTA]这将在滚动时为点击元素设置动画,并在用户点击时将其关闭。 #javascript #css #sitewre

javascript [在页面滚动上设置动画粘贴CTA]这将在滚动时为点击元素设置动画,并在用户点击时将其关闭。 #javascript #css #sitewre

如何在悬停时为链接的颜色设置动画

在 SKScene 暂停时为 SKSpriteNode 的 alpha 设置动画