2014-09-11 19 views
1

我正在更新我的計算器應用程序以使用新的動態大小的按鈕,並且存在約束問題。盡我所知,包含應該工作正常,但Xcode抱怨錯誤的視圖。它給錯誤觀點提供的價值是不正確的,如果我試圖解決它們,那麼它只會導致更多的觀點被「錯位」。等寬/高度按鈕網格上的iOS約束導致位置和大小發生變化

在下面的截圖中,第一個多色行(橙色,綠色,粉紅色,黃色,紅色)是一排UILabels。它們應該都具有相同的寬度,它們和屏幕邊緣之間的間距爲0。它們位於容器視圖中(Xcode標籤是「註冊標籤視圖」,如下面的截圖所示。)註冊標籤視圖容器具有固定高度約束。

然後在下面,是另一個容器視圖(「鍵盤視圖」),裏面是一個5x8的視圖網格(我的計算器上的按鈕)。按鈕應該都具有相同的寬度,並且都具有相同的高度。在我的故事板中,它們是64x58,完全符合我的320x464鍵盤視圖。 (320/5 = 64和464/8 = 58)。

enter image description here

下面是故事板警告的屏幕截圖。注意最後兩項是動態按鈕(在鍵盤視圖中),它表示其中一個預計爲63寬,另一個預計爲65寬。這是不正確的。他們都應該是64寬,他們都有一個等寬度約束。

其中一個標籤也似​​乎有同樣的問題,其中Xcode預計其中一個是63寬,但他們應該都是64寬。

enter image description here

您可以在故事板的按鈕均能排隊不重疊(根據其幀)看到的,但是當我在模擬器中運行它,你可以看到他們一個像素相互重疊在每行上的不同的方向:

enter image description here

我設置的約束的方式:我佈置在它們全部使用它們的幀(X,Y,W,H)在故事板中,然後我選擇所有這些,並添加了如下約束:

enter image description here

enter image description here

但隨後立即抱怨說,一些項目是錯誤的。我究竟做錯了什麼?我如何才能正常工作?

+0

使用自動佈局做許多視圖可能是一個真正的痛苦。我會在代碼中使用按鈕,而不是使用約束,或者使用鍵盤的集合視圖 - 在這種情況下,所有對齊工作都將爲您完成。 – rdelmar 2014-09-11 04:59:20

+0

要確保約束正確,您必須通過一個視圖和從上到下嘗試一個視圖。當我貪心時,XCode總是抱怨。當我面對像你這樣的問題時,我總是清除所有限制並重新開始。 – Ricky 2014-09-11 05:05:18

+0

順便說一句,我看到你的故事板中看起來像一個倒退的階段;如果這就是它的原因(從右側循環到計算器視圖左側的行),這不是一件好事。 – rdelmar 2014-09-11 05:57:24

回答

1

好吧,我想通了,如何使它只約束工作。相互依賴關係太多,系統無法處理。我選擇了整個按鈕的網格,併爲其中的所有按鈕添加了「等高」和「等寬」約束,這意味着每個按鈕都依賴於其他每個按鈕。

取而代之,我一行一行地做了。我所選擇的一行:

enter image description here

我施加的相等的高度和相等的寬度限制到每個項目該行英寸然後我對第2行,第3行等做了同樣的處理。因此,每一行都只依賴於它自己。但是,這些約束不足以完全定義UI,因爲Height仍然未定義。

因此,我選擇了第一列(即每行中的第一項)並將等寬和等高限制應用於這些項目。然後,所有的約束都正常運行,我沒有收到任何錯位視圖警告。

我相信這是有效的,因爲列上的約束可以解決每行的高度,然後行可以解決它自己的寬度,而無需與任何其他行進行交互。

0

下面的少量代碼(並在故事板中設置單元格大小和最小間距)將使用集合視圖爲您提供鍵盤。

@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; 
} 

此給出以下結果,

enter image description here

+0

如果UI最終變寬(例如iPhone 6 Plus)那是否會導致額外的列顯示?看起來很奇怪,我需要將我的代碼完全重寫爲一個按需的UICollectionView,以執行某些約束似乎理想的設計。 :/ – 2014-09-11 15:59:33

+0

@KennyWyland,當然,如果您支持多個寬度屏幕,您必須考慮視圖的寬度。通過將代碼中的項目大小設置爲寬度/ 5,可以輕鬆完成此操作。我遇到了與嘗試在許多視圖上設置約束條件時遇到的問題相同的問題,所以我不會說他們是爲這個特定目的「理想」設計的。 – rdelmar 2014-09-11 16:07:18

+0

我想出了一個讓它在沒有警告的情況下工作的方法。看起來這只是太多相互關聯的約束,所以我分兩階段完成。 – 2014-09-11 16:11:15

相關問題