Динамический UICollectionView в UIViewController

Я разработчик android и разрабатываю свое первое iOSприложение, мне нужно реализовать GridView, чтобы добавить какой-то социальный значок, поэтому после некоторого поиска я нашелUICollectionView, но он не работает, как ожидалось. Как установить динамическую высоту представления UICollection? На самом деле я хочу отобразить все значки, но он показывает только строку и другие после прокрутки UICollectionView.

ниже приведен пример:
Это то, что я получаю

Введите описание изображения здесь

Это то, чего я хочу:

Введите описание изображения здесь

Я использую ниже код:

import UIKit

class CollectionViewDemo: UIViewController, UICollectionViewDelegate,    UICollectionViewDataSource {

@IBOutlet weak var socialHandleCollection: UICollectionView!


@IBOutlet weak var socialImageView: UIImageView!

var socialHandleArray:[String] = ["Facebook", "Twitter", "Youtube","Vimeo", "Instagram", "Custom URL", "Linkedin", "pinterest"]


override func viewDidLoad() {

    self.socialHandleCollection.delegate = self
    self.socialHandleCollection.dataSource = self

  //  socialHandleCollection.frame.size.height = 130
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return socialHandleArray.count
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell: colvwCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! colvwCell

    cell.imgCell.image = UIImage(named: "demo_img.png")

    return cell
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        print(self.socialHandleArray[indexPath.row])
 }
}

Любая помощь будет оценена.

1 ответ

  1. Предполагая, что вы используете autoLayout

    Первоначально объявите желаемое количество столбцов

    let numberOfColumns = 5
    

    Итак, сначала самое главное. Вы должны будете сделать так, чтобы ваш класс соответствовал UICollectionViewDelegateFlowLayout. Теперь реализуем функцию —

    func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            sizeForItemAt indexPath: IndexPath) -> CGSize{
    
            return CGSize(width: collectionView.bounds.size.width/numberOfColumns, height: collectionView.bounds.size.width/numberOfColumns);
    }
    

    Здесь 5 может быть изменено на количество столбцов, которое вы хотите в каждой строке, и передача того же значения высоты гарантирует, что форма всегда квадратная. И, следовательно, вы можете применить радиус угла, чтобы сделать его круговым.

    Теперь двигаемся дальше. В построителе интерфейса нажмите ctrl + click и перетащите UICollectionViewограничение высоты UIViewController(аналогично тому, как вы сделали бы для AUIView, но делаете это для ограничения)

    Теперь, когда вы знаете количество элементов, которые вам нужно отобразить внутри вашего UICollectionView, Вы можете сделать что-то вроде:

    //replace 5 with the number of columns you want
    //array contains the items you wish to display
    func figureOutHeight(){
    
        if(array.count == 0){
             //as no items to display in collection view
             return
        }
    
        //ceil function is just to round off the value to the next one, for example 6/5 will return 1 but we need 2 in this case. Ensure all arguments inside ceil function are float 
        let rowsCount = ceil(Float(array.count)/Float(numberOfColumns))
    
        //now you have number of rows soo just update your height constraint by multiplying row count with height of each item inside UICollectionView
        collectionViewHeightConstraint.constant = rowsCount * collectionView.bounds.size.height / numberOfColumns;
    
        view.layoutIfNeeded()
    }
    

    Также если вы не изменили направление прокрутки на вертикальное.