Динамическое добавление кнопок в CollectionView

swift

#1

Добрый день! Подскажите в каком направлении двигаться что бы получить вот такой результат.! Динамическое добавление кнопок


#2

картинка не отображается


#3

исправил перезалил снова


#4

Все аналогично работе с TableView. У вас к примеру будет массив с кол-вом кнопок для добавления. Следовательно столько ячеек ставите для секции.
Самое главное это через UICollectionFlowLayout сформировать правильно размеры и отступы ячейки.
Дальше будет как и с таблицей, наполняете ячейку готовыми данными.


#5

Выглядит как CollectionView. Через сториборды не знаю как такое сделать. А кодом вполне реально. Создаешь вьюмодель с нужным набором и генерируешь массив кнопок.


#6

Для примера


#7

Спасибо, щас начнем мучиться)


#8

Тут мучиться не нужно. Если по видео делать, пару минут.


#9

Ну да, я шучу)))))))


#10

Если вдруг понадобится узнать кол-во строк для кнопок (может пригодиться для выставления высоты CollectioView)
Int((buttonArray.count + 3) / 4)


#11

С видео все понятно, Только у меня CollectionView там идут ячейки с данными, а в этих ячейках добавляются кнопки. В виде получается, что массив просто заполняет ячейки. Вот как моем примере мне нужно. Получается ячейка с название фильма и в ней кнопки фиолетовые.


#12

Если у вас фильмы отображаются не в TableView, а в CollectionView, разницы никакой нет.
В класс вашей ячейки с фильмами добавьте еще один CollectionView для кнопок. Для этой CollectionView создайте класс, который будет наполнять ячейку кнопкой и текстом под ней. Дальше будет все как в видео.


#13

Тоже подумал? что нужно добавить второй CollectionView.


#14

Только для вложенного CollectionView нужно отключить скролл.
Высотя ячейки будет фиксированная.
Ширина ячейки высчитывается как collectionView.frame.width / 4

Примерно у вас должно выйти что-то такое

extension ViewController: UICollectionViewDelegateFlowLayout {
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.bounds.size.width / 4, height: 77)
    }
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets.zero
    }
}

И соответственно само заполнение CollectionView

extension ViewController: UICollectionViewDataSource {
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return buttonArray.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        let buttonData = buttonArray[indexpath.row]
        
        cell.button.text = buttonData.buttonText
        cell.label.text = buttonData.labelText
        
        return cell
    }
}

#15

Спасибо, признателен! Займемся


#16

Моя маленькая ошибочка. Вместо ViewController у вас будет класс чейки, т.к. это вложенная коллекция в ячейку.


#17

Подскажите направление. Столкнулся со следующим. Получаю следующее:
Зал 1 время сеансов 12-00 13-00 14-00
Зал 2 время сеансов 13-00 14-00
Зал 3 время сеансов 14-00
Как в collectionView это запихнуть так как разное количество сеансов в залах? Нужно как на картинке вверху, а то какая-то ерунда получается.


#18

Покажите массив данных свой


#19

(key: “2”, value: [ButtonStatic.FilmsShedule(hall: “2”, datatime: “11:23:00”)])
(key: “4”, value: [ButtonStatic.FilmsShedule(hall: “4”, datatime: “16:20:00”)])
(key: “1”, value: [ButtonStatic.FilmsShedule(hall: “1”, datatime: “12:45:00”), ButtonStatic.FilmsShedule(hall: “1”, datatime: “17:35:00”)])


#20

Допусти это filmArray, тогда
numberOfSections будет filmArray.count
numberOfItemsInSection будет filmArray[section].value.count