iOS UITableView/UICollectionView獲取特定位置的cell

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)動

菜單欄聯(lián)動.gif
UITableView雙級聯(lián)動.gif

以上兩種效果比較類似述雾,實(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

獲取UITableView中心線cell.gif

獲取處于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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爽航,一起剝皮案震驚了整個濱河市蚓让,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讥珍,老刑警劉巖历极,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衷佃,居然都是意外死亡趟卸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門氏义,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锄列,“玉大人,你說我怎么就攤上這事觅赊∮胰铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵吮螺,是天一觀的道長饶囚。 經(jīng)常有香客問我,道長鸠补,這世上最難降的妖魔是什么萝风? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮紫岩,結(jié)果婚禮上规惰,老公的妹妹穿的比我還像新娘。我一直安慰自己泉蝌,他們只是感情好歇万,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勋陪,像睡著了一般贪磺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诅愚,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天寒锚,我揣著相機(jī)與錄音,去河邊找鬼违孝。 笑死刹前,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雌桑。 我是一名探鬼主播喇喉,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼校坑!你這毒婦竟也來了轧飞?” 一聲冷哼從身側(cè)響起衅鹿,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎过咬,沒想到半個月后大渤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掸绞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年泵三,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衔掸。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡烫幕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敞映,到底是詐尸還是另有隱情较曼,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布振愿,位于F島的核電站捷犹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冕末。R本人自食惡果不足惜萍歉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望档桃。 院中可真熱鬧枪孩,春花似錦、人聲如沸藻肄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘹屯。三九已至攻询,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抚垄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工谋逻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呆馁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓毁兆,卻偏偏與公主長得像浙滤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子气堕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容