UITableView/UICollectionView獲取特定位置的cell 主要依賴于各自對象提供的的api方法媳谁,應(yīng)用示例如下:
// returns nil if point is outside of any row in the table
//tableView
- (nullable NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;
//collectionView
- (nullable NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point;
一品山、tableView雙級聯(lián)動
以上兩種效果比較類似述雾,實(shí)現(xiàn)的關(guān)鍵在于都是需要獲得在滑動過程中滑動到tableView頂部的cell的indexPath街州。
方案一(不推薦原因會在后面提到):獲得當(dāng)前可見的所有cell,然后取可見cell數(shù)組中的第一個cell就是目標(biāo)cell玻孟,再根據(jù)cell獲得indexPath唆缴。代碼如下
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView == _rightTableView && _isSelected == NO) {
//返回tableView可見的cell數(shù)組
NSArray * array = [_rightTableView visibleCells];
//返回cell的IndexPath
NSIndexPath * indexPath = [_rightTableView indexPathForCell:array.firstObject];
NSLog(@"滑到了第 %ld 組 %ld個",indexPath.section, indexPath.row);
_currentIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[_leftTableView reloadData];
[_leftTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:indexPath.section] atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}
}
方案二(推薦使用):利用偏移量!偏移量的值實(shí)際上可以代表當(dāng)時處于tableView頂部的cell在tableView上的相對位置黍翎, 那么我們就可以根據(jù)偏移量獲得處于頂部的cell的indexPath琐谤。代碼如下
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView == _rightTableView && _isSelected == NO) {
//系統(tǒng)方法返回處于tableView某坐標(biāo)處的cell的indexPath
NSIndexPath * indexPath = [_rightTableView indexPathForRowAtPoint:scrollView.contentOffset];
NSLog(@"滑到了第 %ld 組 %ld個",indexPath.section, indexPath.row);
_currentIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[_leftTableView reloadData];
[_leftTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:indexPath.section] atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}
}
二、 獲取處于UITableView中心的cell
獲取處于tableView中間cell的效果玩敏,用上述方案一比較麻煩:要考慮可見cell 的奇、偶個數(shù)問題质礼,還有cell是否等高的情況旺聚;方案二用起來就快捷方便多了,取的cell的位置的縱坐標(biāo)相當(dāng)于在偏移量的基礎(chǔ)上又增加了tableView高度的一半眶蕉。代碼如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//獲取處于UITableView中心的cell
//系統(tǒng)方法返回處于tableView某坐標(biāo)處的cell的indexPath
NSIndexPath * middleIndexPath = [_rightTableView indexPathForRowAtPoint:CGPointMake(0, scrollView.contentOffset.y + _rightTableView.frame.size.height/2)];
NSLog(@"中間的cell:第 %ld 組 %ld個",middleIndexPath.section, middleIndexPath.row);
}
需要示例Demo的話請移駕我的Github→UITableViewLinkage
俺目前能想到的也就這了砰粹,各位同僚有什么好的想法歡迎在此留言交流????????????
更新于2018/9/7 :UICollectionView獲取特定位置的item與UITableView相似,僅僅是獲取的方法名不同造挽,如下:
NSIndexPath * indexPath = [_collectionView indexPathForItemAtPoint:scrollView.contentOffset];
NSLog(@"滑到了第 %ld 組 %ld個",indexPath.section, indexPath.row);
獲取某個cell在當(dāng)前tableView/collectionView上的坐標(biāo)位置
//獲取某個cell在當(dāng)前tableView上的坐標(biāo)位置
CGRect rectInTableView = [_rightTableView rectForRowAtIndexPath:middleIndexPath];
//獲取cell在當(dāng)前屏幕的位置
CGRect rectInSuperview = [_rightTableView convertRect:rectInTableView toView:[_rightTableView superview]];
NSLog(@"中間的cell處于tableView上的位置: %@ /n 中間cell在當(dāng)前屏幕的位置:%@", NSStringFromCGRect(rectInTableView), NSStringFromCGRect(rectInSuperview));
//獲取cell在當(dāng)前collection的位置
CGRect cellInCollection = [_collectionView convertRect:item.frame toView:_collectionView];
UICollectionViewCell * item = [_collectionView cellForItemAtIndexPath:indexPath]];
//獲取cell在當(dāng)前屏幕的位置
CGRect cellInSuperview = [_collectionView convertRect:item.frame toView:[_collectionView superview]];
NSLog(@"獲取cell在當(dāng)前collection的位置: %@ /n 獲取cell在當(dāng)前屏幕的位置:%@", NSStringFromCGRect(cellInCollection), NSStringFromCGRect(cellInSuperview));
*/
獲取手指在UIScrollView上的滑動速率碱璃、方向以及移動距離
// velocityInView: 手指在視圖上移動的速度(x,y), 正負(fù)也是代表方向,值得一體的是在絕對值上|x| > |y| 水平移動饭入, |y|>|x| 豎直移動嵌器。
CGPoint velocity = [scrollView.panGestureRecognizer velocityInView:scrollView];
//translationInView : 手指在視圖上移動的位置(x,y)向下和向右為正,向上和向左為負(fù)谐丢。X和Y的數(shù)值都是距離手指起始位置的距離
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];
如果需要跟我交流的話:
※ Github: https://github.com/wsl2ls
※ 簡書:http://www.reibang.com/u/e15d1f644bea