UICollectionView гарызантальны падпампоўкі - можна выкарыстоўваць Layout Flow?

Гэта звязана з, але ў адрозненне ад Для выкарыстання макета патоку, або наладзіць? </а>.

Here is an illustration of what I’m trying to do: Illustration of what I’m trying to do

Я цікава, калі я магу зрабіць гэта з дапамогай UICollectionViewFlowLayout </кодзе>, яго падклас, або калі мне трэба, каб стварыць цалкам наладжвальны макет? Грунтуючыся на WWDC 2012 відэа на UICollectionView, аказваецца, што пад час выкарыстаньня макета патоку з вертыкальнай пракруткай, вашы лініі разметак з'яўляюцца гарызантальнымі, а калі пракруціць па гарызанталі, вашы лініі разметак з'яўляюцца вертыкальнымі. Я хачу, каб гарызантальныя лініі макета ў гарызантальна-прагортцы прадстаўлення калекцыі.

Я таксама не маюць якіх-небудзь уласцівых падзелаў у маёй мадэлі - гэта толькі адзін набор элементаў. Я мог бы згрупаваць іх у раздзелы, але выгляд калекцыі змяняны, таму колькасць элементаў, якія могуць змясціцца на старонцы будзе мяняцца часам, і, падобна, выбар якога старонка кожны элемент працягваецца лепш пакінуць на макет, чым у мадэль, калі ў мяне няма якіх-небудзь значных частак.

Такім чынам, я магу гэта зрабіць з фарматаваннем патоку, або мне трэба стварыць карыстацкі макет?

42

8 адказы

Тут я дзялюся сваім простую рэалізацыю!

.H файл:

/** 
 * CollectionViewLayout for an horizontal flow type:
 *
 *  |   0   1   |   6   7   |
 *  |   2   3   |   8   9   |   ----> etc...
 *  |   4   5   |   10  11  |
 *
 * Only supports 1 section and no headers, footers or decorator views.
 */
@interface HorizontalCollectionViewLayout : UICollectionViewLayout

@property (nonatomic, assign) CGSize itemSize;

@end

Файл .m:

@implementation HorizontalCollectionViewLayout
{
    NSInteger _cellCount;
    CGSize _boundsSize;
}

- (void)prepareLayout
{
   //Get the number of cells and the bounds size
    _cellCount = [self.collectionView numberOfItemsInSection:0];
    _boundsSize = self.collectionView.bounds.size;
}

- (CGSize)collectionViewContentSize
{
   //We should return the content size. Lets do some math:

    NSInteger verticalItemsCount = (NSInteger)floorf(_boundsSize.height/_itemSize.height);
    NSInteger horizontalItemsCount = (NSInteger)floorf(_boundsSize.width/_itemSize.width);

    NSInteger itemsPerPage = verticalItemsCount * horizontalItemsCount;
    NSInteger numberOfItems = _cellCount;
    NSInteger numberOfPages = (NSInteger)ceilf((CGFloat)numberOfItems/(CGFloat)itemsPerPage);

    CGSize size = _boundsSize;
    size.width = numberOfPages * _boundsSize.width;
    return size;
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
   //This method requires to return the attributes of those cells that intsersect with the given rect.
   //In this implementation we just return all the attributes.
   //In a better implementation we could compute only those attributes that intersect with the given rect.

    NSMutableArray *allAttributes = [NSMutableArray arrayWithCapacity:_cellCount];

    for (NSUInteger i=0; i<_cellCount; ++i)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        UICollectionViewLayoutAttributes *attr = [self _layoutForAttributesForCellAtIndexPath:indexPath];

        [allAttributes addObject:attr];
    }

    return allAttributes;
}

- (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return [self _layoutForAttributesForCellAtIndexPath:indexPath];
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
   //We should do some math here, but we are lazy.
    return YES;
}

