方法 scrollToItemAtIndexPath 不适用于 iOS 14
Method scrollToItemAtIndexPath is not working on iOS 14
我对来自 iOS 14 的 scrollToItemAtIndexPath
有疑问。
在以前的 iOS 版本中,当用户停止拖动时,下一个单元格水平居中,现在方法 scrollToItemAtIndexPath
被忽略,它仍然停留在第一个单元格中。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
if( scrollView.tag == 1 ) {
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad){
*targetContentOffset = scrollView.contentOffset; // set acceleration to 0.0
float pageWidth = (float) (self.view.frame.size.width)-80;
int minSpace = 10;
int cellToSwipe = (scrollView.contentOffset.x)/(pageWidth + minSpace) + (velocity.x < 0 ? 0 : 1); // cell width + min spacing for lines
if (cellToSwipe < 0) {
cellToSwipe = 0;
} else if (cellToSwipe >= MIN(6, self.news.count )) {
cellToSwipe = (int) MIN(6, self.news.count);
}
[self.newsCollectionView scrollToItemAtIndexPath: [NSIndexPath indexPathForRow:cellToSwipe inSection:0]
atScrollPosition: UICollectionViewScrollPositionCenteredHorizontally
animated: YES];
}
}
}
scrollToItemAtIndexPath
在iOS14上还有一些问题,你可以用setContentOffset
代替,对我有用。
您可以使用 UICollectionViewLayout
的 layoutAttributesForItem(at indexPath: IndexPath)
来计算适当的 contentOffset
修复可能是这样的:
extension UICollectionView {
func scrollTo(indexPath: IndexPath) {
let attributes = collectionViewLayout.layoutAttributesForItem(at: indexPath)!
setContentOffset(attributes.frame.origin, animated: true)
}
}
Objective-C版本:
UICollectionViewLayoutAttributes *attributes = [collectionView layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:section]];
[collectionView setContentOffset:attributes.frame.origin animated:YES];
其中 collectionView 是您的 UICollectionView 对象,index 是您要滚动到的 UICollectionView 的行并且 section 是该行所属的 UICollectionView 部分。
_collectionView.pagingEnabled = NO;
[_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:(UICollectionViewScrollPositionLeft) animated:NO];
_collectionView.pagingEnabled = YES;
我对来自 iOS 14 的 scrollToItemAtIndexPath
有疑问。
在以前的 iOS 版本中,当用户停止拖动时,下一个单元格水平居中,现在方法 scrollToItemAtIndexPath
被忽略,它仍然停留在第一个单元格中。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
if( scrollView.tag == 1 ) {
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad){
*targetContentOffset = scrollView.contentOffset; // set acceleration to 0.0
float pageWidth = (float) (self.view.frame.size.width)-80;
int minSpace = 10;
int cellToSwipe = (scrollView.contentOffset.x)/(pageWidth + minSpace) + (velocity.x < 0 ? 0 : 1); // cell width + min spacing for lines
if (cellToSwipe < 0) {
cellToSwipe = 0;
} else if (cellToSwipe >= MIN(6, self.news.count )) {
cellToSwipe = (int) MIN(6, self.news.count);
}
[self.newsCollectionView scrollToItemAtIndexPath: [NSIndexPath indexPathForRow:cellToSwipe inSection:0]
atScrollPosition: UICollectionViewScrollPositionCenteredHorizontally
animated: YES];
}
}
}
scrollToItemAtIndexPath
在iOS14上还有一些问题,你可以用setContentOffset
代替,对我有用。
您可以使用 UICollectionViewLayout
的 layoutAttributesForItem(at indexPath: IndexPath)
来计算适当的 contentOffset
修复可能是这样的:
extension UICollectionView {
func scrollTo(indexPath: IndexPath) {
let attributes = collectionViewLayout.layoutAttributesForItem(at: indexPath)!
setContentOffset(attributes.frame.origin, animated: true)
}
}
Objective-C版本:
UICollectionViewLayoutAttributes *attributes = [collectionView layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:section]];
[collectionView setContentOffset:attributes.frame.origin animated:YES];
其中 collectionView 是您的 UICollectionView 对象,index 是您要滚动到的 UICollectionView 的行并且 section 是该行所属的 UICollectionView 部分。
_collectionView.pagingEnabled = NO;
[_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:(UICollectionViewScrollPositionLeft) animated:NO];
_collectionView.pagingEnabled = YES;