Как изменить размер ячеек просмотра коллекции в соответствии с размером экрана устройства?

Я заметил, что ячейки всегда будут следовать определению в инспекторе размеров. Даже если я уже применил UICollectionViewDelegateFlowLayout.

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

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

Итак, как это выглядит. Но я хочу, чтобы ячейки скорее выглядели так, как на меньшем экране iphone.

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

Ответ 1

стриж

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

    let height = view.frame.size.height
    let width = view.frame.size.width
    // in case you you want the cell to be 40% of your controllers view
    return CGSize(width: width * 0.4, height: height * 0.4)
}

Цель С

- (CGSize)collectionView:(UICollectionView *)collectionView 
              layout:(UICollectionViewLayout *)collectionViewLayout 
   sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

   CGFloat height = self.view.frame.size.height;
   CGFloat width  = self.view.frame.size.width;
   // in case you you want the cell to be 40% of your controllers view
   return CGSizeMake(width * 0.4, height * 0.4);
 }

Ответ 2

Swift 4

Вы можете сделать что-то вроде этого:

class yourClassName: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: self.myCollectionView.frame.height / 6 * 5, height: self.myCollectionView.frame.height / 6 * 5)

        }


}

self.myCollectionView является ссылкой из вашего вида коллекции Item важно реализовать UICollectionViewDelegateFlowLayout

И поскольку он не будет соответствовать другой ячейке, у вас будет только одна строка.

Ответ 3

Вам следует попробовать использовать простое уравнение при настройке размера ячейки вместо номера, например:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width / 2, height: 350)
    }

деля его на 2, будет означать, что ячейка всегда будет половиной размера экрана, отнимая и вид функций MinimumLineSpacing и/или методов UIEdgeInset, которые вы вызывали. Надеюсь, это поможет.

Ответ 4

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

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                           sizeForItemAt indexPath: IndexPath) -> CGSize {
   if (screenheight < 667) {
        return CGSize(width: 155, height: 200)
    } else if (screenheight < 736) {

        return CGSize(width: 182, height: 220)

    } else {
        return CGSize(width: 200, height: 230)

    }
}

Ответ 5

В swift 3 вы можете изменить размер ячейки представления коллекции в соответствии с экраном с использованием свойства collectionViewLayout.

т.е.

   let numberOfCell = 3
   let cellSpecing = 10
   if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.itemSize = CGSize(width: (screenSize.width - (cellSpecing * (numberOfCell + 1))) / numberOfCell, height: cellHeight)
        layout.invalidateLayout()
    }

Ответ 6

В соответствии с моим опытом вы должны использовать методы UICollectionView для получения размера ячейки коллекции для конкретного устройства, как описано ниже, вы можете получить динамическую ширину и высоту ячейки представления коллекции.

// Dynamic width & height
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    float cellSize = collectionView.frame.size.width/values.count;
    return CGSizeMake(cellSize - 10, collectionView.frame.size.height);
}

//For top/bottom/left/right padding method
- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(0, 0, 0, 1);
}



- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    float width = collectionView.frame.size.width;
    float spacing = [self collectionView:collectionView layout:collectionViewLayout minimumInteritemSpacingForSectionAtIndex:section];
    int numberOfCells = (width + spacing) / (cellSize + spacing);
    int inset = (width + spacing - numberOfCells * (cellSize + spacing) ) / 2;

    return UIEdgeInsetsMake(0, inset, 0, inset);
}
- (CGFloat)collectionView:(UICollectionView *) collectionView layout:(UICollectionViewLayout *)collectionViewLayout
minimumInteritemSpacingForSectionAtIndex:(NSInteger) section
{
    return 1.0;
}

Надеюсь, это поможет вам создать свою ячейку на основе размера устройства.

Ответ 7

в Свифт 4

Вы можете просто расширить свой контроллер представления из UICollectionViewDelegateFlowLayout и реализовать этот метод:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let height = collectionView.frame.height
        let width  = collectionView.frame.width
        return CGSize(width: width, height: height)
    }

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

Ответ 8

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    let theWidth = (_screenSize.width - (15*3))/2    // it will generate 2 column 
    let theHeight = (_screenSize.height - (10*2))/3   // it will generate 3 Row 
    return CGSize(width: theWidth ,height: theHeight)
}