2016-10-13 1 views
17

У меня есть tableView и в каждом tableViewCell есть collectionView.Set коллекцияView размер. (функция sizeForItemAtIndexPath не работает) Swift 3

Я пытаюсь изменить размер 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) 
    } 

} 

Проблема заключается в том, что нет никакой ошибки, но клетки не изменяют размеры

Если вам нужно знать что-то больше, просто написать комментарий.

спасибо.

ответ

2

Так Это мой код прямо сейчас, и это работает :

 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") 
     } 
51

Сигнатура этого метода изменилось в Swift 3 к:

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        sizeForItemAt indexPath: IndexPath) -> CGSize { 
    // your code here 
} 

Обратите внимание на тонкое различие: (_ collectionView: ... вместо (collectionView: ....

Это потому, что в Swift 3 вам необходимо явно указать метку первого параметра. Вы можете переопределить это поведение по умолчанию, добавив символ подчеркивания _.

Кроме того, убедитесь, что ваш класс принимает как UICollectionViewDelegateUICollectionViewDelegateFlowLayout и протоколы

class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate { 

    // your code here 

    func collectionView(_ collectionView: UICollectionView, 
       layout collectionViewLayout: UICollectionViewLayout, 
       sizeForItemAt indexPath: IndexPath) -> CGSize { 
     // your code here 
    } 
} 

Обратитесь к this link, чтобы узнать больше об изменениях в Swift 3.

+0

Я обновил свой код, но это не меняет размер ячейки:/ –

+12

надстройку «UICollectionViewDelegateFlowLayout» в delgate вызова –

+3

Это правильный ответ. Спасибо вам большое за это! UICollectionViewDelegateFlowLayout - это ключ – RanLearns

12

Необходимо указать, что вы реализуете протокол UICollectionViewDelegateFlowLayout в объявлении класса ция.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout 
1

Короткая версия:

Попробуйте добавить

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 

Потому что это не является частью DataSource UICollectionView «s. Это часть делегата UICollectionView.

Итак, добавив следующее, разрешили мою проблему.

collectionView.delegate = dataSource 
+0

Что это переменная !? "источник данных" – Alfi

0

У меня была такая же проблема! Если вы сделаете размер половиной ширины (ширина/2), то он по-прежнему будет выглядеть как вся ширина, потому что добавление добавляется к ширине/2.

Fix: Убедитесь, что вставки разделов в Storyboard равны 0. В качестве альтернативы отрегулируйте ширину/2 до размера, ВКЛЮЧАЯ вставки раздела.

Это мне потребовалось некоторое время, чтобы исправить это один ;-)