最新消息:20210917 已从crifan.com换到crifan.org

[已解决]更新Cartography的 constrain中的某个约束条件限制

Swift crifan 1662浏览 0评论

之前用Cartography去实现自动约束:

robb/Cartography · GitHub

Cartography-Swift的自动布局第三方库(官方文档翻译) – Joe Shao in iOS – SegmentFault

代码为:

        constrain(self.tableView) {tableView in
            tableView.top == tableView.superview!.top
            tableView.width == tableView.superview!.width
            tableView.centerX == tableView.superview!.centerX
            //tableView.bottom <= tableView.superview!.bottom
            //tableView.height <= tableView.superview!.height * 0.8
            //tableView.height == self.tableViewHeight
            tableView.height == self.tvHeightConstraint.constant
        }

现在想要更新高度:

在viewDidLayoutSubviews中:

            constrain(self.tableView) {tableView in
                //tableView.height == tvHeightConstraint.constant
                tableView.height == newTvHeight
            }
            self.tableView.updateConstraints()

但是结果不起效果。

还是最开始设置的固定的180,而不是更新后的197

Cartography-Swift的自动布局第三方库(官方文档翻译) – Joe Shao in iOS – SegmentFault

最后用代码:

    init(personItem:PersonItem){
        //can set any value here, later update constrain will override it to contentsize height
        self.tableViewHeight = 200
        self.tvConstraintGroup = ConstraintGroup()
       
        super.init(nibName: nil, bundle: nil)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
       
       
        self.view.addSubview(self.tableView)
       
        self.tvConstraintGroup = constrain(self.tableView) {tableView in
            tableView.top == tableView.superview!.top
            tableView.width == tableView.superview!.width
            tableView.centerX == tableView.superview!.centerX
            tableView.height == self.tableViewHeight
        }
    }
    override func viewDidLayoutSubviews() {
        print("viewDidLayoutSubviews")
        super.viewDidLayoutSubviews()
       
        let viewHeight = self.view.bounds.height
        let tvContentHeight = self.tableView.contentSize.height
        print("viewHeight=\(viewHeight), tvContentHeight=\(tvContentHeight)")

        print("tableViewHeight=\(tableViewHeight)")
        let newTvHeight = min(viewHeight, tvContentHeight)
        print("newTvHeight=\(newTvHeight)")
       
        if tableViewHeight != newTvHeight {
            constrain(self.tableView, replace: self.tvConstraintGroup) {tableView in
                tableView.top == tableView.superview!.top
                tableView.width == tableView.superview!.width
                tableView.centerX == tableView.superview!.centerX
               
                tableView.height == newTvHeight
            }
            //self.tableView.updateConstraints()
            self.tableView.layoutIfNeeded()
        }

    }

实现了更新后的效果:

高度为TableView的ContentSize的高度==真实的高度==197了:

[总结]

想要后期更新之前通过Cartography的constrain添加的约束的话,则:

最开始添加constrain时,就要保存起来:

self.tvConstraintGroup = ConstraintGroup()
        self.tvConstraintGroup = constrain(self.tableView) {tableView in
            tableView.top == tableView.superview!.top
            tableView.width == tableView.superview!.width
            tableView.centerX == tableView.superview!.centerX
            tableView.height == self.tableViewHeight
        }

之后,去替换更新之前的约束条件:

            constrain(self.tableView, replace: self.tvConstraintGroup) {tableView in
                tableView.top == tableView.superview!.top
                tableView.width == tableView.superview!.width
                tableView.centerX == tableView.superview!.centerX
               
                tableView.height == newTvHeight
            }
            self.tableView.layoutIfNeeded()

注意:

1.此处的替换约束条件,是完全替换掉:

所以即使是我此处这种,只需要更新高度,其他top,width,centerX都无需更新,但是也要重新都加上,否则就只有一个height的约束:

            constrain(self.tableView, replace: self.tvConstraintGroup) {tableView in
//                tableView.top == tableView.superview!.top
//                tableView.width == tableView.superview!.width
//                tableView.centerX == tableView.superview!.centerX
               
                tableView.height == newTvHeight
            }

无法正常显示了:

2.记得更新完毕约束条件后,需要再去更新布局:

self.tableView.layoutIfNeeded()

转载请注明:在路上 » [已解决]更新Cartography的 constrain中的某个约束条件限制

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
101 queries in 0.207 seconds, using 23.49MB memory