等宽/高button网格上的iOS约束会导致位置和大小发生变化

我正在更新我的计算器应用程序以使用新的dynamic大小的button,并有约束的问题。 包含应该正常工作,但我可以告诉,但Xcode抱怨错放的意见。 它给错误的意见的价值是不正确的,如果我试图解决它们,那么它只会导致更多的意见“错位”。

在下面的截图中,第一个多色行(橙色,绿色,粉红色,黄色,红色)是一排UILabels。 它们应该都具有相同的宽度,它们和屏幕边缘之间的间距为0。 它们在一个容器视图中(Xcode标签是“注册标签视图”,如下面的截图所示)。注册标签视图容器有一个固定的高度约束。

然后在下面,是另一个容器视图(“键盘视图”),里面是一个5×8的视图网格(我的计算器上的button)。 button应该都具有相同的宽度,并且都具有相同的高度。 在我的故事板中,它们是64×58,完全符合我的320×464键盘视图。 (320/5 = 64和464/8 = 58)。

在这里输入图像说明

以下是故事板警告的屏幕截图。 注意最后两个项目是dynamicbutton(在键盘视图中),它表示其中一个预期为63宽,另一个预计为65宽。 这是不正确的。 他们都应该是64宽,他们都有一个等宽度约束。

其中一个标签似乎也有同样的问题,Xcode希望其中一个是63宽,但他们应该都是64宽。

在这里输入图像说明

你可以在故事板中看到所有的button都很好地排列在一起(基于它们的框架),但是当我在模拟器中运行它时,可以看到它们在每一行上以不同的方向相互重叠一个像素:

在这里输入图像说明

我设置约束的方式是:我使用框架(x,y,w,h)将它们全部安排在故事板中,然后我将它们全部选中,并添加如下约束条件:

在这里输入图像说明

在这里输入图像说明

但是,它立即抱怨说有几个项目放错了位置。 我究竟做错了什么? 我怎样才能使这项工作正常?

好吧,我想出了如何使它只与约束一起工作。 相互依赖关系太多,系统无法处理。 我select了整个button的网格,并在它们中间添加了“等高”和“等宽”约束,这意味着每个button都依赖于其他每个button。

相反,我一行一行地做了。 我选了一行:

在这里输入图像说明

我将等高和等宽限制应用于该行中的每个项目。 然后我对第二行,第三行等也做了同样的事情,所以每一行都只依赖于它自己。 然而,这些约束不足以完全定义UI,因为Height仍然是未定义的。

那么,我select了第一列(即每行的第一项),并将等宽和等高限制应用于这些项目。 然后所有的约束performance正常,我没有收到任何错位的警告。

我相信这是有效的,因为列上的约束可以解决每行的高度,然后行可以解决它自己的宽度,而无需与任何其他行进行交互。

下面的less量代码(并设置故事板中的单元格大小和最小间距)将使用集合视图为您提供键盘。

@interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> @end @implementation ViewController -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 40; } -(UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; cell.contentView.backgroundColor = (indexPath.row % 2 == 0)? [UIColor colorWithRed:180/255.0 green:210/255.0 blue:254/255.0 alpha:1] : [UIColor colorWithRed:50/255.0 green:167/255.0 blue:85/255.0 alpha:1]; return cell; } 

这给出了以下结果,

在这里输入图像说明