SwipeCellKit 不滑动单元格

SwipeCellKit does not swipe cell

我想为 UICollectionView 实现 UITableView 的 UISwipeActionsConfiguration。为此,我使用 SwipeCellKit - github


我的 UICollectionView 采用 SwipeCollectionViewCellDelegate 协议。并且单元格继承自 SwipeCollectionViewCell.

ViewController 与 UICollectionView

class SwipeViewController: UIViewController {

    lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.register(SwipeableCollectionViewCell.self, forCellWithReuseIdentifier: SwipeableCollectionViewCell.identifier)
        collectionView.showsVerticalScrollIndicator = false
        collectionView.contentInset = UIEdgeInsets(top: 8, left: 0, bottom: 4, right: 0)
        collectionView.backgroundColor = UIColor(white: 0.97, alpha: 1)
        collectionView.dataSource = self
        collectionView.delegate = self
        return collectionView
    }()

    var items: [String] = {
        var items = [String]()
        for i in 1 ..< 20 {
            items.append("Item \(i)")
        }
        return items
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(collectionView)
        collectionView.setConstraints(topAnchor: view.topAnchor,
                              leadingAnchor: view.leadingAnchor,
                              bottomAnchor: view.bottomAnchor,
                              trailingAnchor: view.trailingAnchor,
                              leadingConstant: 10,
                              trailingConstant: 10)
    }
}

extension SwipeViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 80)
    }
}

extension SwipeViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SwipeableCollectionViewCell.identifier, for: indexPath) as! SwipeableCollectionViewCell
        cell.backgroundColor = BackgroundColor.colors[indexPath.row]
        cell.delegate = self
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    }
}

extension SwipeViewController: SwipeCollectionViewCellDelegate {

    func collectionView(_ collectionView: UICollectionView, editActionsForItemAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
        guard orientation == .right else { return nil }

        let deleteAction = SwipeAction(style: .destructive, title: "Delete") { action, indexPath in
        }


        return [deleteAction]
    }

}

SwipeCollectionViewCell

class SwipeableCollectionViewCell: SwipeCollectionViewCell {
    override init(frame: CGRect) {
        super.init(frame: frame)

        self.addSubview(nameLabel)

        nameLabel.setConstraints(topAnchor: self.topAnchor,
                         leadingAnchor: self.leadingAnchor,
                         bottomAnchor: self.bottomAnchor,
                         trailingAnchor: self.trailingAnchor)

        self.backgroundColor = .white
    }

    static let identifier = "TaskListTableViewCell"


    private let nameLabel: UILabel = {
        let label =  UILabel()
        label.text = "Simulator user has requested new graphics quality"
        label.numberOfLines = 0
        return label
    }()


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

这样做之后,当我滑动单元格时,deleteAction 与单元格的内容重叠。

如您在屏幕截图中所见,单元格的内容与 deleteAction 文本重叠。

更新

setConstraints 将视图的 translatesAutoresizingMaskIntoConstraints 设置为 false

您必须将 nameLabel 添加到 contentView。 变化

self.addSubview(nameLabel)

nameLabel.setConstraints(topAnchor: self.topAnchor,
            leadingAnchor: self.leadingAnchor,
            bottomAnchor: self.bottomAnchor,
            trailingAnchor: self.trailingAnchor)

self.contentView.addSubview(nameLabel)

nameLabel.setConstraints(topAnchor: self.contentView.topAnchor,
            leadingAnchor: self.contentView.leadingAnchor,
            bottomAnchor: self.contentView.bottomAnchor,
            trailingAnchor: self.contentView.trailingAnchor)

结果: