UICollectionView - 带计时器的水平AutoScroll

时间:2016-08-26 05:10:54

标签: objective-c uicollectionview uicollectionviewcell horizontal-scrolling

我正在使用计时器的水平自动滚动。我希望它逐个滚动。

在我的情况下,它是从左到右滚动连续。最后它还会在最后一个单元格之后滚动空格。

@interface AccountsVC ()<UICollectionViewDataSource,   UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>
{
 CGFloat width_Cell;
 NSTimer *autoScrollTimer;
}

- (void)viewDidLoad
{
 [super viewDidLoad];
 width_Cell = 0.0;
}

- (void)viewDidAppear:(BOOL)animated
{
 [super viewDidAppear:animated];
 [self configAutoscrollTimer];
 }

- (void)viewDidDisappear:(BOOL)animated
{
 [super viewDidDisappear:animated];
 [self deconfigAutoscrollTimer];
}

- (void)configAutoscrollTimer
{
 autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
 }

- (void)deconfigAutoscrollTimer
{
 [autoScrollTimer invalidate];
 autoScrollTimer = nil;
}

- (void)onTimer
{
 [self autoScrollView];
}

- (void)autoScrollView
 {
 CGPoint initailPoint = CGPointMake(width_Cell, 0);
 if (CGPointEqualToPoint(initailPoint, self.collectionView.contentOffset))
 {
    if (width_Cell < self.collectionView.contentSize.width)
    {
        width_Cell += 0.5;
    }else
    {
        width_Cell = -self.view.frame.size.width;
    }
    CGPoint offsetPoint = CGPointMake(width_Cell, 0);
    self.collectionView.contentOffset = offsetPoint;
}else
 {
    width_Cell = self.collectionView.contentOffset.x;
 }
}

2 个答案:

答案 0 :(得分:3)

collectionViewCell的自定义类中:

self.contentView.frame = self.bounds;
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth |
                                    UIViewAutoresizingFlexibleHeight;

并删除任何其他width计算。

答案 1 :(得分:0)

我正在使用这个

声明变量

var timer:Timer!

从viewDidLoad调用

self.addTimer()


func addTimer() {
    let timer1 = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.nextPage), userInfo: nil, repeats: true)
    RunLoop.main.add(timer1, forMode: RunLoopMode.commonModes)
    self.timer = timer1
}


func resetIndexPath() -> IndexPath {
    let currentIndexPath = self.collectionView.indexPathsForVisibleItems.last
    let currentIndexPathReset = IndexPath(item: (currentIndexPath?.item)!, section: 0)
    self.collectionView.scrollToItem(at: currentIndexPathReset, at: UICollectionViewScrollPosition.left, animated: true)
    return currentIndexPath!
}

func removeTimer() {
    if self.timer != nil {
        self.timer.invalidate()
    }
    self.timer = nil
}


func nextPage() {
    let currentIndexPathReset:IndexPath = self.resetIndexPath()
    var nextItem = currentIndexPathReset.item + 1
    let nextSection = currentIndexPathReset.section
    if nextItem == productImage.count{
        nextItem = 0
    }
    var nextIndexPath = IndexPath(item: nextItem, section: nextSection)
    if nextItem == 0 {
        self.collectionView.scrollToItem(at: nextIndexPath, at: UICollectionViewScrollPosition.left, animated: false)
    }
    self.collectionView.scrollToItem(at: nextIndexPath, at: UICollectionViewScrollPosition.left, animated: true)
}



func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    self.addTimer()

}

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    self.removeTimer()
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    var visibleRect = CGRect()
    visibleRect.origin = collectionView.contentOffset
    visibleRect.size = collectionView.bounds.size
    let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
    let visibleIndexPath: IndexPath? = collectionView.indexPathForItem(at: visiblePoint)
    pageControlView.currentPage = (visibleIndexPath?.row)!
}