1. 程式人生 > >記一次UICollectionView中visibleCells的坑

記一次UICollectionView中visibleCells的坑

專案的要求是這樣的

其實也是一個輪播圖,而已,所以依照輪播圖的實現原理,這裡覺得也很簡單,還是利用UICollectionView,只不過自定義一個佈局能夠讓cell自動吸附在最中間。

第一個坑

在下面的陣列中取出當前出現在介面可視範圍內的NSIndexPath,

NSArray *arr = [self.TFCollectionView indexPathsForVisibleItems];

然後遍歷,取出最中間的NSIndexPath,取出他的item然後+1,就可以進入下次迴圈了。但是發現取出來的是

列印資訊是 NSLog(@"-path-:%d-:%ld-:%ld",i,(long)path.section,(long)path.item);

下同

2016-07-13 14:07:32.712 TFCycleScrollView[54025:1747068] -cell-:2-:51-:0 
2016-07-13 14:07:32.713 TFCycleScrollView[54025:1747068] -path-:0-:51-:0
 2016-07-13 14:07:32.713 TFCycleScrollView[54025:1747068] -path-:1-:51-:0 
2016-07-13 14:07:32.713 TFCycleScrollView[54025:1747068] -path-:2-:51-:0

還有這樣的

2016-07-13 14:07:30.716 TFCycleScrollView[54025:1747068] -path-:0-:50-:2 
2016-07-13 14:07:30.716 TFCycleScrollView[54025:1747068] -path-:1-:50-:2
 2016-07-13 14:07:30.717 TFCycleScrollView[54025:1747068] -path-:2-:50-:2

這裡存在很大的坑啊,明明不一樣的資料,為什麼取出來,不過還有visibleCells,那這個可行嗎。但是這也又讓我遇到了第二個坑。

第二個坑

接下來我取出visibleCells並列印。

NSArray *arr = [self.TFCollectionView visibleCells];

然後遍歷,但是發現取出來的是

2016-07-13 14:03:16.541 TFCycleScrollView[53987:1739752] -cell-:0-:50-:0 
2016-07-13 14:03:16.541 TFCycleScrollView[53987:1739752] -cell-:1-:50-:2 
2016-07-13 14:03:16.542 TFCycleScrollView[53987:1739752] -cell-:2-:50-:1

還有這樣的

2016-07-13 14:03:53.626 TFCycleScrollView[53999:1741433] -cell-:0-:50-:3
 2016-07-13 14:03:53.626 TFCycleScrollView[53999:1741433] -cell-:1-:51-:0 
2016-07-13 14:03:53.627 TFCycleScrollView[53999:1741433] -cell-:2-:50-:4 

也就是說indexPathsForVisibleItems是全部一樣的,所以這個不可取,那麼取visibleCells,取出來了,但是順序又和實際的是不一樣的,所以這樣我就決定手動給排個序,然後取最中間的,這樣就能滿足需求了。

做法是這樣的:

NSArray *visibleCellIndex = [self.TFCollectionView visibleCells];
NSArray *sortedIndexPaths = [visibleCellIndex sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSIndexPath *path1 = (NSIndexPath *)[self.TFCollectionView indexPathForCell:obj1];
    NSIndexPath *path2 = (NSIndexPath *)[self.TFCollectionView indexPathForCell:obj2];
    return [path1 compare:path2];
}];

這樣返回後的陣列就是排序後的陣列,也是符合要去的。

Demo地址下載

相關推薦

UICollectionViewvisibleCells

專案的要求是這樣的 其實也是一個輪播圖,而已,所以依照輪播圖的實現原理,這裡覺得也很簡單,還是利用UICollectionView,只不過自定義一個佈局能夠讓cell自動吸附在最中間。 第一個坑 在下面的陣列中取出當前出現在介面可視範圍內的NSIndexPa

mysql文字符亂碼的問題排查

mysql mysql中文亂碼 mysql字符集 今天開發反應兩樣的程序往一個庫裏面插入數據正常,往另外一個庫裏面插入數據有亂碼。第一反應就是兩個數據庫關於字符集的配置不一樣。在兩個庫分別查看參數:show variables like "%char%";+--------------------

pm2的踩

是否 instance star 只有一個 之前 問題 有一個 完成後 clas 1、問題: 公司采用了自動發布平臺,最近突然發現一個問題,上線完成後服務是能正常訪問的,但是有一個節點訪問的時候每兩次中總是有一次404,通過nginx的access日誌分析發現第一次正常訪問

ServletgetAttribute的錯誤.

轉發 pat send exception new end auto rec login package com.ykmimi.order.servlet; import java.io.IOException; import javax.servlet.Reques

工作was服務器項目目錄權限被收回