- (UICollectionViewLayoutAttributes*)_layoutForAttributesForCellAtIndexPath:(NSIndexPath*)indexPath
{
   //Here we have the magic of the layout.

    NSInteger row = indexPath.row;

    CGRect bounds = self.collectionView.bounds;
    CGSize itemSize = self.itemSize;

   //Get some info:
    NSInteger verticalItemsCount = (NSInteger)floorf(bounds.size.height/itemSize.height);
    NSInteger horizontalItemsCount = (NSInteger)floorf(bounds.size.width/itemSize.width);
    NSInteger itemsPerPage = verticalItemsCount * horizontalItemsCount;

   //Compute the column & row position, as well as the page of the cell.
    NSInteger columnPosition = row%horizontalItemsCount;
    NSInteger rowPosition = (row/horizontalItemsCount)%verticalItemsCount;
    NSInteger itemPage = floorf(row/itemsPerPage);

   //Creating an empty attribute
    UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];

    CGRect frame = CGRectZero;

   //And finally, we assign the positions of the cells
    frame.origin.x = itemPage * bounds.size.width + columnPosition * itemSize.width;
    frame.origin.y = rowPosition * itemSize.height;
    frame.size = _itemSize;

    attr.frame = frame;

    return attr;
}

#pragma mark Properties

- (void)setItemSize:(CGSize)itemSize
{
    _itemSize = itemSize;
    [self invalidateLayout];
}

@end

І, нарэшце, калі вы хочаце пастаронкавага паводзіны, вам проста трэба наладзіць UICollectionView:

_collectionView.pagingEnabled = YES;

Спадзеючыся быць досыць карысным.

33
дададзена
Як мне зрабіць гэтую падтрымку больш чым адной секцыі?
дададзена аўтар iOS Calendar View OnMyProfile, крыніца
Гэта працуе для мяне :) Дзякуй
дададзена аўтар DAMM108, крыніца
Чаму _layoutForAttributesForCellAtIndexPath: метад? Недаацэньваюцца прыстаўкай метады зарэзерваваны Apple, і да таго ж, усё, што вы робіце перасылку з layoutAttributesForItemAtIndexPath: .
дададзена аўтар Zev Eisenberg, крыніца
Але навошта выкарыстоўваць прыватны метад наогул? Чаму б проста не зрабіць усю гэтую працу ў -layoutAttributesForItemAtIndexPath: ?
дададзена аўтар Zev Eisenberg, крыніца
Гэта выдатна працуе!
дададзена аўтар seabass, крыніца
Так, мы маглі б проста зрабіць гэта такім чынам.
дададзена аўтар vilanovi, крыніца
Я звычайна выкарыстоўваю ў прыватных метадах майго ўласнага прэфікс (2 літары), а затым падкрэслення: XX_myPrivateMethod . Пры капіяванні уставіўшы яго, я выдаліў прэфіксы імя класа і прыватныя метады. Я думаў, што ніхто не будзе скардзіцца, і я бачу, што няма;)
дададзена аўтар vilanovi, крыніца

Старадаўняе vilanovi код Swift ў выпадку, калі хтосьці мае патрэбу ў будучыні.

public class HorizontalCollectionViewLayout : UICollectionViewLayout {
private var cellWidth = 90//Don't kow how to get cell size dynamically
private var cellHeight = 90

public override func prepareLayout() {
}

public override func collectionViewContentSize() -> CGSize {
    let numberOfPages = Int(ceilf(Float(cellCount)/Float(cellsPerPage)))
    let width = numberOfPages * Int(boundsWidth)
    return CGSize(width: CGFloat(width), height: boundsHeight)
}

public override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
    var allAttributes = [UICollectionViewLayoutAttributes]()

    for (var i = 0; i < cellCount; ++i) {
        let indexPath = NSIndexPath(forRow: i, inSection: 0)
        let attr = createLayoutAttributesForCellAtIndexPath(indexPath)
        allAttributes.append(attr)
    }

    return allAttributes
}

public override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! {
    return createLayoutAttributesForCellAtIndexPath(indexPath)
}

public override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
    return true
}

private func createLayoutAttributesForCellAtIndexPath(indexPath:NSIndexPath)
    -> UICollectionViewLayoutAttributes {
        let layoutAttributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
        layoutAttributes.frame = createCellAttributeFrame(indexPath.row)
        return layoutAttributes
}

private var boundsWidth:CGFloat {
    return self.collectionView!.bounds.size.width
}

private var boundsHeight:CGFloat {
    return self.collectionView!.bounds.size.height
}

private var cellCount:Int {
    return self.collectionView!.numberOfItemsInSection(0)
}

private var verticalCellCount:Int {
    return Int(floorf(Float(boundsHeight)/Float(cellHeight)))
}

private var horizontalCellCount:Int {
    return Int(floorf(Float(boundsWidth)/Float(cellWidth)))
}

private var cellsPerPage:Int {
    return verticalCellCount * horizontalCellCount
}

