UICollectionView - Horizontal AutoScroll with Timer

五迷三道 提交于 2020-01-01 07:22:44

问题


I am using Horizontal Auto Scroll using timer. I want it to scroll one by one.

In my case it is scrolling continuos from left to right. and in last it also scroll white space after last cell.

@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;
 }
}

回答1:


In the custom class of your collectionViewCell:

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

and remove any other width calculations.




回答2:


I am using like this

declare variable

var timer:Timer!

call from 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)!
}


来源:https://stackoverflow.com/questions/39158680/uicollectionview-horizontal-autoscroll-with-timer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!