UICollectionView 不响应触摸

UICollectionView Not Responding to Touch

我正在尝试以编程方式从自定义 class 中绘制我的 CollectionView,子 class 是 UIView。该应用程序加载没有错误,并且 CollectionView 正在正确绘制,因为我可以看到单元格项,但 CollectionView 不响应触摸。当我尝试滚动时没有任何反应。

我使用 Xcode 中的 Debug View Hierarchy 按钮检查了 ViewController 以查看顶部是否可能有视图。没有,我可以清楚地看到单独绘制的单元格。

Class:

class DrawUI_mainCollectionView : UIView, UICollectionViewDelegate, UICollectionViewDataSource {
            
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    var collectionView : UICollectionView?
    
    private func setup() {
        
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        layout.itemSize = CGSize(width: CGFloat(kScreenWidth),height: 137)
        
        let offset = 120.0
        let collectionViewFrame = CGRect(x: 0, y: offset, width: Double(kScreenWidth), height: Double(kScreenHeight))
        self.collectionView = UICollectionView(frame: collectionViewFrame, collectionViewLayout: layout)
        self.collectionView!.alwaysBounceVertical = true
        self.collectionView!.delegate = self
        self.collectionView!.dataSource = self
        self.collectionView!.register(UINib(nibName: "MealCategoryCell", bundle:Bundle.main), forCellWithReuseIdentifier: "cell")
        self.addSubview(self.collectionView!)
    }
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MealCategoryCell
        cell.label.text = "test"
        cell.textDescription.text = "textDescription"
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: kScreenWidth, height: 137)
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("cell \(indexPath.row)")
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("no storyboard...")
    }
}

我是如何在 ViewController

上实施它的
let collectionView = DrawUI_mainCollectionView()
self.view.addSubview(collectionView)

我做错了什么?提前致谢。

我认为你的主要问题是没有使用自动布局,如果你要为项目添加自动布局:

  • 包含 viewController
  • 中的 collectionView 的视图
  • 视图中的collectionView

它应该工作,实施:

在ViewController中:

   let collectionView = DrawUI_mainCollectionView()
   collectionView.translatesAutoresizingMaskIntoConstraints = false
   self.view.addSubview(collectionView)
   
   NSLayoutConstraint(item: collectionView , attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leadingMargin, multiplier: 1.0, constant: 0.0).isActive = true
   NSLayoutConstraint(item: collectionView , attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailingMargin, multiplier: 1.0, constant: 0.0).isActive = true
   NSLayoutConstraint(item: collectionView , attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .topMargin, multiplier: 1.0, constant: 0.0).isActive = true
   NSLayoutConstraint(item: collectionView , attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottomMargin, multiplier: 1.0, constant: 0.0).isActive = true

视图内部:

private func setup() {
    
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical
    layout.itemSize = CGSize(width: CGFloat(kScreenWidth),height: 137)
    
    let offset = 120.0
    let collectionViewFrame = CGRect(x: 0, y: offset, width: Double(kScreenWidth), height: Double(kScreenHeight))
    self.collectionView = UICollectionView(frame: collectionViewFrame, collectionViewLayout: layout)
    self.collectionView!.alwaysBounceVertical = true
    self.collectionView!.delegate = self
    self.collectionView!.dataSource = self
    self.collectionView!.register(UINib(nibName: "MealCategoryCell", bundle:Bundle.main), forCellWithReuseIdentifier: "cell")
    self.collectionView!.translatesAutoresizingMaskIntoConstraints  = false
    self.addSubview(self.collectionView!)
   NSLayoutConstraint(item: collectionView , attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leadingMargin, multiplier: 1.0, constant: 0.0).isActive = true
   NSLayoutConstraint(item: collectionView , attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailingMargin, multiplier: 1.0, constant: 0.0).isActive = true
   NSLayoutConstraint(item: collectionView , attribute: .top, relatedBy: .equal, toItem: self, attribute: .topMargin, multiplier: 1.0, constant: 0.0).isActive = true
   NSLayoutConstraint(item: collectionView , attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottomMargin, multiplier: 1.0, constant: 0.0).isActive = true
}