private func createCellAttributeFrame(row:Int) -> CGRect {
    let frameSize = CGSize(width:cellWidth, height: cellHeight )
    let frameX = calculateCellFrameHorizontalPosition(row)
    let frameY = calculateCellFrameVerticalPosition(row)
    return CGRectMake(frameX, frameY, frameSize.width, frameSize.height)
}

private func calculateCellFrameHorizontalPosition(row:Int) -> CGFloat {
    let columnPosition = row % horizontalCellCount
    let cellPage = Int(floorf(Float(row)/Float(cellsPerPage)))
    return CGFloat(cellPage * Int(boundsWidth) + columnPosition * Int(cellWidth))
}

private func calculateCellFrameVerticalPosition(row:Int) -> CGFloat {
    let rowPosition = (row/horizontalCellCount) % verticalCellCount
    return CGFloat(rowPosition * Int(cellHeight))
}

}

14
дададзена
Дзякуй за хуткую канвертаванне;)
дададзена аўтар vilanovi, крыніца
<�Код> хай FrameSize = CGSize (шырыня: cellHeight, вышыня: cellWidth) OOPS
дададзена аўтар Mijail, крыніца
Гэта сапраўды працуе для мяне. Дзякуй :)
дададзена аўтар Hemali Luhar, крыніца

Вы маеце рацыю - гэта не тое, як запас па гарызанталі пракруткі прадстаўлення калекцыі выкладвае клетку. Я баюся, што вы будзеце мець, каб рэалізаваць свой уласны UICollectionViewLayout падклас. Ці гэта, ці аддзяліць вашыя мадэлі ў секцыі.

12
дададзена
Вось што я зразумеў. Я проста хацеў праверыць стан сьвядомасьці ад хлопца, які напісаў кнігу пра UICollectionView . Можа быць, іншыя знойдуць гэты адказ карысным.
дададзена аўтар Zev Eisenberg, крыніца

Папярэдні вышэй рэалізацыя не была завершана, багі, і з фіксаваным памерам ячэйкі. Вось больш літаральны пераклад кода:

import UIKit

class HorizontalFlowLayout: UICollectionViewLayout {
    var itemSize = CGSizeZero {
        didSet {
            invalidateLayout()
        }
    }
    private var cellCount = 0
    private var boundsSize = CGSizeZero

    override func prepareLayout() {
        cellCount = self.collectionView!.numberOfItemsInSection(0)
        boundsSize = self.collectionView!.bounds.size
    }

    override func collectionViewContentSize() -> CGSize {
        let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height))
        let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width))

        let itemsPerPage = verticalItemsCount * horizontalItemsCount
        let numberOfItems = cellCount
        let numberOfPages = Int(ceil(Double(numberOfItems)/Double(itemsPerPage)))

        var size = boundsSize
        size.width = CGFloat(numberOfPages) * boundsSize.width
        return size
    }

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        var allAttributes = [UICollectionViewLayoutAttributes]()
        for var i = 0; i < cellCount; i++ {
            let indexPath = NSIndexPath(forRow: i, inSection: 0)
            let attr = self.computeLayoutAttributesForCellAtIndexPath(indexPath)
            allAttributes.append(attr)
        }
        return allAttributes
    }

    override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
        return self.computeLayoutAttributesForCellAtIndexPath(indexPath)
    }

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        return true
    }

    func computeLayoutAttributesForCellAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes {
        let row = indexPath.row
        let bounds = self.collectionView!.bounds

        let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height))
        let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width))
        let itemsPerPage = verticalItemsCount * horizontalItemsCount

        let columnPosition = row % horizontalItemsCount
        let rowPosition = (row/horizontalItemsCount)%verticalItemsCount
        let itemPage = Int(floor(Double(row)/Double(itemsPerPage)))

        let attr = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)

        var frame = CGRectZero
        frame.origin.x = CGFloat(itemPage) * bounds.size.width + CGFloat(columnPosition) * itemSize.width
        frame.origin.y = CGFloat(rowPosition) * itemSize.height
        frame.size = itemSize
        attr.frame = frame

        return attr
    }
}
3
дададзена
Ці працуе гэта для вас? Я паспрабаваў гэта, і яго рэндэрынг першы раздзел ок. Але іншыя раздзелы не вынесенае
дададзена аўтар iOS Calendar View OnMyProfile, крыніца
@GuilhermeSprint Гэта можа быць карысна, каб паказаць, як дадаць гэты макет у мэтах збору і пазбегнуць распаўсюджаных памылак, як вяртанне 0 раздзелаў і пераканаўшыся, што ўсталяваць itemSize.
дададзена аўтар Wez, крыніца
Ды гэта, вы можаце ўбачыць яго працы ў гэтым прыкладзе: github.com/sprint84/TabbedCollectionView
дададзена аўтар Guilherme Sprint, крыніца

