从日志输出中识别并解决自动布局问题

时间:2019-04-17 09:25:11

标签: ios uicollectionview autolayout uistoryboard nslayoutconstraint

我几乎在界面构建器故事板上专门准备了一个针对多设备信息的iOS应用。我正在将带有文本或其他内容的表视图控制器用于静态表视图单元格中。

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

grid

我正在使用包含水平堆栈视图的垂直堆栈视图,所有这些视图均具有Alignment(填充):Fill和Distribution(分布):按比例填充。

如果我不减小最小字体大小,则网格在某些设备上根本不会出现,但是经过反复摆弄之后,我可以使网格以类大小出现在模拟器上。

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

"<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的后边缘。‡

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

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

我的问题是确切确定发生的位置,发生的原因以及如何有效地解决它。

2 个答案:

答案 0 :(得分:0)

在您的情节提要中,似乎UITextField的宽度设置为45作为约束。

在XCode中为Symbolic constraint添加UIViewAlertForUnsatisfiableConstraints,然后尝试调试问题。

enter image description here

答案 1 :(得分: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)
}