2013-10-14 51 views
2

我有一個UICollectionViewController它生成具有隨機顏色的單元格用於測試目的。現在UICollectionViewController已嵌入UIScrollView中,我希望scrollView的大小與它的contentSize相同。UICollectionView不會調用intrinsic內容尺寸

我做了一個UICollectionView的子類,實現intrinsicContentSize方法,並將UICollectionView的類設置爲IB中的我的自定義類。但intrinsicContentSize永遠不會被調用。我有一個UITableView完全相同的設置,它的工作原理非常完美。

對此的任何想法?

- (CGSize)intrinsicContentSize { 
    [self layoutIfNeeded]; 
    return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height); 
} 
+0

您是否在IB中設置了任何約束條件? –

回答

1

我不知道爲什麼會發生這種情況。這是解決這個問題的另一種方法。在UICollectionView對象上設置高度約束。然後將其constant設置爲等於self.collectionView.contentSize.height。我在我的應用中使用了類似的方法,但我得到UITextView而不是UICollectionView

更新:我已經找到一種方法來做到這一點與intrinsicContentSizeUITextView in UIScrollView using auto layout

+0

這就是我現在使用的解決方法。但無論如何,我認爲這將是一種'乾淨'的方式來使用'intrinsicContentSize'。如果有人有想法,我會等待,否則我會接受你的答案。 –

+0

@ BenLime:我剛剛在我的項目中工作。你可以看到當你在IB中設置固有尺寸到'Placeholder'時會發生什麼:http://dl.dropboxusercontent.com/u/5184129/Screenshots/4p0p.png? –

+0

仍然沒有運氣。在一個額外的項目中試用了佔位符,但我遇到了同樣的問題。你還做了什麼? –

6

正確的答案是做這樣的事情

- (CGSize)intrinsicContentSize 
{ 
    return self.collectionViewLayout.collectionViewContentSize; 
} 

並調用-invalidateContentSize每當你覺得它需要改變(例如在reloadData之後)。

在Interface Builder中,您可能需要設置佔位符固有尺寸約束以避免錯誤。

這是繼承和-intrinsicContentSize壓倒一切有用的,如果你想長大的集合視圖的框架,直到它是由兄弟姐妹或父母視圖

0

使用這個類進行UICollectionView更新其內在含量的大小,每次制約內容被改變。

class AutosizedCollectionView: UICollectionView { 
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { 
     super.init(frame: frame, collectionViewLayout: layout) 
     registerObserver() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     registerObserver() 
    } 

    deinit { 
     unregisterObserver() 
    } 

    override var intrinsicContentSize: CGSize { 
     return contentSize 
    } 

    private func registerObserver() { 
     addObserver(self, forKeyPath: #keyPath(UICollectionView.contentSize), options: [], context: nil) 
    } 

    private func unregisterObserver() { 
     removeObserver(self, forKeyPath: #keyPath(UICollectionView.contentSize)) 
    } 

    override func observeValue(forKeyPath keyPath: String?, 
           of object: Any?, 
           change: [NSKeyValueChangeKey : Any]?, 
           context: UnsafeMutableRawPointer?) 
    { 
     if keyPath == #keyPath(UICollectionView.contentSize) { 
      invalidateIntrinsicContentSize() 
     } 
    } 
} 

雖然,你應該明白,如果你將它嵌入到另一個滾動視圖中,單元格回收將無法工作。處理嵌套收集視圖的最佳方式描述如下here

相關問題