swiftuicollectionviewuicollectionviewcelluicollectionviewlayout

uiCollectionView inside a uiCollectionViewCell is not scrolling horizontally


Hey Everyone and thank you for taking your time to view this, I am trying to make a uiCollectionView scroll horizontally within a uiCollectionViewCell, the background and elements are showing but im unable to scroll, the uiCollectionViewcontaining the uiCollectionViewCell (which contains the uiCollectionView i need to scroll horizontally) in scrolling vertically as expected. Below are the relative classes:

The uiCollectionView and its uiCollectionViewCells which contains the uiCollectionView that needs horizontal scrolling, in the collectionView method the cases that needs scrolling are Prop4 and Countries:

   lazy var collView: UICollectionView = {
        let sub = SubclassedCollectionViewCell.self
          
          let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.itemSize = CGSize(width: self.view.frame.width, height:self.view.frame.height/100)
        layout.scrollDirection = .vertical
//        layout.minimumLineSpacing = 1000
        layout.sectionInset = UIEdgeInsets(top:100, left: 0, bottom: 100, right: 0)
          print("the frame",self.view.frame)
        let view = UICollectionView(frame: CGRect(x:0, y:0, width: self.view.frame.width, height: self.view.frame.height), collectionViewLayout: layout)
          view.register(sub, forCellWithReuseIdentifier: "profInfo")
          view.backgroundColor = .clear
          view.isUserInteractionEnabled = true
          view.dataSource = self
          view.delegate = self
     
      
              return view
}()





public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let myCell = collectionView.dequeueReusableCell(withReuseIdentifier: "profInfo", for: indexPath) as! SubclassedCollectionViewCell
      myCell.isUserInteractionEnabled = true
      myCell.frame = CGRect(x: 10, y: (indexPath.row+1)*75, width: Int(self.view.frame.width) - 10, height: 50)
        myCell.backgroundColor = .clear
      let v = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
      let v2 = UIView(frame: CGRect(x: 150, y: 0, width: Int(self.view.frame.width) - 160, height: 50))
      let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
      let label2 = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
      let imageV = UIImageView(frame: CGRect(x: 0, y: 12.5, width: 25, height: 25))
      let imageV2 = UIImageView(frame: CGRect(x: 0, y: 12.5, width: 25, height: 25))
     
          label.center = CGPoint(x: 150, y: 25)
          label.textColor = .white
          label2.textColor = .white
          label2.center = CGPoint(x: 115, y: 25)
          label2.textAlignment = .center
          imageV2.center = CGPoint(x: 115, y: 25)
          label.text = prof!.arrInfo[indexPath.row].title + ":"
      print("array info", prof!.arrInfo)
      
      
      switch(prof!.arrInfo[indexPath.row].title){
       
      case "Prop1" :
          imageV.image = UIImage(named: "art.scnassets/prop1.png")?.resized(to: CGSize(width: 10, height: 10))
          label2.text = prof!.arrInfo[indexPath.row].text
          v2.addSubview(label2)
          break;
      case "DOB" :
          imageV.image = UIImage(named: "art.scnassets/DOB.png")?.resized(to: CGSize(width: 10, height: 10))
          label2.text = getDOBFormat(dateStr: prof!.arrInfo[indexPath.row].text!)
          v2.addSubview(label2)
          break;
      case "Prop3" :
          imageV.image = UIImage(named: "art.scnassets/prop3.png")?.resized(to: CGSize(width: 10, height: 10))
          imageV2.image = UIImage(named: prof!.arrInfo[indexPath.row].text!)?.resized(to: CGSize(width: 10, height: 10))
          break;
      case "Prop4" :
          imageV.image = UIImage(named: "art.scnassets/prop4.png")?.resized(to: CGSize(width: 10, height: 10))
          collectionViews[prof!.arrInfo[indexPath.row].title] = GeneralCollectionView()
          collectionViews[prof!.arrInfo[indexPath.row].title]?.type = "Images"
          collectionViews[prof!.arrInfo[indexPath.row].title]?.data = prof!.arrInfo[indexPath.row].selected
          myCell.contentView.addSubview(collectionViews[prof!.arrInfo[indexPath.row].title]!.Container)
          break;
      case "Countries" :
          imageV.image = UIImage(named: "art.scnassets/translation.png")?.resized(to: CGSize(width: 10, height: 10))
          collectionViews[prof!.arrInfo[indexPath.row].title] = GeneralCollectionView()
          collectionViews[prof!.arrInfo[indexPath.row].title]?.type = "Countries"
          collectionViews[prof!.arrInfo[indexPath.row].title]?.data = prof!.arrInfo[indexPath.row].selected
          myCell.contentView.addSubview(collectionViews[prof!.arrInfo[indexPath.row].title]!.Container)
          break;
      case "location":
          imageV.image = UIImage(named: "art.scnassets/location.png")?.resized(to: CGSize(width: 10, height: 10))
          label2.text = prof!.arrInfo[indexPath.row].text
          v2.addSubview(label2)
          break;
      default:
          break;
      }
          v.addSubview(label)
          v.addSubview(imageV)
          v2.addSubview(imageV2)
          myCell.contentView.addSubview(v)
          myCell.contentView.addSubview(v2)

        return myCell
    }

