Я хочу установить высоту коллекции с максимальным значением последнего элемента (не прокручиваемым коллекцией / сеткой / фиксированной шириной и высотой).
Я получаю последний индекс элемента и получаю макет последнего элемента, используя collectionView.layoutAttributesForItem(at: lastIndex)
и получите maxY предмета и установите для collectionviewHeight значение maxY.
Но только симулятор SE не может найти правильный maxY последнего элемента?!
Я не знаю, почему SE simluator не может найти правильный maxY последней ячейки viewview ...
Вот мой код (полный код на github ):
class CheckListTableViewCell: UITableViewCell {
var book = Book()
@IBOutlet weak var bookNameLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
var estimateWidth = 30.0
var cellMarginSize = 3.0
override func awakeFromNib() {
super.awakeFromNib()
setCollectionView()
}
func setCollectionView(){
collectionView.register(UINib(nibName: "PageCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "PageCollectionViewCell")
self.translatesAutoresizingMaskIntoConstraints = false
if let flow = collectionView.collectionViewLayout as? UICollectionViewFlowLayout{
flow.minimumInteritemSpacing = CGFloat(self.cellMarginSize)
flow.minimumLineSpacing = CGFloat(self.cellMarginSize)
}
}
class func instanceFromNib( _ book:Book)->CheckListTableViewCell{
let cell = UINib(nibName: "CheckListTableViewCell", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! CheckListTableViewCell
cell.book = book
cell.bookNameLabel.text = book.title
cell.collectionView.reloadData()
cell.setCollectionViewHeight()
cell.selectionStyle = UITableViewCell.SelectionStyle.none
return cell
}
}
extension CheckListTableViewCell:UICollectionViewDataSource{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return book.pageList.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PageCollectionViewCell", for: indexPath) as? PageCollectionViewCell else{
return UICollectionViewCell()
}
let page = book.pageList[indexPath.row]
cell.pageNumberLabel.text = page.pageNumber
return cell
}
}
extension CheckListTableViewCell:UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = self.calculateWith()
return CGSize(width: width, height: width)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let page = book.pageList[indexPath.row]
RealmManager.shared.changeIsReadOfPage(title: book.title, pageNumber: page.pageNumber, isRead: !page.isRead)
if let cell = collectionView.cellForItem(at: indexPath) as? PageCollectionViewCell{
cell.toggle(isRead:!page.isRead)
}
}
}
extension CheckListTableViewCell{
func calculateWith() -> CGFloat {
let estimatedWidth = CGFloat(estimateWidth)
let cellCount = floor(CGFloat(collectionView.frame.size.width / estimatedWidth))
let margin = CGFloat(cellMarginSize * 2)
let width = (collectionView.frame.size.width - CGFloat(cellMarginSize) * (cellCount - 1) - margin) / cellCount
return width
}
// it is very clean & simple to set collectionview height with maxY of last collectionview cell
// But only SE Simulator maxY is not correct why????!
func setCollectionViewHeight(){
let lastIndex = IndexPath(item: book.pageList.count-1, section: 0)
if let att = collectionView.layoutAttributesForItem(at: lastIndex){
collectionViewHeight.constant = att.frame.maxY
}
}
}