6

我确信一定有一种简单的方法可以做到这一点,但是到目前为止,我已经花了很长时间在各种兔子洞中没有成功。

我有一个支持拖放的集合视图。被拖动的单元格UIImageView在 中contentView,并且图像视图的支持层应用了圆角半径。单元格中所有视图的背景颜色清晰。

拖动时,单元格具有白色背景,显示在图像视图的角落周围:

拖动单元格时出现白色背景

有没有办法将整个可拖动视图四舍五入?或将其背景设置为清除以使烦人的白色边框不可见?

更新

事实证明,解决方案非常简单(假设UIBezierPaths符合您对简单的定义):

您需要覆盖协议的collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath)方法UICollectionViewDragDelegate,并返回 UIDragPreviewParameters相应的 UIBezierPath 集:

func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
    let previewParams = UIDragPreviewParameters()

    let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 140, height: 140), cornerRadius: 20)
    previewParams.visiblePath = path

    return previewParams
}

这是一个幼稚的实现,CGRect它对派生贝塞尔路径的硬编码 - 这适用于我的场景,因为所有单元格的大小都相同。更复杂的集合视图需要在这里进行一些自定义计算。

在此处输入图像描述

4

1 回答 1

0

我认为这甚至比这更容易。如果你的单元格已经有一个清晰的背景和一个圆形的 UIImageView ,你只需要设置backgroundColor.clear.UIDragPreviewParameters

func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
  let params = UIDragPreviewParameters()
  params.backgroundColor = .clear
  return params
}

编辑:根据要求,这是单元格的精简版本

final class MyCell: UICollectionViewCell {
  // MARK: Constants

  private enum Constants {
    static let cornerRadius = CGFloat(8)
  }

  // MARK: Views

  private let imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFill
    imageView.layer.masksToBounds = true
    imageView.layer.cornerRadius = Constants.cornerRadius
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
  }()

  // MARK: Lifecycle

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

  required init?(coder: NSCoder) {
    super.init(coder: coder)
    setup()
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    imageView.image = nil
  }

  // MARK: Public

  func update(with image: UIImage) {
    imageView.image = image
  }

  // MARK: Private

  private func setup() {
    contentView.backgroundColor = .clear

    contentView.addSubview(imageView)

    NSLayoutConstraint.activate([
      imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
      imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
      imageView.topAnchor.constraint(equalTo: contentView.topAnchor),
      imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
    ])
  }
}
于 2020-10-14T20:32:57.207 回答