以编程方式在UICollectionViewCell中设置布局约束

时间:2015-09-03 11:11:26

标签: ios swift autolayout nslayoutconstraint visual-format-language

我有一个Collection View Cell,我正在尝试布局三个标签和一个图像。我似乎有垂直布局工作正常,但我似乎无法将水平布局变为可接受的状态 - 标签似乎并不像我想的那样工作。

基本上,垂直尺寸是固定的,但是我根据屏幕的宽度来改变单元格的水平尺寸,但通常在320左右。我希望图像处于固定位置,但UILabels则为占据图像右侧的剩余空间。

我在下面列出了我预期布局的图片:

enter image description here

对于垂直布局,我有以下内容,标签为l1到l3,图像为i1:

将图像从顶部约束为20px:

contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[i1(42)]", options: nil, metrics: nil, views: dictionaryOfViews))

要在固定的134高度单元格中垂直约束标签:

contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[l1(21)][l2(21)]-10-[l3(42)]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))

我当时希望水平标签如下:

contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-20-[i1(42)]", options: nil, metrics: nil, views: dictionaryOfViews))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-82-[l1]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-82-[l2]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-82-[l3]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))

哪个几乎有效。我必须设置以下内容以使多行标签也能表现出来:

descriptionLabel.setContentCompressionResistancePriority(0, forAxis: .Horizontal)

我遇到的问题是标签仍然显示在左边太远而且在右边留下相当大的间隙,好像宽度没有动态调整?

对于如何纠正这一点的任何想法都将非常感激。

非常感谢。

1 个答案:

答案 0 :(得分:0)

在这里想一想......你试过将标签的左侧设置在图像的右侧吗?

contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[i1]-20-[l1]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[i1]-20-[l2]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[i1]-20-[l3]-20-|", options: nil, metrics: nil, views: dictionaryOfViews))