小编典典

展开和折叠tableview单元格

swift

我能够展开和折叠单元格,但我想在UITableViewCell内调用函数(展开和折叠)以更改按钮标题。

iphone
5

导入UIKit

类MyTicketsTableViewController:UITableViewController {

    var selectedIndexPath:NSIndexPath?
    var extraHeight:CGFloat = 100

    覆盖func viewDidLoad(){
        super.viewDidLoad()
    }

    覆盖func didReceiveMemoryWarning(){
        super.didReceiveMemoryWarning()
        //处理所有可以重新创建的资源。
    }

    覆盖func tableView(tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {
        返回5
    }

    覆盖func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell {
        让cell = tableView.dequeueReusableCellWithIdentifier(“ cell”,forIndexPath:indexPath)为!MyTicketsTableViewCell
        返回单元
    }

    覆盖func tableView(tableView:UITableView,heightForRowAtIndexPath indexPath:NSIndexPath)-> CGFloat {
        if(selectedIndexPath!= nil && indexPath.compare(selectedIndexPath!)== NSComparisonResult.OrderedSame){
            返回230 + extraHeight
        }

        回报230.0
    }

    覆盖func tableView(tableView:UITableView,didSelectRowAtIndexPath indexPath:NSIndexPath){
        if(selectedIndexPath == indexPath){
            selectedIndexPath =无
        }其他{
            selectedIndexPath = indexPath
        }

        tableView.beginUpdates()
        tableView.endUpdates()
    }
}




导入UIKit

类MyTicketsTableViewCell:UITableViewCell {

    @IBOutlet弱var expandButton:ExpandButton!
    @IBOutlet弱var detailsHeightConstraint:NSLayoutConstraint!

    var defaultHeight:CGFloat!

    覆盖func awakeFromNib(){
        super.awakeFromNib()

        defaultHeight = detailsHeightConstraint.constant

        expandButton.button.setTitle(“ TAP FOR DETAILS”,forState:.Normal)
        detailsHeightConstraint.constant = 30
    }

    func expand(){
        UIView.animateWithDuration(0.3,延迟:0.0,选项:.CurveLinear,动画:{
            self.expandButton.arrowImage.transform = CGAffineTransformMakeRotation(CGFloat(M_PI * 0.99))
            self.detailsHeightConstraint.constant = self.defaultHeight
            self.layoutIfNeeded()

            },完成:{已完成
                self.expandButton.button.setTitle(“ CLOSE”,forState:.Normal)
        })
    }

    func crash(){
        UIView.animateWithDuration(0.3,延迟:0.0,选项:.CurveLinear,动画:{
            self.expandButton.arrowImage.transform = CGAffineTransformMakeRotation(CGFloat(M_PI * 0.0))
            self.detailsHeightConstraint.constant = CGFloat(30.0)
            self.layoutIfNeeded()

            },完成:{已完成
                self.expandButton.button.setTitle(“ TAP FOR DETAILS”,forState:.Normal)
        })
    }

}

阅读 256

收藏
2020-07-07

共1个答案

小编典典

如果你想在细胞获得更大的身体,那么,你有你的店IndexPath,在heightForRow:使用:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if selectedIndexPath == indexPath {
      return 230 + extraHeight
    }
    return 230.0
}

然后,当您想在didSelectRow中展开一个时:

selectedIndexPath = indexPath
tableView.beginUpdates
tableView.endUpdates

编辑

这将使单元动画自己变大,您不需要单元中额外的动画块。

编辑2

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if(selectedIndexPath == indexPath) {
          selectedIndexPath = nil

          if let cell = tableView.cellForRowAtIndexPath(indexPath) as? MyTicketsTableViewCell {
            cell.collapse()
          }
          if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow:indexPath.row+1, section: indexPath.section) as? MyTicketsTableViewCell {
            cell.collapse()
          }
        } else {
          selectedIndexPath = indexPath

          if let cell = tableView.cellForRowAtIndexPath(indexPath) as? MyTicketsTableViewCell {
              cell.expand()
          }

          if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow:indexPath.row+1, section: indexPath.section) as? MyTicketsTableViewCell {
             cell.expand()
          }
        }

        tableView.beginUpdates()
        tableView.endUpdates()
    }
2020-07-07