动画下拉UIView时TableView单元格不改变高度

Posted

技术标签:

【中文标题】动画下拉UIView时TableView单元格不改变高度【英文标题】:TableView cell not changing height while animating dropdown UIView 【发布时间】:2020-02-05 16:23:17 【问题描述】:

点击时我有一个 UIView 动画下拉菜单。我想要实现的是,当我点击 tableView 单元格时 UIView 高度也会自动跟随高度变化。这是我的代码

class SubjectCell: BaseCell 
    lazy var tableView: UITableView = 
            let tv = UITableView()
            tv.delegate = self
            tv.dataSource = self
            tv.allowsSelection = false
            return tv
     ()

extension SubjectCell: UITableViewDelegate 
     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

            return 80
     

     func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 
            return UITableView.automaticDimension
     


// This is the view I want to animate
@IBOutlet weak var mainContainer: UIView!
    @IBOutlet weak var calendarView: JKCalendar!
    @IBOutlet weak var arrowImageView: UIImageView!

    @IBOutlet weak var mainContainerHeightConstraint: NSLayoutConstraint!

    override func awakeFromNib() 
        super.awakeFromNib()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        mainContainer.addGestureRecognizer(tapGesture)
    

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

        // Configure the view for the selected state
    

    @objc func handleTap(gesture: UITapGestureRecognizer) 
        if mainContainerHeightConstraint.constant == 75 
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
                self.arrowImageView.image = #imageLiteral(resourceName: "up-chevron")
                self.mainContainerHeightConstraint.constant = 370
                self.calendarView.alpha = 1
            )
         else 
            defaultConstraint()
        
    

    fileprivate func defaultConstraint() 
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
            self.arrowImageView.image = #imageLiteral(resourceName: "down-chevron")
            self.mainContainerHeightConstraint.constant = 75
            self.calendarView.alpha = 0
        )
    

这是我对 uiview 的配置。

我将 mainContainerView 设置为顶部、前导和尾随 = 0。高度 = 370。

mainContainerView 内部有一个 stackView 包含另外 2 个视图,并在 mainContainerView 中设置我的堆栈视图顶部、尾随、底部和前导 = 0

这是我模拟器中的结果

我仍然不知道如何设置 tableViewCell 以便它会自动更改。请帮帮我:)

【问题讨论】:

我认为你应该开始删除 heightForRowAt 方法,现在它固定为 80 @Alastar 它不起作用我的 orangeView 在底部越来越多。 如果你用谷歌搜索可扩展的表格视图单元格,你会很快发现单元格不能以这种方式工作。您需要做的是在被点击的下方添加另一个单元格,或者具有可点击的部分标题而不是单元格 哦,我看到了@Vollan,所以我在 viewForHeaderInSection 中制作动画而不是在单元格中,对吗? @FerryAdiWijayanto Mo,您应该只选择 viewForHeaderImSection 并按下 。为此加载单元格。部分。那 。会给你你想要的设计 【参考方案1】:

您需要设置mainContainerView 的底部约束,以便根据您的约束计算行高并删除heightForRowAt 函数。另一个是每次更改mainContainerView 的高度时都需要调用

tableView.beginUpdates()
tableView.endUpdates()

让它重新计算你的行的新高度,它将适用。

【讨论】:

以上是关于动画下拉UIView时TableView单元格不改变高度的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画打破 TableView

TableView 单元格不显示信息

默认的 tableview 单元格不响应暗模式

TableView 多个单元格不起作用,由于信号 9 而终止

tableView didSelect 单元格不起作用

从自定义单元格访问父视图