2015-03-04 3 views
0

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

Может ли кто-нибудь заглянуть в то же самое и поместить код, чтобы он мог мне помочь.

Должен ли я реализовать пользовательскую схему компоновки коллекций?

Пожалуйста, помогите мне. CollectionView

+0

https://www.cocoacontrols.com/controls/uicollectionviewleftalignedlayout Это выравнивается по левому краю, но может удовлетворить ваши требования. – magid

+0

https://github.com/njdehoog/NHBalancedFlowLayout – magid

ответ

1

Это ответ на ваш комментарий вам нужно добавить 3 дополнительных строк кода в SGSStaggeredFlowLayout

NSArray* arr = [super layoutAttributesForElementsInRect:rect]; 

// THIS CODE SEPARATES INTO ROWS 
NSMutableArray* rows = [NSMutableArray array]; 
NSMutableArray* currentRow = nil; 
NSInteger currentIndex = 0; 
BOOL nextIsNewRow = YES; 
for (UICollectionViewLayoutAttributes* atts in arr) { 
    if (nextIsNewRow) { 
     nextIsNewRow = NO; 
     if (currentRow) { 
      [rows addObject:currentRow]; 
     } 
     currentRow = [NSMutableArray array]; 
    } 

    if (arr.count > currentIndex+1) { 
     UICollectionViewLayoutAttributes* nextAtts = arr[currentIndex+1]; 
     if (nextAtts.frame.origin.y > atts.frame.origin.y) { 
      nextIsNewRow = YES; 
     } 
    } 

    [currentRow addObject:atts]; 
    currentIndex++; 
} 
if (![rows containsObject:currentRow]) { 
    [rows addObject:currentRow]; 
} 

Он работает как шарм :)

+0

Спасибо @ Zahid ... Это работает! Хотя я еще не тестировал его на устройстве. Но, похоже, это сработает. Верно, что это устраняет нашу проблему. У меня есть вопрос, что во время прокрутки размер правильный, то почему он делает промежуток между ними. Это ошибка от Apple? – Jassi

+0

Нет ничего плохого в Apple. Фактически в 'SGSStaggeredFlowLayout' он анализировал все ячейки для видимых строк, но каждый раз, когда последняя строка не анализировалась' array'. Вот почему он создавал разрыв с каждой 13-й строкой. Я просто проверил, не была ли последняя строка в анализируемых строках, а затем добавлена ​​вручную. – Zahid

+0

Спасибо. Вы - спасатель жизни. !! – Jassi

1

Вы можете установить размер для каждого элемента с помощью impelmenting

протокол UICollectionViewDelegateFlowLayout, и рассчитать ширину элемента с помощью чет/нечет формулу.

-(CGSize)collectionView:(UICollectionView *)collectionView 
      layout:(UICollectionViewLayout *)collectionViewLayout 
sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)collectionView.collectionViewLayout; 

    NSInteger itemsPerRow = 0; 
    NSInteger contentSizeWidth = 0; 
    NSInteger num = indexPath.row; 
    if (num % 2) 
    {// odd 
     itemsPerRow = 2; 
    } 
    else { 
    // even 
     itemsPerRow = 3; 
    } 

    contentSizeWidth = collectionView.frame.size.width- (flowLayout.minimumInteritemSpacing*(itemsPerRow-1))-flowLayout.sectionInset.left-flowLayout.sectionInset.right; 

    return CGSizeMake(contentSizeWidth/itemsPerRow, 100); 
} 
+0

Хорошо, но проблема, с которой я столкнулась, - это переменное количество элементов в каждой строке. Размер элемента зависит от ширины текста. Я реализовал код, но представление коллекции оправдано, и между элементами есть большое пространство, если в строке есть 2 элемента, и они вставлены один налево и второй справа, а если есть 3, то они имеют поля различного размера. Я хочу, чтобы там, где есть дополнительное пространство, оно должно соответствовать размеру элемента. – Jassi

+0

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

+0

Проблема заключается в том, как рассчитать, сколько элементов будет в одной строке. Это может быть 2, 3 или 4. В вышеперечисленном методе делегата наступает indexPath для текущего элемента, поэтому я не могу рассчитать размер следующего элемента. – Jassi

0

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

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

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

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

изменение ширины uicollectionview не должно быть diffculty, так как коллекции viewcells являются darw слева направо, а затем сверху вниз.

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