0

我正在使用水平自動滾動使用計時器。我想讓它一個一個滾動。UICollectionView - 水平自動滾動與計時器

就我而言,它是從左向右滾動連續。最後它還會在最後一個單元格之後滾動空白區域。

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

您的CollectionView細胞寬度等於您self.width ???或者是你先顯示3個單元然後滾動3個單元格? –

+0

@AgentChocks。沒有全部基於數組數。滾動從數組中的第一個元素開始直到結束,然後反轉 – ChenSmile

+0

@AgentChocks。你有任何解決方案 – ChenSmile

回答

0

在自定義類的collectionViewCell的:

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

,並移除任何其他width計算。

0

我使用這樣

從viewDidLoad中聲明變量

var timer:Timer! 

呼叫

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