asa 使用 sad quest roo 狀況 nod oot let 狀況描述:啟動was服務器的時候報錯,提示讓去查看服務器的啟動的日誌 1.cd 進到nodgent 目錄下哎 less 查看日誌2.觀察到 某個文件不能被delete。3.查看到項目目錄的權限為roo

JAVA的Random使用經驗

專案中遇到這樣一個需求,在資訊流中拉取其他源的新聞,每次大概會拉取到10條,其中有些是沒有標題或者標題不符合規範的,需要對這種的標題進行識別並替換,隨機替換為預先設定的大概5個預設標題中的一個。需求簡單,核心在於隨機選取,一下就想到了Random類,遍歷每次的10條新聞,判斷為需要替換標題時用Ran

C#靜態變數的

有時為了加快顯示的速度,會將相對不變的資料給快取起來。在快取起來時,比較直接的方法是放到靜態變數中。 在專案中,由於需要從伺服器中撈起較多的資料,一般要3-5秒,網路稍慢的時候會更長時間。而每次顯示介面時,都需要這麼長的時間,顯然是很不友好的。於是,就將這些資料放到了靜態變

shell指令碼的

先看下面這個指令碼:#!/bin/bash PATH=/www/server/nvm/versions/node/v8.11.1/bin export PATH cd /cron/toy/ node index.js echo "-----------------------

Bitmap的爬

最近在做一次圖片相關的功能的時候,用到了 Bitmap.createBitmap這個方法,之前一直以為會重新創建出一個Bitmap物件,然後我把原來的Bitmap物件給回收掉了,為的是及時清理Bitm

使用idea的.

記得以前有一次設定過idea修改一個檔案後.會自動把對應檔案的程式碼格式化一次.(當時覺得這樣有助於程式碼結構清晰.於是按網上說的這樣設定了.),設定完之後.每一次修改檔案.都會導致整個檔案格式化...用svn對比提交時,發現多處修改.(格式化後的結果..idea修改一次檔案

多渠道打包的

專案中要用到一些第三方的統計來輔助我們做資料監測,而且根據市場渠道來看資料的對比,其中兩個比較重要的就是友盟和騰訊的燈塔所以便用到了多渠道打包,直接說遇到的坑再只有一個umeng的時候程式碼裡的配置是這樣的manifest中的配置加了騰訊燈塔的manifest配置build中

詭異的OOM

OOM,即OutOfMemory。作為Android裝置常見的效能問題,經常見於圖片大量載入的場景。然而博主這次碰到的OOM,卻是由一個意想不到又合情合理的問題導致。由於是半路接手一個正在開發的專案,著

使用openrowset 的

前幾天被老大訓斥連openrowset 都不會用,然後我就去看了文件,想測試一下栗子~ openrowset 的具體語法我就不貼了,戳這裡:https://msdn.microsoft.com/zh-cn/library/ms190312(v=sql.120).aspx 按照

才過的:label巢狀input

一次這樣寫頁面: <label> <input type='number'> <input type='number'> </label> 於是,發現點選第二個input的時候會在safari瀏覽器回到第一個i

weblogic的jar包衝突

問題介紹: 我們新上線的生產環境上有不同功能的五個專案,其中一個專案不知道什麼原因到第二天就不列印日誌了。 曲折的解決過程: 正好在測試環境也遇到了相同的問題,當時把換log4j 的jar包 ,直接在weblogic先載入專案中相同的log

python使用jinja2模板渲染文字

起因: 專案中需要通過web表單實現動態為prometheus配置報警規則,我負責後端,需要對資料進行校驗,報警規則有一定的資料格式,但是使用format來格式化的話處理比較麻煩,於是藉助了jinja模板: import jinja2 rules={ "n

被yield return的歷程。

事情的經過是這樣的: 我用C#寫了一個很簡單的一個通過迭代生成序列的函式。 public static IEnumerable<T> Iterate<T>(this Func<T, T> f, T initVal, int length

MySQLWaiting for table metadata lock的解決方法

最近專案中的資料庫查詢經常掛起,應用程式啟動後也報操作超時。測試人員就說資料庫又掛了(貌似他們眼中的連線失敗,查詢無果都是掛了),通過 show processlist 一看,滿屏都是 Waiting for table metadata lock 狀態的連線。

CentOS7-MySQL排歷程

一、報錯及起因 今天在 CentOS7 中安裝了 mysql5.7,然後為了測試資料庫環境是否配置成功,便寫了個基於 mybati

ubootgunzip解壓速度慢的問題排查

背景 在專案中需要用到解壓功能,之前還記錄了下,將uboot解壓程式碼移植到另外的bootloader中時,碰到的效率問題。最終查明是cache的配置導致的。 https://www.cnblogs.com/zqb-all/p/11443127.html 優化前速度是uboot的十分之一,優化後速度達到ubo