UICollectionView для чтения слева направо с несколькими строками - PullRequest
0 голосов
/ 15 ноября 2018

Я создаю UICollectionView с включенной подкачкой и прокруткой слева направо.Я использую NSFetchedResultsController для получения результатов из CoreData, что означает, что он использует разделы представления коллекции, а не строки.Представление коллекции имеет 2 строки и, следовательно, выглядит как следующий снимок экрана (где порядок переходит в верхний ряд, нижний ряд, верхний ряд, нижний ряд и т. Д.):

enter image description here

Однако мне нужно, чтобы представление коллекции читалось слева направо, как на следующих 2 снимках экрана:

enter image description here enter image description here

Не могли бы вы посоветовать, как мне это сделать в Swift?

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Как вы сказали, вам нужно 1. Пейджинг включен 2. Прокрутка слева направо 3. Несколько разделов.

Немного запутано, что именно вы хотите создать.Будет намного лучше, если вы сможете поделиться соответствующим скриншотом интерфейса.

Как я понимаю вашу проблему.

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)

Проверьте, назначили ли вы горизонтальную компоновку для вашего collectionView.

0 голосов
/ 23 ноября 2018

Что бы я сделал, это:

1) Сортируйте данные так же, как вы делаете это сейчас, чтобы представление вашей коллекции выглядело так:

---------
|0|2|4|6|
---------
|1|3|5|7|
---------

2) Вваш cellForIndexPath метод источника данных представления вашей коллекции возвращает правильный элемент, чтобы представление вашей коллекции превратилось в следующее:

---------
|0|1|2|3|
---------
|4|5|6|7|
---------

Для этого вы можете использовать следующую логику:

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    var elementIndex: Int!
    if indexPath.row % 2 == 0 {
        // 0 / 2 = 0
        // 2 / 2 = 1
        // 4 / 2 = 2, etc
        elementIndex = indexPath.row / 2
    }
    else {
        // (1 / 2) + round(8.0 / 2.0) = 4
        // (3 / 2) + round(8.0 / 2.0) = 5
        // (5 / 2) + round(8.0 / 2.0) = 6, etc
        elementIndex = (indexPath.row / 2) + Int(round(Double(elements.count) / 2.0))
    }

    // Dequeue your cell
    // let cell = ...

    cell.element = elements[elementIndex]
    return cell
}

В основном это должно вернуть ваши элементы в правильном порядке.

0 голосов
/ 21 ноября 2018

Во-первых, я думаю, что это может помочь, если вы приведете пример того, как ваши ячейки делятся в настоящее время (например, раздел 0: a, b, c, d , раздел 1: e, f , ...) и как вы хотите, чтобы различные разделы отображались / располагались.


Я бы предложил создать пользовательский подкласс UICollectionViewLayout.

В методе prepareLayoutВы должны рассчитать и кешировать UICollectionViewLayoutAttributes для каждой ячейки.

Создать переменные:

let xOffset = 0.0 // leftContentInset within collectionView.bounds
let yOffsetRow0 = 0.0  // y offset of first row within collectionView.bounds
let yOffsetRow1 = 50.0 // y offset of second row within collectionView.bounds
var currentXOffset : CGFloat = xOffset
var currentPage : Int = 0
  1. вычислить кадры, пока первая строка не будет заполнена до правого края экрана (CGRect(currentXOffset, yOffsetRow0, cellWidth, cellHeight), увеличениеcurrentXOffset)
  2. сброс currentXOffset = xOffset
  3. повторить 1. с yOffsetRow1 для второй строки
  4. приращение currentPage += 1
  5. сброс currentXOffset = xOffset + (collectionView.frame.width * currentPage) // для следующегоpage
  6. повторять шаги 1-5, пока не будет рассчитан макет для всех ячеек
...