Установите размер коллекции. (функция sizeForItemAtIndexPath не работает) Swift 3
У меня есть tableView
, и в каждом tableViewCell
есть collectionView
.
Я пытаюсь изменить размер collectionView с помощью этого кода:
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
if collectionView.tag == 2{
return CGSize(width: 100, height: 100)
}else if collectionView.tag == 4 {
return CGSize(width: 222, height: 200)
}else{
return CGSize(width: 10, height: 10)
}
}
Проблема в том, что ошибки нет, но ячейки не меняют размеры
Если вам нужно что-то узнать, просто напишите комментарий.
Спасибо.
Ответы
Ответ 1
Итак, это мой код прямо сейчас, и он работает:
collectionView.delegate = dataSourceDelegate
collectionView.dataSource = dataSourceDelegate
collectionView.tag = row
collectionView.setContentOffset(collectionView.contentOffset, animated:false)
collectionView.reloadData()
collectionView.register(UINib(nibName: "eventsCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "eventsCollectionViewCell")
if row == 2{
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: 120, height: 120)
layout.scrollDirection = .horizontal
collectionView.collectionViewLayout = layout
}else if row == 4 {
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: 222, height: 200)
layout.scrollDirection = .horizontal
collectionView.collectionViewLayout = layout
}else{
print("else")
}
Ответ 2
Подпись для этого метода изменилась в Swift 3 до:
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// your code here
}
Обратите внимание на тонкую разницу: (_ collectionView: ...
вместо (collectionView: ...
.
Это связано с тем, что в Swift 3 вы должны явно указать метку первого параметра. Вы можете переопределить это поведение по умолчанию, добавив символ подчеркивания _
.
Кроме того, убедитесь, что ваш класс использует протоколы UICollectionViewDelegate
и UICollectionViewDelegateFlowLayout
class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
// your code here
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// your code here
}
}
Обратитесь к этой ссылке, чтобы узнать больше об изменениях в Swift 3.
Ответ 3
Вам нужно указать, что вы реализуете протокол UICollectionViewDelegateFlowLayout в своем объявлении класса.
class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Ответ 4
Краткая версия:
Попробуйте добавить
collectionView.delegate = dataSource
Более длинная версия:
Для меня это была небольшая ошибка -
collectionView.dataSource = self
Это вызовет эти методы
func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
Однако НЕ вызов
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize
Потому что это не часть UICollectionView dataSource. Это часть делегата UICollectionView.
Итак, добавив следующее, я решил проблему.
collectionView.delegate = dataSource
Ответ 5
У меня была такая же проблема! Если вы сделаете размер половиной ширины (ширина/2), то он по-прежнему будет выглядеть как вся ширина, потому что добавление добавляется к ширине /2.
Исправлено: Убедитесь, что вставки разделов в Storyboard равны 0. В качестве альтернативы отрегулируйте ширину /2 до размера, ВКЛЮЧАЯ вставки раздела.
Мне понадобилось некоторое время, чтобы исправить это: -)