单元格在UICollectionView中通过水平滚动消失

时间:2017-05-19 22:29:53

标签: ios swift uicollectionview autolayout uikit

我一直坚持这个奇怪的问题一段时间,似乎无法弄明白。

设置

  • A UICollectionView
  • B 是A' s UICollectionViewCell s
  • C 是在用户点击B时添加为{B}的子视图的UICollectionView

    +------------------------------+
    |A                             |
    |                              |
    | +----------+    +----------+ |
    | |B         |    |B         | |
    | |----------|    |          | |
    | |          |    |          | |
    | |C         |    |          | |
    | +----------+    +----------+ |
    +------------------------------+
    

问题

将C&#39 UICollectionViewFlowLayout滚动方向属性初始化为.horizontal 并滚动浏览第二个小区 时,C'细胞正在消失。

作为奖励 C本身正在从UI消失:用户再次能够进入单元格,该单元格执行C通常删除所做的所有操作。当再次点击以正常重新显示时,在C的显示中触发的动作被触发但C仍然在视觉上无处可寻。

当滚动方向设置为.vertical时,不会发生此问题。

有没有人遇到类似的问题或任何关于这里发生了什么的线索?

提前致谢。

编辑实际实施

(B)

import UIKit

class CollectionViewCell: UICollectionViewCell {

    //...

    private let cellId = "cellId"

    private lazy var label: UILabel = {

        return CollectionViewCell._label()
    }()

    fileprivate lazy var gallery: UICollectionView = {

        return CollectionViewCell._gallery()
    }()

    //...

    override init(frame: CGRect) {
        super.init(frame: frame)

        isOpaque = true
        clipsToBounds = true
        layer.borderWidth = 1.5
        layer.cornerRadius = 8

        // ...
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func onSwitchDisplayGallery(_ isDiplaying: Bool) {

        switch isDiplaying {

        case true:

            addSubview(label)
            label.topAnchor.constraint(equalTo: topAnchor).isActive = true
            label.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
            label.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
            label.heightAnchor.constraint(equalToConstant: frame.height / 5.25).isActive = true

            gallery.register(NestedCollectionViewCell.self, forCellWithReuseIdentifier: cellId)
            gallery.delegate = self
            addSubview(gallery)
            gallery.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true
            gallery.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
            gallery.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
            gallery.heightAnchor.constraint(equalTo: heightAnchor, constant: -frame.height / 5.25).isActive = true

        case false:

            print("removed cv")
            // ...
        }
    }

    //...
}

extension CollectionViewCell: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        return gallery.frame.size
    }
}


private extension CollectionViewCell {

    class func _gallery() -> UICollectionView {

        let layout = UICollectionViewFlowLayout()

        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0
        layout.scrollDirection = .horizontal

        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)

        cv.isPagingEnabled = true
        cv.showsHorizontalScrollIndicator = false
        cv.translatesAutoresizingMaskIntoConstraints = false
        return cv
    }

    class func _label() -> UILabel {

        let label = UILabel()

        label.font = UIFont(name: "Montserrat-Regular", size: 15)
        label.textColor = .white
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }
}

(C)

import UIKit

class NestedCollectionViewCell: UICollectionViewCell {

    private let containerView = NestedCollectionViewCell._containerView()

    override init(frame: CGRect) {
        super.init(frame: frame)

        isOpaque = true
        clipsToBounds = true
        backgroundColor = .white

        addSubview(containerView)
        containerView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        containerView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        containerView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
        containerView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true

        //...
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

private extension NestedCollectionViewCell {

    class func _containerView() -> UIImageView {

        let view = UIImageView()

        view.contentMode = .scaleAspectFill
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }
}

编辑2 我试过尼克的回答here

当滚动方向设置为.vertical时,一切正常。

当它设置为.horizontal时,C显示没有单元格...

1 个答案:

答案 0 :(得分:0)

傻,傻傻的菜鸟错误。如果其他人需要像我这样的眼镜,请留在这里:)

集合视图没有水平约束......

addSubview(gallery)
gallery.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true
gallery.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true

将此更正为

addSubview(gallery)
gallery.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true
gallery.leftAnchor.constraint(equalTo: leftAnchor).isActive = true

修复它(显然)。