11

如果我理解正確,UICollectionViewCell的內容應該在其contentView屬性中,背景的內容應該屬於backgroundView用筆尖定義UICollectionViewCell

但是,當我將UICollectionViewCell拖到Interface Builder時,沒有提及contentViewbackgroundView。如果我添加子視圖,這些子視圖將以整個單元格作爲其父項,而不是contentViewbackgroundView

用IB定義UICollectionViewCell的正確方法是什麼?

回答

14

「如果我添加子視圖,那些將整個小區作爲其母公司,而不是內容查看」

這是不正確的。如果拖入UICollectionViewCell並添加UI元素,則將它們添加到內容視圖中。它沒有出現在對象列表中的事實並不意味着它不存在(對於NSBox也是如此 - 它有一個內容視圖,它不會在IB中顯示)。如果在collectionView:didSelectItemAtIndexPath:中,您記錄cellForItemAtIndexPath,並查看其子視圖,您只能找到一個,並且它是通過記錄cell.contentView獲得的同一個。如果你記錄它的子視圖,那麼你會看到你的UI元素。

現在,就背景來看,我不認爲這是你可以從IB獲取的東西。您可以使用UIView創建一個xib文件,然後將其分配給單元格的backgroundView屬性。

+2

半真。我曾嘗試過,並沒有奏效。但是,我拖動了一個UIView並將其類型更改爲UICollectionViewCell子類。它只適用於你所說的話:從庫中拖出一個UIColllectionViewCell,然後改變類型。非常哈克。 – hpique

+1

@hpique,在繼承它之前,您必須從正確類型的對象開始。通過從UICollectionViewCell開始,您將獲得其所有的默認屬性和數據,而您將無法使用UIView獲得這些屬性和數據 - 對此無關緊要。 – rdelmar

+0

這很糟糕,因爲'contentView'是隱含的。由於我看不到它,我不知道如果沒有反覆試驗,從一種類型或另一種類型開始就會產生差異。 – hpique

7

對於缺少更好的選項,我使用contentViewbackgroundView單獨的筆尖文件。然後在我的UICollectionViewCell子類:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSArray *contentViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellContentView" owner:self options:nil]; 
     [self.contentView addSubview:contentViewNib[0]]; 
     NSArray *backgroundViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellBackgroundView" owner:self options:nil]; 
     self.backgroundView = backgroundViewNib[0]; 
    } 
    return self; 
} 
+0

所以你只註冊你的類與集合視圖,然後加載你的xib在單元類的initWithFrame? – topwik

+0

然後你可以通過代碼訪問你在xib上設置的任何出口嗎? – topwik

+1

這樣做,據我目前所知,只有當你不打算改變這些xib的任何內容時才這樣做。你會不會有動態的內容,標籤或文本字段在那些xib中改變每個單元? – topwik

0

我不確定這是否是Xcode 8的新增功能,但UICollectionViewCell包含連接backgroundViewselectedBackgroundView的插座。

enter image description here

多虧了這一點,你可以在UIView(或子類)添加到您的收藏觀察室,並將其連接到插座中的任何一個。這樣你就可以使用IB來定義它們。

enter image description here

希望這有助於!