标签:ios 无限滚动 collectionview 自动布局 autolayout

#import "BeyondViewController.h"
// 快速Frame
#import "UIView+Frame.h"
#import "BeyondNewsCell.h"
#import "BeyondNews.h"
#import "MJExtension.h"
// 只有一组,但是该组 有5000*8行
#define TotalItems (5000 * self.newses.count)
// 第一次出现的时候,didAppear时,就出现在中间,左边对齐
#define MiddleItem (NSUInteger)(TotalItems * 0.5)
@interface BeyondViewController () <UICollectionViewDataSource, UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageCtrl;
@property (strong, nonatomic) NSArray *newses;
@property (strong, nonatomic) NSTimer *timer;
@end
@implementation BeyondViewController
#pragma mark - 懒加载
- (NSArray *)newses
{
if (!_newses) {
self.newses = [BeyondNews objectArrayWithFilename:@"newses.plist"];
// 总页数
self.pageCtrl.numberOfPages = self.newses.count;
}
return _newses;
}
#pragma mark - 生命周期
- (void)viewDidLoad
{
[super viewDidLoad];
// 注册cell【UICollectionViewCell不让代码创建】
[self.collectionView registerNib:[UINib nibWithNibName:@"BeyondNewsCell" bundle:nil] forCellWithReuseIdentifier:@"news"];
// 添加定时器
[self addTimer];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:MiddleItem inSection:0] atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
#pragma mark - 时钟方法
- (void)addTimer
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(schedule) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void)removeTimer
{
[self.timer invalidate];
self.timer = nil;
}
// 定时器方法
- (void)schedule
{
// 得到当前显示的item
NSIndexPath *visiablePath = [[self.collectionView indexPathsForVisibleItems] firstObject];
NSUInteger visiableItem = visiablePath.item;
if ((visiablePath.item % self.newses.count) == 0) { // 第0张图片
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:MiddleItem inSection:0] atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
visiableItem = MiddleItem;
}
// 滚动到下一个item
NSUInteger nextItem = visiableItem + 1;
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:nextItem inSection:0] atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];
}
#pragma mark - 数据源和代理方法
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return TotalItems;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellID = @"news";
// 直接取
BeyondNewsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
// UICollectionViewCell没有根据id进行创建方法,只能 从xib加载
// UICollectionViewFlowLayout *layout 中 可以指定cell的高度
cell.news = self.newses[indexPath.item % self.newses.count];
return cell;
}
// 重要,监听代理 停止滚动的事件
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
NSIndexPath *visiablePath = [[collectionView indexPathsForVisibleItems] firstObject];
self.pageCtrl.currentPage = visiablePath.item % self.newses.count;
}
#pragma mark - scrollView代理
// 开始拖拽
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self removeTimer];
}
// 停止拖拽
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self addTimer];
}
@end
// // Frame.h // 08-无限滚动 // // Created by beyond on 15-3-27. // Copyright (c) 2015年 itcast. All rights reserved. // #import <UIKit/UIKit.h> @interface UIView (Frame) @property (assign, nonatomic) CGFloat x; @property (assign, nonatomic) CGFloat y; @property (assign, nonatomic) CGFloat width; @property (assign, nonatomic) CGFloat height; @property (assign, nonatomic) CGSize size; @property (assign, nonatomic) CGPoint origin; @end
//
// Frame.m
// 08-无限滚动
//
// Created by beyond on 15-3-27.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "UIView+Frame.h"
@implementation UIView (Frame)
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setY:(CGFloat)y
{
CGRect frame = self.frame;
frame.origin.y = y;
self.frame = frame;
}
- (CGFloat)y
{
return self.frame.origin.y;
}
- (void)setWidth:(CGFloat)width
{
CGRect frame = self.frame;
frame.size.width = width;
self.frame = frame;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (void)setHeight:(CGFloat)height
{
CGRect frame = self.frame;
frame.size.height = height;
self.frame = frame;
}
- (CGFloat)height
{
return self.frame.size.height;
}
- (void)setSize:(CGSize)size
{
CGRect frame = self.frame;
frame.size = size;
self.frame = frame;
}
- (CGSize)size
{
return self.frame.size;
}
- (void)setOrigin:(CGPoint)origin
{
CGRect frame = self.frame;
frame.origin = origin;
self.frame = frame;
}
- (CGPoint)origin
{
return self.frame.origin;
}
@end
标签:ios 无限滚动 collectionview 自动布局 autolayout
原文地址:http://blog.csdn.net/pre_eminent/article/details/44702563