0

我正在使用 UIContextMenuConfiguration 对集合视图单元格进行操作。一切都按预期工作,但是如果我的单元格从笔尖(取消)激活了约束,它会在长按时刷新。

为了演示这个问题,我创建了一个新项目,collectionView在情节提要中有一个。集合视图中的自定义单元格有一个带有两个约束的标签,一个约束将其固定在单元格的底部(最初是活动的),另一个将其对齐在中心(最初是禁用的)。

这是我的代码,

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
        cell.configure()
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
        return UIContextMenuConfiguration.init(identifier: nil, previewProvider: nil) { (array) -> UIMenu? in
            return UIMenu(title: "Hello", image: nil, identifier: nil, options: .destructive, children: [UIAction(title: "Share", image: UIImage(systemName: "tray.and.arrow.up"), identifier: nil) { _ in
                print("HelloWorld!")
              }])
        }
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 265, height: 128)
    }
}

class CollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var bottomConstraint: NSLayoutConstraint!
    @IBOutlet weak var centerConstraint: NSLayoutConstraint!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    func configure() {
        bottomConstraint.isActive = false
        centerConstraint.isActive = true
    }
}

初始状态 上下文菜单演示 上下文菜单解除后

4

1 回答 1

1

该问题似乎与以下直接相关:

  • 在 Storyboard 中创建的两个约束相互冲突
  • 将一个约束设置为未安装
  • 停用安装的约束并激活安装的约束

当初始化UIContextMenuConfigurationpreviewProvider: nil——告诉 UIKit自动生成预览视图——约束的“已安装”状态被重置。

解决它的一种方法:

不要将中心约束标记为“未安装”,而是将其优先级设为 998,并将底部约束的优先级设为 999(这将防止 IB 抱怨)。

然后,您可以将您的configure()功能保持为:

func configure() {
    bottomConstraint.isActive = false
    centerConstraint.isActive = true
}

并且标签的 centerY 约束将在单元格和上下文菜单的预览中保持活动状态。

但是,如果您希望previewView看起来与单元格不同,那么您最好的选择(并且可能是一个更好的方法开始)是使用自定义previewProvider.

于 2021-04-01T14:00:12.100 回答