2015-02-23 80 views
0

我想展示六個UIViews到一個UIViewController,但我不能讓它們在模擬器中正確顯示。有人能解釋一下在這裏使用什麼約束使它在模擬器上看起來是一樣的嗎?不能讓自動佈局

我期望的結果,如在界面生成器:

enter image description here

我目前導致:

enter image description here

我使用故事板時,Xcode 6,iOS 8的和自動佈局。

謝謝!

+0

我有一個非常類似的問題,我不能讓它與自動佈局一起工作。但事實證明,最好的解決方案(適應任何屏幕尺寸)是建立一個簡單的UICollectionView – inorganik 2015-02-23 19:05:34

+0

@inorganik我看,這是一個非常聰明的解決方案。你是如何着手填充UICollectionView的?你是用Interface Builder做的(如果可能的話),還是用代碼做的? – Erik 2015-02-23 19:07:11

+0

這很簡單。設置第一個矩形的寬度和高度,然後選擇相等的寬度和相等的高度。設置尾隨,領先,頂部和底部的約束條件,然後就可以開始了。 – Cesare 2015-02-23 19:09:09

回答

0

我有一個類似的問題,不能使它與自動佈局一起工作。原來,UICollectionView對此很完美。

對於一個2×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

返回單元格內容請確保您實現像numberOfItemsInSection UICollectionView的其他必要的委託方法。

+0

我不完全明白你的意思。我不能創建一個UICollectionViewController,用XIB創建6個不同的UICollectionViewCells並使用它們? – Erik 2015-02-23 19:30:20

+0

如果它們完全不同,則可以爲每個視圖拖出一個UICollectionViewCell,並將其放置在集合視圖控制器中,爲它們提供標識符,然後根據需要爲每個視圖添加UI元素。否則,您可以重複使用同一個集合視圖單元格,創建一個自定義單元類,並在'collectionViewCellForItemAtIndexPath'中給它不同的內容。它的工作原理與表格視圖非常相似。 – inorganik 2015-02-23 20:21:48

1

如果您只打算顯示6個視圖,則可能不需要CollectionView。您可以放置​​6個視圖並添加約束,以將角視圖固定到相應的角落。然後爲每個相鄰行/列之間的水平間距添加約束。最後,將第一個(或任何視圖)的寬度和高度約束設置爲相等。這確實意味着拖放有更多的視圖和約束,但是您不需要擔心填充collectionView數據源,並且(可能是最好的一點),您不需要編寫任何代碼。

1

這是我嘗試過的一個簡單的gif圖像。這樣做實際上很有趣。您必須確保所有寬度相等且高度相等,行中的視圖對齊頂部和底部邊緣,而列中的視圖則對齊前端和尾端。然後,如果您將相鄰視圖之間的距離和邊緣設置爲零,則全部完成。

下圖顯示了我在圖形表示中的實際含義。

enter image description here

+0

太棒了,謝謝! – Erik 2015-02-23 20:17:27

2

你不需要collectionViews,也沒有在代碼中的任何弄虛作假。這在界面構建器的AutoLayout中很容易實現。 順便說一句,約束的數量和類型很重要。您應該儘可能保持常識,以便您可以維護它,並將UI編號的合成部分的編號保持爲最小,以保持快速。因此,我的解決方案比@ k6sandeep s更簡單。

1)均勻地放好它們,通過CMD +鼠標點擊選擇所有6個圖塊並添加這些約束。

enter image description here

2)單獨選擇每個瓦片,並添加特定的約束如下所示。

enter image description here

它們具有相同的大小和「吻」彼此在各方面和主要觀點。

一旦完成,接口構建器將停止抱怨缺少約束,您將重新計算幀以使其完美。