<�Моцны> Swift 4

код:

public class HorizontalFlowLayout: UICollectionViewLayout {
    var itemSize = CGSize(width: 0, height: 0) {
        didSet {
            invalidateLayout()
        }
    }
    private var cellCount = 0
    private var boundsSize = CGSize(width: 0, height: 0)

    public override func prepare() {
        cellCount = self.collectionView!.numberOfItems(inSection: 0)
        boundsSize = self.collectionView!.bounds.size
    }
    public override var collectionViewContentSize: CGSize {
        let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height))
        let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width))

        let itemsPerPage = verticalItemsCount * horizontalItemsCount
    let numberOfItems = cellCount
    let numberOfPages = Int(ceil(Double(numberOfItems)/Double(itemsPerPage)))

        var size = boundsSize
        size.width = CGFloat(numberOfPages) * boundsSize.width
        return size
    }

    public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        var allAttributes = [UICollectionViewLayoutAttributes]()
        for i in 0...(cellCount-1) {
            let indexPath = IndexPath(row: i, section: 0)
            let attr = self.computeLayoutAttributesForCellAt(indexPath: indexPath)
            allAttributes.append(attr)
        }
        return allAttributes
    }

    public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        return computeLayoutAttributesForCellAt(indexPath: indexPath)
    }

    public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }

    private func computeLayoutAttributesForCellAt(indexPath:IndexPath)
        -> UICollectionViewLayoutAttributes {
            let row = indexPath.row
            let bounds = self.collectionView!.bounds

            let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height))
            let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width))
            let itemsPerPage = verticalItemsCount * horizontalItemsCount

            let columnPosition = row % horizontalItemsCount
            let rowPosition = (row/horizontalItemsCount)%verticalItemsCount
            let itemPage = Int(floor(Double(row)/Double(itemsPerPage)))

            let attr = UICollectionViewLayoutAttributes(forCellWith: indexPath)

            var frame = CGRect(x: 0, y: 0, width: 0, height: 0)
            frame.origin.x = CGFloat(itemPage) * bounds.size.width + CGFloat(columnPosition) * itemSize.width
            frame.origin.y = CGFloat(rowPosition) * itemSize.height
            frame.size = itemSize
            attr.frame = frame

            return attr
    }
}

Гэта <�моцны> Swift 3 версія @GuilhermeSprint адказ

код:

public class HorizontalCollectionViewLayout : UICollectionViewLayout {
    var itemSize = CGSize(width: 0, height: 0) {
        didSet {
            invalidateLayout()
        }
    }
    private var cellCount = 0
    private var boundsSize = CGSize(width: 0, height: 0)

    public override func prepare() {
        cellCount = self.collectionView!.numberOfItems(inSection: 0)
        boundsSize = self.collectionView!.bounds.size
    }
    public override var collectionViewContentSize: CGSize {
        let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height))
        let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width))

        let itemsPerPage = verticalItemsCount * horizontalItemsCount
        let numberOfItems = cellCount
        let numberOfPages = Int(ceil(Double(numberOfItems)/Double(itemsPerPage)))

        var size = boundsSize
        size.width = CGFloat(numberOfPages) * boundsSize.width
        return size
    }

    public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        var allAttributes = [UICollectionViewLayoutAttributes]()
        for i in 0...(cellCount-1) {
            let indexPath = IndexPath(row: i, section: 0)
            let attr = self.computeLayoutAttributesForCellAt(indexPath: indexPath)
            allAttributes.append(attr)
        }
        return allAttributes
    }

    public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        return computeLayoutAttributesForCellAt(indexPath: indexPath)
    }

    public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }

    private func computeLayoutAttributesForCellAt(indexPath:IndexPath)
        -> UICollectionViewLayoutAttributes {
            let row = indexPath.row
            let bounds = self.collectionView!.bounds

            let verticalItemsCount = Int(floor(boundsSize.height/itemSize.height))
            let horizontalItemsCount = Int(floor(boundsSize.width/itemSize.width))
            let itemsPerPage = verticalItemsCount * horizontalItemsCount

            let columnPosition = row % horizontalItemsCount
            let rowPosition = (row/horizontalItemsCount)%verticalItemsCount
            let itemPage = Int(floor(Double(row)/Double(itemsPerPage)))

            let attr = UICollectionViewLayoutAttributes(forCellWith: indexPath)

            var frame = CGRectMake(0, 0, 0, 0)
            frame.origin.x = CGFloat(itemPage) * bounds.size.width + CGFloat(columnPosition) * itemSize.width
            frame.origin.y = CGFloat(rowPosition) * itemSize.height
            frame.size = itemSize
            attr.frame = frame

            return attr
    }
}

