Подтвердить что ты не робот

Отображать только два столбца с несколькими строками в CollectionView с помощью раскадровки

Я хочу отображать только две ячейки в строке, независимо от размера экрана iPhone. Подобно, Требуется конечный результат

В моей раскадровке есть UICollectionView, связанный ограничениями.

Предварительный просмотр раскадровки

Настройки раскадровки для UICollectionView есть, введите описание изображения здесь

Теперь, когда я запускаю это в 6, 5 или ниже, в строке появляется только одна ячейка. Код, который я использовал,

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [categoryImages count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    homePageCells *cell = (homePageCells *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cells" forIndexPath:indexPath];
    cell.categoryName.text = [categoryNames objectAtIndex:indexPath.row];

    return cell;
}

Я попытался определить размер экрана и программно присвоить размер ячейки с помощью кода,

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


    CGSize result = [[UIScreen mainScreen] bounds].size;
    NSLog(@"%f",result.height);
    if(result.height == 480)
    {
        //Load 3.5 inch xib
        sizes =CGSizeMake(170.f, 170.f);
        NSLog(@"3gs");
    }
    else if(result.height == 568)
    {
        //Load 4 inch xib
        sizes =CGSizeMake(130.f, 130.f);
        NSLog(@"5s");

    }
    else if(result.height == 667.000000)
    {
        //Load 4.7 inch xib
        sizes =CGSizeMake(160.f, 160.f);
        NSLog(@"6");

    }
    else
    {
        NSLog(@"else");

        sizes =CGSizeMake(170.f, 165.f);

    }
    return sizes;
}

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

4b9b3361

Ответ 1

Вам не нужно проверять размер устройства, потому что мы можем использовать ширину collectionView для вычисления ширины ячейки. Используя ширину ячейки, вы можете рассчитать высоту в соответствии с вашими потребностями.

Еще одна вещь: вам нужно использовать UICollectionViewDelegateFlowLayout и подтвердить метод делегата и реализации ниже

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

   let padding: CGFloat =  50
   let collectionViewSize = collectionView.frame.size.width - padding

   return CGSizeMake(collectionViewSize/2, collectionViewSize/2)

}

Обновление: Swift 4.0

  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let padding: CGFloat =  50
        let collectionViewSize = collectionView.frame.size.width - padding

        return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }

Примечание: я ответил на вопрос, учитывая, что клетки имеют квадратный размер

Ответ 2

Xcode 8: Swift 3

Я знаю, что это старый вопрос, но я нашел несколько вопросов с принятым ответом.

Мне пришлось использовать UICollectionViewDelegateFlowLayout, который не является CollectionViewFlowLayout

Тогда

В нем "Padding" имеет тип Int, и когда вы пытаетесь вычесть его из переменной collectionViewSize, он выдает ошибку, потому что это разные типы. Очень легко исправить.

Я только что добавил: CGFloat в строку

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

Итак, во всем этом мой код оказался похож на

extension LandingPageViewController: UICollectionViewDelegateFlowLayout {

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

    let padding: CGFloat = 25
    let collectionCellSize = collectionView.frame.size.width - padding

  return CGSize(width: collectionCellSize/2, height: collectionCellSize/2)

   }

}

Ответ 3

- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat padding = 50;
CGFloat cellSize = collectionView.frame.size.width - padding;
return CGSizeMake(cellSize / 2, cellSize / 2);
}

Ответ 4

У меня были проблемы с ограничениями коллекцииView, переданной в sizeForItemAtIndexPath, не были правильными в данный момент времени.

Одним из исправлений для этого было бы перезагрузить ячейки в viewWillAppear, чтобы гарантировать правильность границ коллекции.

Другим является использование класса UIScreen.

-(instancetype)init: {
    self = [super init];
    if (self) {
        width = [[UIScreen mainScreen] bounds].size.width;
    }
    return self;
}

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

    // Two columns with spacing in between
    CGFloat size = ((width / 2) - (kSpacing * 2));
    return CGSizeMake(size, size);

}

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