gpt4 book ai didi

ios - 使用按钮滚动 uicollectionview - 我如何检查边界?

转载 作者:行者123 更新时间:2023-11-29 03:06:38 26 4
gpt4 key购买 nike

我不知道如何确定是否到达最后一个 IndexPath 以及何时“倒带”并滚动到第一个 IndexPath这是一些设置:

- (void)viewWillLayoutSubviews;
{
[super viewWillLayoutSubviews];
UICollectionViewFlowLayout *flowLayout = (id)self.collectionView.collectionViewLayout;

if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
flowLayout.itemSize = CGSizeMake(1024.0f, 768.0f);
} else {
flowLayout.itemSize = CGSizeMake(1024.0f, 768.0f);
}

[flowLayout invalidateLayout]; //force the elements to get laid out again with the new size

visibleItems = [self.collectionView indexPathsForVisibleItems];
self.currentIndexPath = [visibleItems firstObject];
[self.collectionView.collectionViewLayout invalidateLayout];
}

这是我的按钮代码:

- (IBAction)addToUploadQueque:(id)sender {
NSLog(@"current: %@",self.currentIndexPath);

NSInteger section = [self numberOfSectionsInCollectionView:self.collectionView] - 1;
NSInteger item = [self collectionView:self.collectionView numberOfItemsInSection:section]-1;
NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section];
NSIndexPath *firstIndexpath =[NSIndexPath indexPathForItem:0 inSection:0];

NSLog(@"current: %@",lastIndexPath);
if (self.currentIndexPath <= lastIndexPath) {
NSInteger newLast = [self.currentIndexPath indexAtPosition:self.currentIndexPath.length-1]+1;
self.currentIndexPath = [[self.currentIndexPath indexPathByRemovingLastIndex] indexPathByAddingIndex:newLast];
[self.collectionView scrollToItemAtIndexPath:self.currentIndexPath
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:YES];
}else{
self.currentIndexPath = [visibleItems firstObject];
[self.collectionView scrollToItemAtIndexPath:self.currentIndexPath
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:YES];
}

}

我正在制作一个循环遍历 Collection View 中每个单元格的按钮,当它到达末尾时(而不是越界)滚动回第一个单元格。

谁能告诉我我做错了什么?

最佳答案

从您的评论来看,听起来您不想只一次枚举可见单元格,而是想手动枚举它们。听起来你在获取下一个 NSIndexPath 时遇到了问题.您的代码片段的问题是您正在递增 row/item (取决于您处理的是 UITableView 还是 UICollectionView ),但在您尝试使用递增的数据源之前,不考虑您是否已经到达一个部分的末尾,更不用说数据源的末尾了.

你可以这样做:

NSInteger item = self.currentIndexPath.item;
NSInteger section = self.currentIndexPath.section;

item++; // go to next item
if (item >= [self.collectionView numberOfItemsInSection:section]) { // if you reached end of section ...
item = 0; // ... go to the start of the next section
section++;
if (section >= [self.collectionView numberOfSections]) { // if you reached the end of the data source ...
// all done, so set section to zero to go back to beginning, e.g. // ... then you're done
section = 0;
}
}
self.currentIndexPath = [NSIndexPath indexPathForItem:item inSection:section]; // otherwise, this is your new NSIndexPath

顺便说一句,如果我们要关注您的代码片段,另一个问题是您正在使用 <=运算符比较两个索引路径。你不能这样做。你必须使用 compare NSIndexPath的方法| .

但是那个if声明让我觉得没有必要,因为在最后一个索引路径之后的数据源中没有索引路径。如果您正在递增逻辑(上面)正确检测到数据源的结尾,那么这个 if声明是不必要的。


这段代码中有很多很多问题。但我想知道是否可以采用更简单的方法,而不是仔细研究所有这些细节。如果您只想对所有可见行执行上传,也许您可​​以做一些更简单的事情,例如:

for (NSIndexPath *indexPath in self.collectionView.indexPathsForVisibleItems) {
// if the cell has some visual indication to reflect upload has been initiated,
// do that here

// do your asynchronous upload here, where the completion block dispatches
// updates to the cell/collectionView (to reflect that the individual upload
// is done)
}

请注意,您的代码正在滚动到单元格(大概是在上传完成时)。我可能会试图劝阻您不要采用这种方法,而只是更新单元格(例如,设置您的 cellForItemAtIndexPath 方法引用的一些标志,然后在该行完成时为每一行调用 reloadItemsAtIndexPaths。因为上传速度可能很慢,您可能不希望 UI 在这些异步上传完成时四处滚动。

关于ios - 使用按钮滚动 uicollectionview - 我如何检查边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com