And this is the uiCollectionView that needs Horizontal scrolling and thats within the uiCollectionViewCell:

public class GeneralCollectionView:NSObject,UICollectionViewDelegate,UICollectionViewDataSource{
    
    weak var parent:AnyObject?
    var data:[String]?
    var type:String?
    
    lazy var Container: UICollectionView = {
      let sub = SubclassedCollectionViewCell.self
        
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()

        layout.itemSize = CGSize(width: 50, height:50)
        layout.scrollDirection = .horizontal
        let view = UICollectionView(frame: CGRect(x:150, y:0, width: 250, height: 50), collectionViewLayout: layout)
        view.showsHorizontalScrollIndicator = false
        view.isDirectionalLockEnabled = true
        view.isScrollEnabled = true
        view.isPagingEnabled = true
        view.isUserInteractionEnabled = true
        view.alwaysBounceHorizontal = true
        view.clipsToBounds = true
        view.translatesAutoresizingMaskIntoConstraints = false
        view.register(sub, forCellWithReuseIdentifier: "myGenCell")
        view.dataSource = self
        view.delegate = self
        view.backgroundColor = .white
        layout.sectionInset = UIEdgeInsets(top:0, left: 10, bottom: 0, right: 10)
        layout.minimumLineSpacing = 10  // space between rows
        layout.minimumInteritemSpacing = 5  // space between items in the same
        layout.itemSize = CGSize(width: 50, height: 50)
    
            return view
        }()
    
    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return data!.count
    }
    
    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let myCell = collectionView.dequeueReusableCell(withReuseIdentifier: "myGenCell", for: indexPath) as! SubclassedCollectionViewCell
        myCell.isUserInteractionEnabled = true
        if type == "Countries"{
            let country = data![indexPath.item].split(separator: "-")
            let label = UILabel()
            label.frame.size = CGSize(width: 50, height: 50)
            label.text = countryFlag(country: String(country[1]))
            label.center = CGPoint(x: 30, y: 25)
            myCell.contentView.addSubview(label)
            print(label, countryFlag(country: String(country[1])))
        } else {
            let val = data![indexPath.item]
            let imgView = UIImageView()
            imgView.frame.size = CGSize(width: 20, height: 20)
            imgView.image = UIImage(named: val)?.resized(to: CGSize(width: 25, height: 25))
            imgView.center = CGPoint(x: 30, y: 25)
            myCell.contentView.addSubview(imgView)
       
        }
               return myCell
    }
       
    
}

Solution

  • It is because v2 is added after the horizontal collection view, therefore coming on top blocking all user interactions like your scroll gestures.

    Give all your views different background colors to debug this sort of thing.

    Set isUserInteractionEnabled = false to v2 and any other view blocking your scroll gestures.

    Besides that,