ios – 在约束条件下更改UITableView节标题的高度

ios – 在约束条件下更改UITableView节标题的高度,第1张

概述我有一个自定义UIView用作UITableView的节头.我希望能够通过更改标题视图的高度来扩展和折叠标题视图,并为此更改设置动画. 标题视图包含两个使用约束布局的标签.折叠视图时,放置在底部的标签的高度约束将设置为0. 当我按下折叠/展开按钮时,我更改了一个由tableView返回的headerHeight变量:heightForHeaderInSection:.在这里,我还更改了高度约束的值 我有一个自定义UIVIEw用作UItableVIEw的节头.我希望能够通过更改标题视图的高度来扩展和折叠标题视图,并为此更改设置动画.

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

当我按下折叠/展开按钮时,我更改了一个由tableVIEw返回的headerHeight变量:heightForheaderInSection:.在这里,我还更改了高度约束的值.我在tableVIEw.beginUpdates()和tableVIEw.endUpdates()中都做了,但标题视图不会动画.在我开始滚动表格视图之前,它甚至不会使用新的高度.或者我使用tableVIEw.reloadSections(NSIndexSet(index:0),withRowAnimation:.automatic),它会对标题视图的高度进行动画处理,但会弄乱其中的子视图(顶部标签会在整个标题视图中垂直拉伸,即使它有一个固定的高度).

有没有人有一个解决方案,使用约束正确地动画标题视图高度和它的子视图?

下面是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]|",vIEws: vIEws))        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[TitleLabel]-(>=0)-|",vIEws: vIEws))        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=0)-[subTitleLabel]|",vIEws: vIEws))        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[expandbutton]-(>=0)-|",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,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节标题的高度全部内容,希望文章能够帮你解决ios – 在约束条件下更改UITableView节标题的高度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1099891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存