我目前有一个带有自定义单元格的表,该单元格包含一个按钮和一个标签。一切正常,标签显示产品名称,并且按钮响应按钮的轻击。
我想做的是为点击按钮的行/单元格的宽度设置动画。
这是我当前拥有的代码...
主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)
}
}
表格视图
如何为点击按钮的行的宽度设置动画?
答案 0 :(得分:1)
我建议:
答案 1 :(得分:1)
您可以尝试以下样板代码:
cell.buttonAction = { sender in
UIView.animate(withDuration: 0.5) {
cell.frame = CGRect(x: 0, y: 0, width: 150, height: 50)
}
}
答案 2 :(得分: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
检索单元格