gpt4 book ai didi

ios - 在约束条件下动画更改 UITableView 部分标题的高度

转载 作者:可可西里 更新时间:2023-11-01 03:34:59 25 4
gpt4 key购买 nike

我有一个自定义 UIView 用作 UITableView 的部分标题。我希望能够通过更改标题 View 的高度来展开和折叠标题 View ,并为该更改设置动画。

标题 View 包含两个使用约束布局的标签。当 View 折叠时,放置在底部的标签的高度约束将设置为 0。

当我按下折叠/展开按钮时,我更改了 headerHeight 变量,该变量由 tableView:heightForHeaderInSection: 返回。在这里,我还更改了高度约束的值。我在 tableView.beginUpdates()tableView.endUpdates() 中同时执行了这两项操作,但标题 View 不会设置动画。在我开始滚动表格 View 之前,它甚至不会使用新的高度。或者我使用 tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic) 它确实为标题 View 的高度设置了动画但弄乱了其中的 subview (顶部标签垂直拉伸(stretch)到整个标题 View ,即使它具有固定高度)。

有没有人有一个解决方案可以使用约束正确地动画标题 View 高度和它的 subview ?

HeaderView 的代码如下:

class HeaderView: UIView {

let titleLabel = UILabel()
let subtitleLabel = UILabel()
let expandButton = UIButton()

var subtitleLabelHeightConstraint: NSLayoutConstraint!

init() {
super.init(frame: CGRectNull)

titleLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
subtitleLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
expandButton.setTranslatesAutoresizingMaskIntoConstraints(false)

expandButton.setTitle("Expand / Collapse", forState: .Normal)

addSubview(titleLabel)
addSubview(subtitleLabel)
addSubview(expandButton)

let views = ["titleLabel": titleLabel, "subtitleLabel": subtitleLabel, "expandButton": expandButton]
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|[titleLabel]-[expandButton]|", options: nil, metrics: nil, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|[subtitleLabel]|", options: nil, metrics: nil, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[titleLabel]-(>=0)-|", options: nil, metrics: nil, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=0)-[subtitleLabel]|", options: nil, metrics: nil, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[expandButton]-(>=0)-|", options: nil, metrics: nil, views: views))

titleLabel.addConstraint(NSLayoutConstraint(item: titleLabel, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 20))
subtitleLabelHeightConstraint = NSLayoutConstraint(item: subtitleLabel, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 20)
subtitleLabel.addConstraint(subtitleLabelHeightConstraint)
}

required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

TableViewController 的代码:

class TableViewController: UITableViewController {

let headerView: HeaderView = {
let view = HeaderView()
view.titleLabel.text = "Title"
view.subtitleLabel.text = "Subtitle"
view.backgroundColor = UIColor.lightGrayColor()
return view
}()

var headerHeight: CGFloat = 60

override func viewDidLoad() {
super.viewDidLoad()

headerView.expandButton.addTarget(self, action: "toggleExpansion", forControlEvents: .TouchUpInside)
}

func toggleExpansion() {
tableView.beginUpdates()

if headerHeight == 60 {
headerHeight = 40
headerView.subtitleLabelHeightConstraint.constant = 0
} else {
headerHeight = 60
headerView.subtitleLabelHeightConstraint.constant = 20
}

tableView.endUpdates()

// Alternatively use tableView.reloadSections instead of begin and end updates:
// tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel?.text = "Cell"
return cell
}

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return headerHeight
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return headerView
}


}

我还在 https://github.com/lammertw/DynamicSectionHeader 创建了一个项目用代码。

最佳答案

尝试替换这个:

func toggleExpansion() {
tableView.beginUpdates()

if headerHeight == 60 {
headerHeight = 40
headerView.subtitleLabelHeightConstraint.constant = 0
} else {
headerHeight = 60
headerView.subtitleLabelHeightConstraint.constant = 20
}

tableView.endUpdates()

// Alternatively use tableView.reloadSections instead of begin and end updates:
// tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
}

通过这个:

func toggleExpansion() {

if headerHeight == 60 {
headerHeight = 40
headerView.subtitleLabelHeightConstraint.constant = 0
} else {
headerHeight = 60
headerView.subtitleLabelHeightConstraint.constant = 20
}

tableView.beginUpdates()
tableView.endUpdates()

// Alternatively use tableView.reloadSections instead of begin and end updates:
// tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
}

关于ios - 在约束条件下动画更改 UITableView 部分标题的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30024878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com