2017-06-16 166 views
0

我已經創建了這個無限的具有13個圖標的collectionView循環,但它在320 x 568分辨率設備上無法正常工作。問題是在滾動時計算適當的圖像contentOffset(這是一個動畫 - 它不可觸摸),並且它在一段時間後不居中。這些圖像間隔相等,因爲我想一次在屏幕上顯示3個圖標。當3個圖標通過時,previousContentOffset是x = 319.5,它應該是x = 320.0對於這種特殊情況的任何解決方法建議?也許迭代單個圖標?結果,我後1個圖標滑動獲得:iOS - collection中的CGPoint值不準確查看內容偏移

  • previousContentOffset =(CGPoint)(X = 106.5,Y = 0),

  • 寬度=(雙)106.66666666666667,

  • currentContentOffset = (CGPoint)(X = 213.16666666666669,Y = 0)

//無限循環

- (void)setupDataForCollectionView { 

NSArray *originalArray = self.arrayImages; 

NSMutableArray *workingArray = [originalArray mutableCopy]; 

self.dataArray = [workingArray mutableCopy]; 
} 

// Implementation of infinite loop 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 

// calculate width for every device 

double contentOffsetWhenFullyScrolledRight = self.collectionViewHorizontal.contentSize.width - self.collectionViewHorizontal.frame.size.width; 

if (scrollView.contentOffset.x == contentOffsetWhenFullyScrolledRight) { 

    NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:1 inSection:0]; 

    [self.collectionViewHorizontal scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; 

} else if (scrollView.contentOffset.x == 0) { 

    NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:([self.dataArray count] -2) inSection:0]; 

    [self.collectionViewHorizontal scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; 
    } 
} 

// TimeInterval for animation 

- (void)timerAction:(NSTimer *)timer { 

//previous icon content offset 
CGPoint previousContentOffSet = self.collectionViewHorizontal.contentOffset; 

//next icon width 
double width = self.collectionViewHorizontal.frame.size.width/3; 
// NSUInteger index = (int)(floor(self.collectionViewHorizontal.contentOffset.x/width) + 1); 

// animate icons scroll view 
CGPoint currentContentOffset = CGPointMake(previousContentOffSet.x + width, previousContentOffSet.y); 

NSIndexPath *indexPath = [self.collectionViewHorizontal indexPathForItemAtPoint:currentContentOffset]; 
if (indexPath.row > self.dataArray.count - 4) { 
    // add elements and reload 
    [self.dataArray addObjectsFromArray:[self.arrayImages copy]]; 
    [self.collectionViewHorizontal reloadData]; 
} 
// sliding animation 
[UIView animateWithDuration:.3 delay:.0 usingSpringWithDamping:0.5 initialSpringVelocity:.0 options:kNilOptions animations:^{ 
    self.collectionViewHorizontal.contentOffset = currentContentOffset; 
} completion:^(BOOL finished) { 
    [self scrollViewDidEndDecelerating:self.collectionViewHorizontal]; 
}]; 
} 

回答

0

我已經實施了一種解決方法,所以我想我應該分享。我決定迭代當前圖標的索引而不是contentOffset。 我已經創建了一個NSInteger屬性currentIndex並添加到定時器方法中。

- (void)timerAction:(NSTimer *)timer { 

self.currentIndex++; 

//next icon width 
double width = self.collectionViewHorizontal.frame.size.width/3; 

// animate icons scroll view 
CGPoint currentContentOffset = CGPointMake(self.currentIndex * width, 0.0); 

NSIndexPath *indexPath = [self.collectionViewHorizontal indexPathForItemAtPoint:currentContentOffset]; 
if (indexPath.row > (self.dataArray.count /2) { 
    // add elements and reload 
    [self.dataArray addObjectsFromArray:[self.arrayImages copy]]; 
    [self.collectionViewHorizontal reloadData]; 
} 
// sliding animation 
[UIView animateWithDuration:.3 delay:.0 usingSpringWithDamping:0.5 initialSpringVelocity:.0 options:kNilOptions animations:^{ 
    self.collectionViewHorizontal.contentOffset = currentContentOffset; 
} completion:^(BOOL finished) { 
    [self scrollViewDidEndDecelerating:self.collectionViewHorizontal]; 
}]; 
}