从日志输出中识别并修复自动布局问题

问题描述 投票:0回答:2

我正在准备一个多设备信息的iOS应用程序,几乎只在界面构建器故事板中。我正在将具有文本或其他内容的表视图控制器用于静态表视图单元格。

在特定单元格中,我想要一个文本字段网格,其行高度相同但宽度不同 - 具体取决于文本字段的长度。

grid

我正在使用包含水平堆栈视图的垂直堆栈视图,所有这些都具有对齐:填充和分布:按比例填充。

如果我没有减少最小字体大小,网格根本不会出现在某些设备上,但经过大量的摆弄后,我可以让网格出现在模拟器上的各种类型...

但是,日志显示“无法同时满足约束......”

"<NSLayoutConstraint:0x600002bde620 UITextField:0x7f92608dc200.width == 45   (active)>",
"<NSLayoutConstraint:0x600002bfe210 'fittingSizeHTarget' UIStackView:0x7f925f463d70.width == 0   (active)>",
"<NSLayoutConstraint:0x600002bd2cb0 'UISV-canvas-connection' UIStackView:0x7f925f463d70.leading == UITextField:0x7f92608dc200.leading   (active)>",
"<NSLayoutConstraint:0x600002bd2d00 'UISV-canvas-connection' H:[UITextField:0x7f926081b200]-(0)-|   (active, names: '|':UIStackView:0x7f925f463d70 )>",
"<NSLayoutConstraint:0x600002bd4be0 'UISV-spacing' H:[UITextField:0x7f92608dc200]-(0)-[UITextField:0x7f926081b200]   (active)>"

我从https://www.wtfautolayout.com了解到的意思是:

TextField1的宽度应该等于45。

StackView的宽度应该等于0。

StackView的前沿应该等于TextField1的前沿。‡

StackView的后缘应该等于TextField2的后缘。‡

TextField2的前沿应该等于TextField1的后缘。‡

后三个看起来很熟悉,但我没有安装,也找不到宽度限制(我猜这是基于内容的)。

然后日志报告打破上面列表中的第一个约束似乎是解决方案,但是另一个非常类似的日志错误后面的值略有不同 - 可能是网格中的下一行。

我的问题是确切地确定这种情况发生的原因,为什么会发生这种情况,以及如何有效地解决它。

ios uicollectionview autolayout uistoryboard nslayoutconstraint
2个回答
0
投票

看起来UITextField宽度在故事板中设置为45作为约束。

在XCode中为Symbolic constraint添加UIViewAlertForUnsatisfiableConstraints并尝试调试该问题。

enter image description here


0
投票

在评论之后,我尝试使用UICollectionView创建类似于表的网格。以下代码参考来源。与安排静态内容和依赖自动布局相比,这是一项很多工作,但如果自动布局无法提供此布局,那么我必须接受这个作为答案。

即使使用这种方法,我也遇到了网格中最后一行的问题 - Collection view grid last row appears differently despite equal widths - swift iOS。然而,如果我可以得到最后一行对齐,并且没有人建议使用约束可以使用网格,那么我将更新并接受这个答案是正确的。

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    let settings = currentContents[indexPath.item]
    let height = CGFloat(30)

    // https://stackoverflow.com/questions/54915227/uicollectionview-remove-space-between-cells-with-7-items-per-row
    var cellWidth = CGFloat()
    let availableWidth = collectionView.bounds.size.width
    print("available width", availableWidth)
    let minimumWidth = floor(availableWidth / collectionContents.cellsPerRow5)
    // let remainder = availableWidth - minimumWidth * CGFloat(cellsPerRow4)
    print("minmum width", minimumWidth)
    cellWidth = minimumWidth * settings.portion - 1
    print("cell width", cellWidth)

    return CGSize(width: cellWidth, height: height)
}
© www.soinside.com 2019 - 2024. All rights reserved.