标题视图包含两个使用约束布局的标签.折叠视图时,放置在底部的标签的高度约束将设置为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节标题的高度所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)