【问题标题】:UICollectionView adding UICollectionCellUICollectionView 添加 UICollectionCell
【发布时间】:2013-02-17 13:29:05
【问题描述】:

当我尝试在 Interface Builder 中将 UICollectionCell 放入 UICollectionView 时,我无法以未知的原因放入它。该单元格将转到工具栏而不添加到UICollectionView

我正在使用:

  • iOS SDK 6.0
  • XCode 4.5.1
  • 我不使用情节提要

【问题讨论】:

标签: ios uicollectionview uicollectionviewcell


【解决方案1】:

如果您使用的是Xib 文件,则不能将UICollectionViewCell 直接放入UiCollectionView。它只能在故事板中。将UICollectionViewCell 添加到单独的 Xib 文件中。给出你的班级名称。然后在集合视图出现之前注册类或 xib

 [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

通常这是在viewDidLoad 中完成的。

这是自定义UICollectionViewCell 的实现,不使用Xib

 @implementation CollectionViewCell
 @synthesize imageView = _imageView;

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {

    self.backgroundColor = [UIColor whiteColor];
    self.layer.shadowColor = [UIColor blackColor].CGColor;
    self.layer.shadowRadius = 5.0f;
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);
    self.layer.shadowOpacity = 0.5f;

    // Selected background view
    UIView *backgroundView = [[UIView alloc]initWithFrame:self.bounds];
    backgroundView.layer.borderColor = [[UIColor colorWithRed:0.529 green:0.808 blue:0.922 alpha:1]CGColor];
    backgroundView.layer.borderWidth = 10.0f;
    self.selectedBackgroundView = backgroundView;

    // set content view
    CGRect frame  = CGRectMake(self.bounds.origin.x+5, self.bounds.origin.y+5, self.bounds.size.width-10, self.bounds.size.height-10);
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
    self.imageView = imageView;          
    [imageView release];
    self.imageView.contentMode = UIViewContentModeScaleAspectFill ;
    self.imageView.clipsToBounds = YES;
    [self.contentView addSubview:self.imageView];       

}
return self;
 }

【讨论】:

  • 如果您使用的是您为其分配类的 xib,您会怎么做?我有一个 UICollectionViewCell 类作为我的单元格 xib 的自定义类。我在 viewDidLoad 中用 NibName firCellWithResueIdentifier 注册 Nib(再次将 xib 链接/连接到单元类)。我可以将 xib 布局与使用我的单元格类在代码中完成的额外定制相结合吗?如果您只是注册 nib,那么直接向上的流程似乎不会在类上调用 initWithFrame。我必须在我的集合视图中注册笔尖和类吗?
  • @towpse 将 initWithFrame 替换为 Cell.m 中的 awakeFromNib。不要返回
  • @towpse NAQ 说的是对的。注册笔尖。然后进行其他自定义,使用自定义单元格的 initWithCoder 或 awakeFromNib(在 cell.m 中)
  • 感谢您的回答。似乎很奇怪,您可以将 UICollectionView 添加到自定义 XIB 但不能添加 UICollectionViewCell ...这是为什么?
【解决方案2】:

只有 StoryBoard 里面的 UICollectionView 里面有 UICollectionViewCell。 如果使用 XIB,使用 CellName.xib 创建一个新的 XIB,将 CollectionViewCell 添加到其中,指定 UICollectionView 自定义类的名称。之后使用 registerNib。

示例代码:https://github.com/lequysang/TestCollectionViewWithXIB

【讨论】:

  • @NAQ 好吧,你如何使用你的类?确保您已注册链接到类的 nib,但未调用类 initWithFrame。所以如果你不能在初始化时对你的 xib 插座做一些额外的造型。在这个例子中使用 MyCell 类有什么好处?
  • initWithFrame 在任何 Xib 单元格中都不起作用。将 IBOutlet 连接到 MyCell.h 并调用 awakeFromNib 中的其他方法。
  • 我很惊讶 Apple 没有在文档中提及这一点。我生命中的 -1 小时。
  • 知道为什么苹果允许您在自定义 XIB 中包含 UICollectionView 而不是 UICollectionViewCells 吗?
  • 在上面浪费了 3 个小时 :x
【解决方案3】:

好的。实际上有一个解决方法,如果你真的想在 interface builder 的 xib 文件中的 collectionView 中拥有单元格:

  1. 创建故事板。
  2. 从界面生成器创建 UICollectionView 和 UICollectionViewCell。
  3. 使用约束等调整 UI,使其看起来完全符合您的要求。
  4. 创建一个新的 xib 文件。
  5. 将情节提要中的所有内容复制到新的 xib 文件中。

它将完美运行。

  • 有一点要记住,第 3 步非常重要,因为在第 5 步之后,您不应该在 UICollectionView 周围拖动和移动,如果这样做,单元格将神奇地消失!除此之外,它将完美地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2015-03-12
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多