2015-11-27 2 views
7

Я пытаюсь динамически центрировать содержимое UICollectionView, однако ни одно из существующих решений не учитывает тот факт, что может быть более одной ячейки в строке.Как вертикально центрировать содержимое UICollectionView

Я пробовал это center custom title in UINavigationBar?, а также оба решения здесь: UICollectionView vertically Centred, безрезультатно.

Я очень удивлен, что iOS не делает этого по умолчанию и даже больше, что невозможно получить количество отображаемых строк (что также решило бы мою проблему). Кроме того, я не могу получить размер контента (а не просто размер кадра), который также помог бы мне достичь желаемого эффекта.

У меня есть это:

-------- 
|X X X X | 
|X X X X | 
|  | 
|  | 
-------- 

Но я хочу это:

-------- 
|  | 
|X X X X | 
|X X X X | 
|  | 
-------- 

Любая помощь будет принята с благодарностью,

Большое спасибо.

+1

Я не понимаю вашу проблему. И что вы имеете в виду, как «получить» количество строк? Вы сообщаете коллекции, количество элементов, их размер и т. Д. – Darko

+0

@ Darko: Чтобы центрировать группу ячеек, мне нужно знать, сколько строк отображается в виде коллекции (что отличается от количество элементов в виде нескольких элементов может отображаться в строке, в зависимости от размера экрана). Как только у меня будет количество ячеек, я могу установить верхнюю вставку (высота кадра просмотра - общая высота, занимаемая ячейками)/2.Я добавил визуальное представление к моему вопросу. –

+0

Что касается вашего визуального представления - если вы хотите версию 2, почему вы делаете просмотр коллекции таким большим? Просто сделайте его меньше и центрируйте его на экране с автоматической компоновкой. Помимо этого (как уже ответил jorf) вы можете установить секционные вставки. Но, на мой взгляд, вставки полезны, если вы хотите изменить их во время выполнения. Если макет исправлен, просто уменьшите представление коллекции. – Darko

ответ

3

Теперь я понимаю вашу проблему. В зависимости от размера экрана вам нужна еще одна вставка, чтобы она выглядела по центру. Затем вы должны вычислить его вручную, но это не должно быть так сложно. Вы знаете доступное пространство, количество элементов и размер ячейки. Просто вычислите вставку раздела сверху.

0

UICollectionView имеет свойство visibleCells, которое возвращает массив. Вы можете использовать свойство count на NSArray, чтобы получить количество видимых ячеек.

Вы должны быть в состоянии реализовать - collectionView:layout:insetForSectionAtIndex: в своей реализации делегата, чтобы установить верхнюю вставку на то, что приведет к центрированию, в котором вы стреляете.

Вы также можете подкласса UICollectionViewFlowLayout и при необходимости реализовать свою собственную логику компоновки.

+0

Посмотрите мой второй комментарий к Darko о том, почему это не жизнеспособное решение. Это предполагает, что у меня одинаковое количество ячеек для каждой строки независимо от размера экрана. Хотя все ячейки видны, они не будут отображаться в постоянном наборе строк. –

10

Не знаете почему вы не можете получить содержание - UICollectionView - это подкласс UIScrollView, следовательно имеет доступ к собственности contentSize. Если вам нужно только центрировать клетки в случае, если все они видны без прокрутки, вы можете просто сделать следующее:

collectionView.contentInset.top = max((collectionView.frame.height - collectionView.contentSize.height)/2, 0) 

Это также будет работать в тех случаях, когда число клеток растет так, что не все из них видимый на экране, и вы начинаете использовать вертикальную прокрутку - верхняя вставка будет установлена ​​на 0.

0

Если у вас есть TabBar сделать это

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 

    let navBarHeight  = self.navigationController?.navigationBar.frame.height 
    let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight! 
    let itemsHeight  = self.collectionView?.contentSize.height 

    let topInset = (collectionViewHeight - itemsHeight!)/4 

    return UIEdgeInsetsMake(topInset ,0, 0 , 0) 
} 

Если не игнорировать TabBar вычитание, а остальное ...

Смежные вопросы