我已經創建了這個無限的具有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];
}];
}