выкарыстанне:

   //I want to have 4 items in the page/see screenshot below
    let itemWidth = collectionView.frame.width/2.0
    let itemHeight = collectionView.frame.height/2.0
    let horizontalCV = HorizontalCollectionViewLayout();
    horizontalCV.itemSize = CGSize(width: itemWidth, height: itemHeight)
    collectionView.collectionViewLayout = horizontalCV

вынік

screenshot

Маё пашырэнне Дэлегаты, калі вы хочаце праверыць гэта таксама

extension MyViewController : UICollectionViewDelegateFlowLayout, UICollectionViewDataSource{
   //Delegate
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("Clicked")
    }

   //DataSource
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: BottomMenuCCell.xib, for: indexPath) as? BottomMenuCCell {
            cell.ibi = bottomMenuButtons[indexPath.row]
            cell.layer.borderWidth = 0
            return cell
        }
        return BaseCollectionCell()
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize.init(width: (collectionView.width/2.0), height: collectionView.height/2.0)
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return bottomMenuButtons.count
    }

   //removing spacing between items
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0.0
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0.0
    }
}
2
дададзена
Дзякуй за абмен вашага кода. Вы можаце праверыць гэта? StackOverflow .com/пытанні/45577850/& hellip;
дададзена аўтар Tolgay Toklar, крыніца

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

1
дададзена
@interface HorizontalCollectionViewLayout : UICollectionViewFlowLayout

@end

@implementation HorizontalCollectionViewLayout

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.minimumLineSpacing = 0;
        self.minimumInteritemSpacing = 0;
    }
    return self;
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *attributesArray = [super layoutAttributesForElementsInRect:rect];

    NSInteger verticalItemsCount = (NSInteger)floorf(self.collectionView.bounds.size.height/self.itemSize.height);
    NSInteger horizontalItemsCount = (NSInteger)floorf(self.collectionView.bounds.size.width/self.itemSize.width);
    NSInteger itemsPerPage = verticalItemsCount * horizontalItemsCount;

    for (NSInteger i = 0; i < attributesArray.count; i++) {
        UICollectionViewLayoutAttributes *attributes = attributesArray[i];
        NSInteger currentPage = (NSInteger)floor((double)i/(double)itemsPerPage);
        NSInteger currentRow = (NSInteger)floor((double)(i - currentPage * itemsPerPage)/(double)horizontalItemsCount);
        NSInteger currentColumn = i % horizontalItemsCount;
        CGRect frame = attributes.frame;
        frame.origin.x = self.itemSize.width * currentColumn + currentPage * self.collectionView.bounds.size.width;
        frame.origin.y = self.itemSize.height * currentRow;
        attributes.frame = frame;
    }
    return attributesArray;
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
    return YES;
}

@end
1
дададзена
Гэта рашэнне амаль добра. Аднак ёсць памылка міма 3я старонкі, калі раскладка выгляду калекцыі спыняе праходжанне першых пунктаў, і перадаць толькі тыя, якія маюць значэнне для бачных старонак
дададзена аўтар Guilherme Sprint, крыніца

Можна проста змяніць кірунак пракруткі ў UICollectionView.xib да гарызанталі. І выкарыстоўваць з правільным парадкам элементаў у масіве.

0
дададзена
Цікавая ідэя - змяніць парадак элементаў у масіве, каб яны ляжалі правільна? Я хацеў бы захаваць крыніца дадзеных (масіў) чыста, і захаваць парадак макета для прагляду/прэзентацыйнага пласта прыкладання, так што я б, хутчэй за ўсё, ісці з адказам, як this адзін за vilanovi .
дададзена аўтар Zev Eisenberg, крыніца