SWIFT:如何以编程方式设置集合视图的框架大小,使其等于其父视图?

问题描述

我正在以编程方式实现collectionView:

class collectionViews {
     static func collectionViewOne() -> UICollectionView {
        let flowLayout = CarouselFlowLayout()
        let collectionViewOne = UICollectionView(frame: CGRect(x: 106,y: 313,width: 1708,height: 300),collectionViewLayout: flowLayout)
        return collectionViewOne
    }
}

我将其显示在TableView的TableViewCell内部,该TableViewCell也以编程方式实现:

class TableViewCell2: UITableViewCell {
    var moviesItems: [movieItem] = []
    let cellIdentifier = "movieCardCell"
    let collectionViewOne = collectionViews.collectionViewOne()

    private func setupCollectionView(){

        collectionViewOne.delegate = self
        collectionViewOne.dataSource = self
        collectionViewOne.backgroundColor = UIColor (hex: "444A64")
         collectionViewOne.register(UICollectionViewCell.self,forCellWithReuseIdentifier: "MyCell")
                 let nib = UINib(nibName: "movieCardCell",bundle: nil)
        collectionViewOne.register(nib,forCellWithReuseIdentifier: cellIdentifier)
 self.contentView.addSubview(collectionViewOne)

    }
}

// These functions never get called
 extension TableViewCell:  UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
 func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
     print("INSIDE TableViewCell2.collectionView 1")
     return 1
 }
 
 func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell",for: indexPath)
     print("INSIDE TableViewCell2.collectionView 2")
     return cell
 }
 
 func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeforItemAt indexPath: IndexPath) -> CGSize {
     // For some reason he chose the measures of collectionViewCell and substracted 2
     print("INSIDE TableViewCell2.collectionView 3")
     return CGSize(width: 139,height: 64)
 }
 }

我希望collectionView的尺寸框架等于TableViewCell的框架尺寸: 那么有什么可能的话我应该在这里改变什么?

 let collectionViewOne = UICollectionView(frame: CGRect(x: 106,collectionViewLayout: flowLayout)

解决方法

您可以在将集合视图约束添加到setupCollectionView()方法内的单元格后设置它:-

//#MARK:- Table view cell
 
class YourTableViewCell: UITableViewCell {
    
    var collectionView: UICollectionView!
    
    override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
        super.init(style: style,reuseIdentifier: reuseIdentifier)
        self. setupCollectionView()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
    
    func setupCollectionView() {
        
        //        Set collection view
        let layout = UICollectionViewFlowLayout()
        
        collectionView = UICollectionView(frame: CGRect.zero,collectionViewLayout: layout)
        collectionView.backgroundColor = .clear
        collectionView.register(collectionCell.self,forCellWithReuseIdentifier: "collectionCell")
        collectionView.showsVerticalScrollIndicator = false
        collectionView.showsHorizontalScrollIndicator = false
        self.contentView.addSubview(collectionView)
        collectionView.delegate = self
        collectionView.dataSource = self
        
        //Here you can set constraint for collection view
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor,constant: 0).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor,constant: 0).isActive = true
        collectionView.topAnchor.constraint(equalTo: self.contentView.topAnchor,constant: 0).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor,constant: 0).isActive = true
        
        layout.scrollDirection = .horizontal
    }
}
,

在collectionViews.collectionViewOne()中,更改为:

static func collectionViewOne(frame: CGRect) -> UICollectionView {
        let flowLayout = CarouselFlowLayout()
        let collectionViewOne = UICollectionView(frame: frame,collectionViewLayout: flowLayout)
        return collectionViewOne
    }

在TableViewCell2中,您必须进行更改

let collectionViewOne = collectionViews.collectionViewOne()

let collectionViewOne: UICollectionView!

和setupCollectionViews()内部

collectionViewOne = collectionViews.collectionViewOne(frame: bounds)

您必须将其移入此函数,因为实例属性不能在其内联声明中依赖于self,即您不能在collectionViewOne的声明中传递边界。