Swift - Как настроить соотношение UICollectionViewCell для разных размеров устройств IOS - PullRequest
0 голосов
/ 08 февраля 2019

Я использую CollectionView в качестве строки меню в нижней части моего ViewController. Я создал пользовательский класс и создал 5 равномерно расположенных ячеек, которые заполняют весь CollectionView на iPhone 8 с помощьюследующее, что является желаемым результатом -

    layout.itemSize = CGSize(width: self.frame.width / 5, height: self.frame.height)
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0

    self.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    self.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    self.collectionViewLayout = layout;

Однако, когда я запускаю проект на любом iPhone с большим экраном, я получаю следующий результат:

collectionview

У меня вопрос: как я могу масштабировать ячейки, чтобы они соответствовали без полей, даже если для увеличения высоты требуется CollectionView, я бы хотел, чтобы изображения (которые будут помещены в ячейки) сохранялись.их соотношение сторон экрана iPhone 8.

Могу ли я просто увеличить размер каждого CollectionViewCell с помощью кода?Если да, то есть ли способ сделать это без определения ширины / высоты каждого iPhone, выпущенного на сегодняшний день?

Или кто-то может порекомендовать другой способ сделать это?если я подхожу к этому неправильно.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

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

class HomeViewController: UIViewController,UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {


@IBOutlet weak var homeCollectionView: UICollectionView!


override func viewDidLoad() {
    super.viewDidLoad()

    homeCollectionView.delegate = self;
    homeCollectionView.dataSource = self;
    homeCollectionView.reloadData()
}


//MARK:- COLLECTION VIEW
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 3
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
    if let count = myArray.count{
            return count
    }
    return 0
}

func collectionView(_ collectionView: UICollectionView,
                    viewForSupplementaryElementOfKind kind: String,
                    at indexPath: IndexPath) -> UICollectionReusableView {

    switch kind {
    case UICollectionElementKindSectionHeader:
        let headerView = homeCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HomeHeaderCell", for: indexPath) as! HomeHeaderCell
        headerView.UpdateHeaderCell(indexPath: indexPath)
        headerView.btn_SeeAll.addTarget(self, action: #selector(SeeAllDestinations), for: .touchUpInside)
        return headerView
    case UICollectionElementKindSectionFooter:
        let footerView = homeCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HomeFooterCell", for: indexPath) as! HomeFooterCell
        return footerView
    default:
        return UICollectionReusableView()
    }
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width: collectionView.frame.width, height: 80)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
    return CGSize(width: collectionView.frame.width, height: 10)
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
     let myCell:HomeTopDestinationsCell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeTopDestinationsCell", for: indexPath) as! HomeTopDestinationsCell
        myCell.backgroundColor = UIColor.colorFromCode(0xf1f1f1)
        myCell.UpdateCellValue(obj:(myArray[indexPath.row])!)
        return myCell as HomeTopDestinationsCell;
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        }

//Use for size
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {

            if DeviceType.IS_IPAD{
            return CGSize(width: (self.view.frame.width-60)/3 , height: (self.view.frame.width-60)/3);
        }
        return CGSize(width: (self.view.frame.width-60)/2 , height: (self.view.frame.width-60)/2);
}
//Use for interspacing
func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 10.0
}

func collectionView(_ collectionView: UICollectionView, layout
    collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 10.0
}
}
0 голосов
/ 08 февраля 2019

Кажется, что ширина представления неверна в месте, где вы поместили линию

layout.itemSize = CGSize(width: self.frame.width / 5, height: self.frame.height)

, поэтому замените ее на

layout.itemSize = CGSize(width: UIScreen.main.bounds.width / 5, height: self.frame.height)

, которую вы также можете реализовать

func collectionView(_ collectionView: UICollectionView, 
                  layout collectionViewLayout: UICollectionViewLayout, 
           sizeForItemAt indexPath: IndexPath) -> CGSize

в соответствии с UICollectionViewDelegateFlowLayout

...