연속 스크롤 보기;수평과 수직

질문:

나는 이 임무를 위해 오랫동안 발버둥쳤다.나는 연속적으로 수직과 수평으로 굴러갈 수 있는scrollview나collectionview를 개발하고 싶다.
이것은 내가 어떤 모습이어야 한다고 생각하는 사진이다.투명 상자는 메모리에서 다시 불러오는 보기/단위입니다.보기/단원이 화면 밖에 나타나면, 곧 다가올 새 단원에 다시 사용되어야 합니다.UITableViewController처럼.
Continuous scroll
나는 UICollectionView 수평이나 수직 방향에서만 무한히 굴러갈 수 있고 수평과 수직 방향에서만 동시에 굴러갈 수 없다는 것을 안다.그러나 나는 이 점을 어떻게 사용하는지 모르겠다UIScrollView.
나는 코드 attached to an answer on this question 를 시도했다. 보기 (예:% 20) 를 다시 만들 수 있지만, 이것은 내가 진정으로 필요로 하는 것이 아니다.그 밖에 그것은 연속적인 것이 아니다.
HBO Go 앱이 이를 할 수 있기 때문에 가능한 일이라는 것을 알고 있습니다.나는 완전히 같은 기능을 원한다.
나의 문제는: 내가 어떻게 해야만 나의 목표를 실현할 수 있습니까?어떤 지침/강좌가 있으면 저에게 어떻게 하는지 가르쳐 줄 수 있습니까?못 찾겠어요.

가장 일반적인 솔루션

중심에서 일정 거리 떨어진 후 UIScrollView 재중심 기술을 사용하여 무한 스크롤을 실현할 수 있다.우선, 스크롤할 수 있도록 contentSize 를 충분하게 설정해야 합니다. 따라서, 제 섹션의 항목 수와 섹션의 4배의 결과를 되돌려주고, cellForItemAtIndexPath 방법의mod 연산자를 사용하여 정확한 인덱스를 제 그룹에 넣습니다.그런 다음, WWDC 2011 비디오 "고급 스크롤 뷰 기술"에서 설명한 것처럼 하위 클래스layoutSubviews를 덮어쓰고UICollectionView해야 합니다.다음은 컬렉션 뷰(IB에서 설정)를 하위 뷰로 사용하는 컨트롤러 클래스입니다.
#import "ViewController.h"
#import "MultpleLineLayout.h"
#import "DataCell.h"

@interface ViewController ()
@property (weak,nonatomic) IBOutlet UICollectionView *collectionView;
@property (strong,nonatomic) NSArray *theData;
@end

@implementation ViewController

- (void)viewDidLoad {
    self.theData = @[@[@"1",@"2",@"3",@"4",@"5"], @[@"6",@"7",@"8",@"9",@"10"],@[@"11",@"12",@"13",@"14",@"15"],@[@"16",@"17",@"18",@"19",@"20"]];
    MultpleLineLayout *layout = [[MultpleLineLayout alloc] init];
    self.collectionView.collectionViewLayout = layout;
    self.collectionView.showsHorizontalScrollIndicator = NO;
    self.collectionView.showsVerticalScrollIndicator = NO;
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    self.view.backgroundColor = [UIColor blackColor];
    [self.collectionView registerClass:[DataCell class] forCellWithReuseIdentifier:@"DataCell"];
    [self.collectionView reloadData];
}


- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
    return 20;
}

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
    return 16;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView  cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    DataCell *cell = [collectionView  dequeueReusableCellWithReuseIdentifier:@"DataCell" forIndexPath:indexPath];
    cell.label.text = self.theData[indexPath.section %4][indexPath.row %5];
    return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
   // UICollectionViewCell *item = [collectionView cellForItemAtIndexPath:indexPath];
    NSLog(@"%@",indexPath);

}
다음은 UICollectionViewFlowLayout 하위 클래스입니다.
#define space 5
#import "MultpleLineLayout.h"

@implementation MultpleLineLayout { // a subclass of UICollectionViewFlowLayout
    NSInteger itemWidth;
    NSInteger itemHeight;
}

-(id)init {
    if (self = [super init]) {
        itemWidth = 60;
        itemHeight = 60;
    }
    return self;
}

-(CGSize)collectionViewContentSize {
    NSInteger xSize = [self.collectionView numberOfItemsInSection:0] * (itemWidth + space); // "space" is for spacing between cells.
    NSInteger ySize = [self.collectionView numberOfSections] * (itemHeight + space);
    return CGSizeMake(xSize, ySize);
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)path {
    UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:path];
    attributes.size = CGSizeMake(itemWidth,itemHeight);
    int xValue = itemWidth/2 + path.row * (itemWidth + space);
    int yValue = itemHeight + path.section * (itemHeight + space);
    attributes.center = CGPointMake(xValue, yValue);
    return attributes;
}


-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
    NSInteger minRow =  (rect.origin.x > 0)?  rect.origin.x/(itemWidth + space) : 0; // need to check because bounce gives negative values  for x.
    NSInteger maxRow = rect.size.width/(itemWidth + space) + minRow;
    NSMutableArray* attributes = [NSMutableArray array];
    for(NSInteger i=0 ; i < self.collectionView.numberOfSections; i++) {
        for (NSInteger j=minRow ; j < maxRow; j++) {
            NSIndexPath* indexPath = [NSIndexPath indexPathForItem:j inSection:i];
            [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
        }
    }
    return attributes;
}
마지막으로 여기는UICollectionView의 하위 클래스입니다.
-(void)layoutSubviews {
    [super layoutSubviews];
    CGPoint currentOffset = self.contentOffset;
    CGFloat contentWidth = self.contentSize.width;
    CGFloat contentHeight = self.contentSize.height;
    CGFloat centerOffsetX = (contentWidth - self.bounds.size.width)/ 2.0;
    CGFloat centerOffsetY = (contentHeight - self.bounds.size.height)/ 2.0;
    CGFloat distanceFromCenterX = fabsf(currentOffset.x - centerOffsetX);
    CGFloat distanceFromCenterY = fabsf(currentOffset.y - centerOffsetY);

    if (distanceFromCenterX > contentWidth/4.0) { // this number of 4.0 is arbitrary
        self.contentOffset = CGPointMake(centerOffsetX, currentOffset.y);
    }
    if (distanceFromCenterY > contentHeight/4.0) {
        self.contentOffset = CGPointMake(currentOffset.x, centerOffsetY);
    }
}