使用nib定义UICollectionViewCell

时间:2012-11-16 11:55:18

标签: iphone ios interface-builder uicollectionview uicollectionviewcell

如果我理解正确,UICollectionViewCell的内容应该放在其contentView属性中,背景应放在backgroundView中。

然而,当我将UICollectionViewCell拖到Interface Builder时,没有提及contentViewbackgroundView。如果我添加子视图,则会将整个单元格作为其父级,而不是contentViewbackgroundView

用IB定义UICollectionViewCell的正确方法是什么?

3 个答案:

答案 0 :(得分:14)

“如果我添加子视图,那些将整个单元格作为其父级,而不是contentView”

事实并非如此。如果您拖入UICollectionViewCell并向其添加UI元素,则将它们添加到内容视图中。事实上它没有出现在对象列表中并不意味着它不存在(NSBox也是如此 - 它有一个内容视图,也没有出现在IB中)。如果在collectionView:didSelectItemAtIndexPath:中,您记录了cellForItemAtIndexPath,并查看其子视图,您只找到一个,它与您通过记录cell.contentView得到的相同。如果您记录其子视图,那么您将看到您的UI元素。

现在,就背景视图而言,我认为您无法从IB访问这些内容。您可以使用带有UIView的xib文件,然后将其分配给单元格的backgroundView属性。

答案 1 :(得分:7)

由于缺少更好的选项,我正在为contentViewbackgroundView使用单独的nib文件。然后在我的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;
}

答案 2 :(得分:1)

我不确定这是否是Xcode 8的新内容,但UICollectionViewCell包含用于连接backgroundViewselectedBackgroundView的插座。

enter image description here

由于这个原因,您可以将UIView(或子类)添加到集合视图单元格中,并将其连接到其中一个出口。这样您就可以使用IB来定义它们。

enter image description here

希望这有帮助!