![](/img/trans.png)
[英]UICollectionViewCell rounded corners revert to square when breathed upon
[英]How to achieve transparent background or rounded corners when dragging a UICollectionViewCell
我确信一定有一种简单的方法可以做到这一点,但是到目前为止,我已经花了很长时间在各种兔子洞中没有成功。
我有一个支持拖放的集合视图。 被拖动的单元格在contentView
中有一个UIImageView
,并且图像视图的支持层应用了角半径。 单元格中所有视图的背景颜色清晰。
拖动时,单元格具有白色背景,显示在图像视图的角落周围:
有没有办法将整个可拖动视图四舍五入? 或将其背景设置为清除以使烦人的白色边框不可见?
更新
事实证明,解决方案非常简单(假设UIBezierPaths
符合您对简单的定义):
您需要覆盖UICollectionViewDragDelegate
协议的collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath)
方法,并返回带有相应UIDragPreviewParameters
集的 UIDragPreviewParameters:
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
进行硬编码 - 这适用于我的场景,因为所有单元格的大小都相同。 更复杂的集合视图需要在这里进行一些自定义计算。
我认为这甚至比这更容易。 如果你的单元格已经有一个清晰的背景和一个圆角 UIImageView,你只需要为UIDragPreviewParameters
设置backgroundColor
为.clear
。
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),
])
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.