Swift SnapKit 动态高度问题

Posted

技术标签:

【中文标题】Swift SnapKit 动态高度问题【英文标题】:Swift SnapKit dynamic height issue 【发布时间】:2019-05-20 11:55:01 【问题描述】:

我在 DispatchQueue.main.async 上使用 snapKit 以编程方式设置约束。但我注意到 ma​​in.async 有时会导致 UI 冻结,我更改了使用它的方法。现在我在使用动态高度时遇到问题,当我尝试使动态高度取决于内容时,旧方法会导致错误...

OLD METHOD(innerView - 是视图的子视图)

DispatchQueue.main.async 
        view.snp.makeConstraints( (make) in
            make.top.equalToSuperview().inset(45)
            make.left.right.equalToSuperview().inset(12)
            make.bottom.equalTo(self.innerView.snp.bottom).offset(12)
        )
    
//After i add it like superView.addSubView(view)
//superView contains view, and view(dynamic height) contains innerView

新方法

superView.addSubview(view)
view.snp.makeConstraints( (make) in
            make.top.equalToSuperview().inset(45)
            make.left.right.equalToSuperview().inset(12)
            make.bottom.equalTo(self.innerView.snp.bottom).offset(12)
        )

【问题讨论】:

什么错误/崩溃? @Sh_Khan 其 SnapKit 关系错误.. 能发一下吗 @Sh_Khan 我不知道当您真的不知道 subView 约束时是否可以进行底部约束。是的...异步它会起作用,但是这样。不知道有没有可能 innerView 也包含在 superView 中吗? 【参考方案1】:

您必须在设置约束之前添加两者

superView.addSubview(view)
superView.addSubview(innerView) //  or view.addSubview(innerView) if it's nested UI
view.snp.makeConstraints( (make) in
     make.top.equalToSuperview().inset(45)
     make.left.right.equalToSuperview().inset(12)
     make.bottom.equalTo(self.innerView.snp.bottom).offset(12)
)

【讨论】:

【参考方案2】:

我发现了问题,以防万一有人需要它...添加 make.bottom.equalTo(self.innerView.snp.bottom).offset(12),在添加所有超级视图约束之后它会起作用!

【讨论】:

以上是关于Swift SnapKit 动态高度问题的主要内容,如果未能解决你的问题,请参考以下文章

SnapKit swift实现高度自适应的新浪微博布局

SnapKit - UITableView 高度不随单元格的动态内容而变化

Swift - TableViewCell 中不同大小的图像的困难

如何在 SnapKit 中设置 heightAnchor 的乘数 - swift

如何在 SnapKit 中按值增加视图高度?

如何获取 snapkit 为 UIView 声明的高度约束?