2

我有一個簡單的UICollectionViewCell,帶有一個圖像和一個標籤。在常規尺寸的課堂上,我希望圖片處於最佳狀態,並在其下面加上標籤。這就是它看起來像在Xcode的預覽標籤:UICollectionViewCell - 針對不同大小類別的不同佈局

enter image description here

在任何其他級別大小我想圖像出現在左邊,而右邊的標籤:

enter image description here

我設置的約束是這樣的:

ImageView的有以下限制:

  • 前緣和頂約束所有-不限
  • 固定的寬度和高度的任何-不限

該標籤具有以下約束條件:

  • 尾隨約束的SuperView - 所有-任何
  • 對ImageView的最大限制 - 僅用於Regular-Regular
  • 對Superview的主要限制 - 僅適用於Regular-Regular
  • 頂部約束到上海華 - 所有,任何但是對於常規定期
  • 導致約束ImageView的不是 - 所有,任何但是對於常規定期

不是我還實施返回不同的方法根據當前的特徵集合單元尺寸:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    if (traitCollection.horizontalSizeClass == .Regular) { 
     return CGSizeMake(240, 194) 
    } 
    else { 
     return CGSizeMake(340, 128) 
    } 
    } 

細胞看起來很好的預覽,當我在iPhone上(如緊湊型普通)運行它的一切工作正常。然而,當我在iPad上運行自動佈局打破:

enter image description here

當然,我得到了一堆在調試控制檯的警告:無法同時滿足的約束。

所以,我想問題是 - 爲不同大小類別設置單元格的正確方法是什麼?

我創建了一個github上回購了demo project

謝謝!

+1

如果只支持iOS的9和更高版本,可以通過使用stackView –

回答

2

你想要做的是禁用這些限制對於常規常規尺寸類像你有,而且還改變了他們的優先< 1000(什麼即不需要)。這樣,它將使用特定大小類的更高優先級約束。

enter image description here

+0

這似乎工作,即使它有點違反直覺,你必須改變優先級,以使自動佈局使用適當的約束。是不是卸載約束對於自動佈局引擎足夠清楚的指示,我不希望它在這個特定的大小類?我會再等幾天,如果沒有更好的答案,那麼我會接受並給你一個獎勵=)謝謝! – almas

+0

@almas我想到了這一點,我的意見是約束並沒有真正被刪除。解決這個問題的方法是爲所有其他大小類別明確設置它,以便您可以禁用頂級「已安裝」複選標記。請參閱我的更新後的公共關係,只需降低優先級即可。 –

0

這可能不是最完美的解決方案,但我嘗試過去做這導致更多的痛苦與自動佈局規模類和我找到了最好的解決辦法是:

  1. 有一個單獨的筆尖每個尺寸類,然後根據需要佈置各個視圖。
  2. 對於每個尺寸類別都有單獨的CollectionViewFlowLayouts,然後在尺寸更改時在它們之間轉換。

按照此模式的單元尺寸將由collectionViewFlowlayout而不是sizeForItem...確定,你將有超過其他參數如sectionInsetminimumLineSpacing等集合視圖中改變大小的類時,往往需要不同的更多的控制。

這裏是爲我工作的代碼更改:

let cellIdentifierCompact = "CustomCellCompact" 
    let cellIdentifierRegular = "CustomCellReg" 

    lazy var compactLayout: UICollectionViewFlowLayout = { 
    let layout = UICollectionViewFlowLayout() 
    layout.itemSize = CGSizeMake(240, 194) 
    return layout 
    }() 

lazy var regLayout: UICollectionViewFlowLayout = { 
    let layout = UICollectionViewFlowLayout() 
    layout.itemSize = CGSizeMake(320, 128) 
    return layout 
    }() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let customCellNib = UINib(nibName: cellIdentifierCompact, bundle: nil) 
    self.collectionView.registerNib(customCellNib, forCellWithReuseIdentifier: cellIdentifierCompact) 

    let customCellNibReg = UINib(nibName: cellIdentifierRegular, bundle: nil) 
    self.collectionView.registerNib(customCellNibReg, forCellWithReuseIdentifier: cellIdentifierRegular) 
    self.configureLayoutForSize() 
    } 


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cellId = self.collectionView.collectionViewLayout == self.regLayout ? cellIdentifierRegular : cellIdentifierCompact 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellId, forIndexPath: indexPath) 
    return cell 
    } 

    func configureLayoutForSize(){ 
    switch self.traitCollection.horizontalSizeClass{ 
    case UIUserInterfaceSizeClass.Regular: 
     self.collectionView.setCollectionViewLayout(self.regLayout, animated: false) 
    case .Compact, .Unspecified: 
     self.collectionView.setCollectionViewLayout(self.compactLayout, animated: false) 
    } 
    } 

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    self.configureLayoutForSize() 
    self.collectionView.reloadData() 
    } 
+0

感謝這個答案@Dallas做到這一點。我相信這個問題有很多解決方法,包括你的建議。但是,我認爲有多個筆尖和流佈局是一個矯枉過正的問題,特別是對於這樣一個簡單的單元格佈局。理想情況下,我想了解我的實現有什麼問題 - 是iOS錯誤,還是代碼/筆尖中存在錯誤? – almas

相關問題