TableView視覺差效果以及內(nèi)存優(yōu)化

所謂的視覺差就是TableView在滾動的時候,可見的Cell都處于滑動狀態(tài),但是偏移量各不同,從而達到的一種視覺效果。

效果圖

由于上傳圖片有大小要求,所以質(zhì)量會有點問題!

OK,如何完成的?

恩,原理就這樣子
默認(rèn)顯示的時候


默認(rèn)顯示

<br />
向下滑動的時候

向下滑動

<br />
向上滑動的時候

向上滑動

通過上面三個圖就知道,要在滾動TableView的時候計算圖片的Y值,來達到移動的效果。

計算代碼以及注釋

- (void)cellOnTableView:(UITableView *)tableView didScrollView:(UIView *)view{
    
    //將cell的frame轉(zhuǎn)換成View的Frame
    CGRect rect = [tableView convertRect:self.frame toView:view];
    
    //視圖的Frame的一半 減去 所看到的每個Cell的Y(獲取滾動的值)
    //以屏幕中心為0 獲取能看到每個cell離中心點的值
    float distanceCenter = CGRectGetHeight(view.frame)*0.5 - CGRectGetMinY(rect);
    
    
    //圖片的高度 - cell的高度 = 圖片超出cell的高度部分
    float difference = CGRectGetHeight(self.backImage.frame) - CGRectGetHeight(self.frame);
    
    
    float imageMove = (distanceCenter / CGRectGetHeight(view.frame)) * difference;
    
    //舊的圖片F(xiàn)rame
    CGRect imageRect = self.backImage.frame;
    
    //計算新的Y值
    imageRect.origin.y = imageMove - (difference *0.5);
    
    //賦值
    self.backImage.frame = imageRect;
    
}

<br />
調(diào)用

//滾動監(jiān)聽
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 獲取表視圖的可見單元格。(可見的視圖)
    NSArray *visibleCells = [self.tableview visibleCells];
    
    for (Cell *cell in visibleCells) {
        //可見視圖設(shè)置->背景圖片y值
        [cell cellOnTableView:self.tableview didScrollView:self.view];
    }
    
}

<br />
然后到這里就可以運行跑起來看效果了,嗯,確實實現(xiàn)了效果,但是先看下內(nèi)存吧。

下面的圖片均運行在真機上

<br />

直接加載的情況下

80+M貌似沒多大問題,并且我這里選的也是比較大的圖片,這里只加載了10張圖片,但是如果圖片過多,第一次滑動會卡,不流暢。

于是考慮優(yōu)化內(nèi)存,先奉上優(yōu)化后的,當(dāng)然我這里只是做一個思路,當(dāng)然會有更好的解決方案,如果您有更好的解決方案,麻煩留言告知。

優(yōu)化后

在上面的情況下都是10張圖片,但是內(nèi)存消耗卻少了很多,少了80M左右,這個優(yōu)化還是值得去做的。

因為數(shù)據(jù)源加載的是圖片,又因為數(shù)據(jù)源是強引用,常駐內(nèi)存,所以從圖片入手。
在手機上顯示圖片,完全不用顯示原尺寸,所以我的解決思路就是壓縮圖片,同時在界面上又基本上看不出來區(qū)別。
OK,現(xiàn)在要做的就是壓縮圖片。

<br />
做法就是根據(jù)屏幕的高度,然后在用圖片的寬高比去壓縮。

+(UIImage * _Nullable)imageCompressForWidth:(UIImage * _Nonnull)sourceImage targetWidth:(CGFloat)defineWidth{
    //根據(jù)原圖片計算值壓縮后的尺寸
    CGSize imageSize = sourceImage.size;
    CGFloat bili = imageSize.width / imageSize.height;
    CGFloat width = defineWidth * 2;
    CGFloat height = width * bili;
    
    //開啟繪圖
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), 1, 1);
    
    //繪圖到當(dāng)前上下文
    [sourceImage drawInRect:CGRectMake(0, 0, width, height)];
    
    //獲取新圖片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    //關(guān)閉圖片繪制
    UIGraphicsEndImageContext();
    
    //返回圖片
    return newImage;
}

如果你對圖片繪制不是很熟悉
這里有一個傳送門

由于圖片過大,所以Demo打包為ZIP文件 ,如果對您有一點幫助,麻煩star一下,Thanks

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,224評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,433評論 4 61
  • 畢業(yè)季前夕,我們相約去濱江路游玩來為我們的大學(xué)時光做一次留念。濱江路中間是一條長流不息的長江,右邊緊鄰繁華的主城...
    闌十三閱讀 560評論 0 13
  • 深深愛著呢 美麗的山 青青的翠綠 化成的乳 難忘的童真 甘甜的苦 喜鵲已登枝 互祝的福 蒼鷹的眼里...
    千年金牛閱讀 584評論 7 2
  • 人格心理學(xué)之人本主義 看到人本主義,首先想到的是三大勢力:精神分析、行為主義、人本主義。接著思考著這三個流派的不同...
    8e226ffeecde閱讀 451評論 0 1

友情鏈接更多精彩內(nèi)容