隐藏 UICollectionViewCell 拖动预览
Hide UICollectionViewCell Drag Preview
我正在使用 UICollectionViewDragDelegate
在集合视图中实现拖放,并尝试在拖动时隐藏拖动预览
我在关注此线程后使用这行代码设法隐藏了它 Custom View for UICollectionViewCell Drag Preview:
public func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let dragItem = UIDragItem(itemProvider: NSItemProvider())
dragItem.previewProvider = {
return nil
}
}
但是拖动预览在抬起时仍然显示,唯一允许我在抬起过程中修改拖动预览的方法是
public func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
let previewParameters = UIDragPreviewParameters()
previewParameters.visiblePath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 50, height: 50), cornerRadius: 0)
previewParameters.backgroundColor = UIColor.clear
return previewParameters
}
但它只允许我设置背景颜色,不能隐藏拖动预览
我尝试的第二种方法是检查细胞状态
public override func dragStateDidChange(_ dragState: UICollectionViewCell.DragState) {
switch dragState {
case .none:
self.layer.opacity = 1
case .lifting:
self.layer.opacity = 0
case .dragging:
self.layer.opacity = 1
}
}
但它也不起作用
你们知道如何隐藏这个吗?或者至少隐藏边框和阴影也可以解决这个问题
这是提升后的单元格
终于我找到了解决方案,拖动预览实际上被命名为 _UIPlatterView
(在调试层次结构之后)并且它的子视图被命名为 _UIPortalView
在长按/抬起期间阻止单元格
作为此 post 的解决方案,只需将集合视图子类化并删除 _UIPlatterView
的子视图
How to hide shadows in UITableViewCell when cell is dragging
public class CustomCollectionView: UICollectionView {
override public func didAddSubview(_ subview: UIView) {
super.didAddSubview(subview)
if "\(type(of: subview))" == "_UIPlatterView" {
subview.subviews.forEach({ [=10=].removeFromSuperview() })
}
}
}
但这还没有结束,上面的解决方案仍然会在一秒钟内显示拖动预览,我添加这段代码来清理它
extension ExampleViewController: UICollectionViewDragDelegate {
public func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
guard let currentCell: MUICalendarCollectionViewCell = collectionView.cellForItem(at: indexPath) as? MUICalendarCollectionViewCell else { return nil }
let previewParameters = UIDragPreviewParameters()
let path = UIBezierPath(rect: CGRect.zero)
previewParameters.visiblePath = path
previewParameters.backgroundColor = MUIColor.clear
return previewParameters
}
}
我正在使用 UICollectionViewDragDelegate
在集合视图中实现拖放,并尝试在拖动时隐藏拖动预览
我在关注此线程后使用这行代码设法隐藏了它 Custom View for UICollectionViewCell Drag Preview:
public func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let dragItem = UIDragItem(itemProvider: NSItemProvider())
dragItem.previewProvider = {
return nil
}
}
但是拖动预览在抬起时仍然显示,唯一允许我在抬起过程中修改拖动预览的方法是
public func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
let previewParameters = UIDragPreviewParameters()
previewParameters.visiblePath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 50, height: 50), cornerRadius: 0)
previewParameters.backgroundColor = UIColor.clear
return previewParameters
}
但它只允许我设置背景颜色,不能隐藏拖动预览
我尝试的第二种方法是检查细胞状态
public override func dragStateDidChange(_ dragState: UICollectionViewCell.DragState) {
switch dragState {
case .none:
self.layer.opacity = 1
case .lifting:
self.layer.opacity = 0
case .dragging:
self.layer.opacity = 1
}
}
但它也不起作用
你们知道如何隐藏这个吗?或者至少隐藏边框和阴影也可以解决这个问题
这是提升后的单元格
终于我找到了解决方案,拖动预览实际上被命名为 _UIPlatterView
(在调试层次结构之后)并且它的子视图被命名为 _UIPortalView
在长按/抬起期间阻止单元格
作为此 post 的解决方案,只需将集合视图子类化并删除 _UIPlatterView
How to hide shadows in UITableViewCell when cell is dragging
public class CustomCollectionView: UICollectionView {
override public func didAddSubview(_ subview: UIView) {
super.didAddSubview(subview)
if "\(type(of: subview))" == "_UIPlatterView" {
subview.subviews.forEach({ [=10=].removeFromSuperview() })
}
}
}
但这还没有结束,上面的解决方案仍然会在一秒钟内显示拖动预览,我添加这段代码来清理它
extension ExampleViewController: UICollectionViewDragDelegate {
public func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
guard let currentCell: MUICalendarCollectionViewCell = collectionView.cellForItem(at: indexPath) as? MUICalendarCollectionViewCell else { return nil }
let previewParameters = UIDragPreviewParameters()
let path = UIBezierPath(rect: CGRect.zero)
previewParameters.visiblePath = path
previewParameters.backgroundColor = MUIColor.clear
return previewParameters
}
}