无法进行自动布局

时间:2015-02-23 19:02:04

标签: ios xcode storyboard interface-builder autolayout

我正在尝试在UIViewController上布置六个UIViews,但我不能让它们在模拟器中正确显示。有人可以解释一下这里使用什么约束使它在模拟器上看起来一样吗?

我想要的结果,如界面构建器中所示:

enter image description here

我目前的结果:

enter image description here

我正在使用故事板,Xcode 6,iOS 8和自动布局。

谢谢!

4 个答案:

答案 0 :(得分:2)

您不需要collectionViews,也不需要代码中的任何技巧。这在界面构建器中的AutoLayout中很容易实现。 顺便说一句,约束的数量和类型很重要。您应该尽可能地保持常识,以便您可以维护它,并将其数量保持在最小值,以便UI渲染的合成部分保持快速。因此,我的解决方案不如@ k6sandeep s复杂。

1)将它们均匀地放置,通过CMD +鼠标点击选择所有6个图块并添加这些约束。

enter image description here

2)单独选择每个图块并添加特定约束,如下所示。

enter image description here

他们有相同的尺寸和"吻"各方面和主要观点相互对立。

完成后,界面构建器将停止抱怨缺少约束,您只需重新计算帧以使其完美。

答案 1 :(得分:1)

如果您只打算显示6个视图,则可能不需要CollectionView。您可以放置​​带有约束的6个视图,以将角视图固定到相应的角。然后为每个相邻行/列之间的水平间距添加约束。最后从第一个(或任何视图)到其他视图设置相等的宽度和高度约束。这意味着拖放有更多的视图和约束,但您不必担心填充collectionView数据源和(可能是最好的位)您不需要编写任何代码。

答案 2 :(得分:1)

这是我尝试过的简单gif图像。这样做真的很有趣。您必须确保所有宽度相等且高度相等,行中的视图对齐顶部和底部边缘,而列中的视图具有对齐前缘和后缘。然后,如果将相邻视图和边缘之间的距离设置为零,则完成所有操作。

下图显示了我在图形表示中的实际含义。

enter image description here

答案 3 :(得分:0)

我遇到了类似的问题,无法使用autolayout。事实证明,UICollectionView非常适合这一点。

对于2 x 6网格:

CGFloat screenWidth = [[UIScreen mainScreen]bounds].size.width;
CGFloat screenHeight = [[UIScreen mainScreen]bounds].size.height;
CGSize collectionSize = CGSizeMake(screenWidth, screenHeight);
CGFloat cellWidth = screenWidth / 2;
CGFloat cellHeight = (screenHeight - 44) / 3; // deduct title bar
CGSize cellSize = CGSizeMake(cellWidth, cellHeight);

CGPoint collectionPoint = CGPointMake(0, 0);
CGRect collectionFrame = {collectionPoint, collectionSize};

// set up collection view flow layout
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.minimumLineSpacing = 0;
flowLayout.minimumInteritemSpacing = 0;
flowLayout.itemSize = cellSize;
flowLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);

// instantiate
self.categoryCollectionView = [[UICollectionView alloc] initWithFrame:collectionFrame collectionViewLayout:flowLayout];

然后您可以在

中返回单元格内容

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

确保实现UICollectionView的其他必要委托方法,如numberOfItemsInSection