问题描述
我正在以编程方式实现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的声明中传递边界。