从笔尖创建的 UICollectionViewCell 中的奇怪 UIView

Posted

技术标签:

【中文标题】从笔尖创建的 UICollectionViewCell 中的奇怪 UIView【英文标题】:Strange UIView in a UICollectionViewCell created from nib 【发布时间】:2017-01-16 16:56:35 【问题描述】:

我的 UICollectionViewCell 子类中出现了一个奇怪的视图,具有 2 个 imageView 和 1 个按钮的简单结构。

final class ProfileImageCell:UICollectionViewCell 
    static var name: String  return "ProfileImageCell" 
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var anotherImageView: UIImageView!
    func setup(...)  ...  
    @IBAction func buttonAction(_ sender: UIButton)  ... 

在 setup() 方法中,我设置了 imageViews 并传递了一些属性。我不创建任何视图或更改自己的子视图。

然后在我的视图控制器中我像往常一样设置collectionView。

collectionView.register(UINib(nibName: ProfileImageCell.name, bundle: nil), forCellWithReuseIdentifier: ProfileImageCell.name)

ProfileImageCell.xib

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ProfileImageCell.name, for: indexPath) as! ProfileImageCell
    cell.setup(...)
    return cell

这是奇怪的事情发生的时候。我的单元格中有 4 个子视图。 即使我在调用后立即停止执行:

(lldb) po cell.subviews
▿ 4 elements
  - 0 : <UIImageView: 0x1026bac00; frame = (0 0; 375 667); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x170236dc0>>
  - 1 : <UIImageView: 0x1026bade0; frame = (263 0; 112 112); autoresize = RM+BM; layer = <CALayer: 0x170237160>>
  - 2 : <UIButton: 0x1026ba4d0; frame = (263 0; 112 112); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x170237140>>
  - 3 : <UIView: 0x102732cb0; frame = (0 0; 600 600); gestureRecognizers = <NSArray: 0x17444e430>; layer = <CALayer: 0x174238aa0>>

有人知道那个 UIView 可能来自哪里吗?它有一个奇怪的框架(单元格出现在屏幕上后不会改变),覆盖了我的所有单元格,并且没有让任何手势通过按钮。另外,非常有趣的是,为什么它有一个手势识别器?

(lldb) po cell.subviews[3].gestureRecognizers?.first?.description
▿ Optional<String>
  - some : "<UILongPressGestureRecognizer: 0x10271db10; state = Possible; view = <UIView 0x102732cb0>; target= <(action=_handleMenuGesture:, target=<Application.ProfileImageCell 0x1026ba790>)>>"

【问题讨论】:

【参考方案1】:

这是单元格的contentView - 请参阅documentation。

您的子视图应添加到contentView,而不是直接添加到当前所在的单元格中。发生这种情况是因为您的 nib 是一个普通的 UIView,它不包含 contentView 属性。

您需要做的是使用UICollectionViewCell 对象设计您的笔尖,只需将适当的对象拖到界面构建器中即可:

【讨论】:

这是有道理的。谢谢!有没有合适的方法在笔尖中设置单元格以便更好地重复使用? 是的,只需删除自动添加的模板UIView,然后从对象库中拖入一个Collection View Cell。之后,您可以更改单元格的属性并将其他对象添加到层次结构中,就像使用 UIView 一样。【参考方案2】:

使用 XIB 文件创建 UICollection 视图单元。当创建为 UIView 时,您不能将 UICollectionViewCell 拖放到 XIB 中。 New Arrival collection View Cell是一个XIB,但它的类型是UICollectionViewCell。在第二张图片中,Product Collection View Cell 也是用作 UICollectionViewCell 的 XIB,但它的类型是 UIView。两者都是以两种方式创建的。

案例1:我们的UICollectionViewCell前面没有UIView

案例2:我们的UICollectionViewCell前面有UIView

确保您的 XIB 不是 UIView。

【讨论】:

以上是关于从笔尖创建的 UICollectionViewCell 中的奇怪 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 从其父级的笔尖创建视图

在单元格中,如何定位和调整从具有自动布局的笔尖创建的视图?

视图从笔尖加载但不可见?

iOS:从笔尖加载自定义 UIView

Objective C - 从笔尖加载 UIView?

将笔尖连接到文件所有者问题