簡體   English   中英

如何提高混合性能以平滑滾動?

[英]How to improve blending performance to make smooth scrolling?

快速介紹

編輯:我有9個單元格。 所有9個單元格都包含捆綁圖像。 7個捆綁包圖像具有某種透明度( 在文件中,而不是代碼中的混合選項 ),可以從下面的Web加載圖像。 當捆綁包和Web圖像都作為UIImage對象加載到數組中時,滾動問題會影響表視圖。

如果我禁用網絡圖像的繪制,滾動效果很好,但是當我從捆綁滾動中禁用圖像時,效果還不錯。 但是在一起,您會得到自己不想要的東西:糟糕的用戶體驗。

履行

我在女巫中使用模型,您有一個自定義UITableViewCell ,其中一個自定義UIView設置為Cell的backgroundView

自定義UIView包含兩個單元大小的圖像( 320x80 px )。 所有元素均設置為不透明並具有1.0 Alpha屬性,但是其中一個圖像部分是100%透明的。

我不重復使用單元,因為我無法使它們加載不同的圖像。 Cell可以一一重用,最多可重復使用9個電池。 所以我在內存中有9個可重復使用的單元。 也許這就是問題所在。

單元格initWithStyle:reuseIdentifier方法部分:

CGRect viewFrame = CGRectMake(0.0f, 0.0f, 320.0f, 80.0f);
customCellView = [[CustomCellView alloc] initWithFrame:viewFrame];
customCellView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self setBackgroundView:customCellView];

CustomCellView的初始化方法:

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        self.opaque = YES;
        self.backgroundColor = [UIColor UICustomColor];
    }
    return self;
}

使用UIImage的 imageWithData:方法(異步下載 ),將圖像作為PNG Web定位文件( 40-80 imageWithData: )中的UIImage對象作為UIImage對象加載到NSMutableArray中。

在圖像加載方法中將它們設置為可見單元,並從數組中將其設置為保存到 UITableViewDelegate的方法tableView:cellForRowAtIndexPath: ,並通過UITableViewCell和自定義方法傳遞給UIView。

然后在UIView的drawRect:繪制drawRect:重寫的方法:

- (void)drawRect:(CGRect)rect {
    CGRect contentRect = self.bounds; 
    if (!self.editing) {
        CGFloat boundsX = contentRect.origin.x;
        CGFloat boundsY = contentRect.origin.y;
        CGPoint point;
        point = CGPointMake(boundsX, boundsY);
        if (firstImage)  { [firstImage  drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; }
        if (secondImage) { [secondImage drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; }
    }
}

如您所見,正在使用drawInRect:blendMode:alpha:方法繪制圖像。

問題

好吧,當在設備上滾動UITableView 時,您會在滾動期間每次加載新單元時注意到停機時間( 對用戶不利,非常糟糕 )。

編輯:問題更多是混合問題,在代碼中您看到互聯網圖像被繪制在已捆綁的圖像下面-不繪制重疊圖像使滾動速度提高了70%。

思考

從捆綁包加載圖像時,相同的實現沒有停機時間。 我應該將圖像保存到應用程序沙箱,然后從那里使用它們。 這聽起來非常糟糕,因為您應該盡量減少移動設備應用程序中的讀寫操作,因為每次讀取或寫入磁盤時都會快要死掉。

編輯:或者也許我應該將圖像存儲為核心圖形對象?

編輯: 這個問題有一些線索。 但是我不知道如何有效地執行自定義繪圖。

首先,您應該嘗試使表單元可重用。.這將對內存使用和響應能力產生重大影響。

為了從tableView中的Web加載圖像,我使用了此鏈接文本解決方案。 它使用ASIHTTPRequest框架來異步下載數據,並且具有自定義的可重用單元。

您可以按原樣使用它,也可以根據需要對其進行調整...您可以在顯示tableView之前異步下載所有圖像,並將其保存在緩存中。 使用上面鏈接中建議的代碼從緩存而非網絡加載圖像。 如果這樣做,您可能會下載比用戶所需更多的數據(如果某人使用3G且流量有限,他將不喜歡額外的流量...)

更好的解決方案是僅在需要時才下載圖像。 您可以按原樣使用代碼並添加一個緩存模塊。 下載圖像后,例如將其保存在字典中,下次請求從那里加載時...

每當我需要在UITableView單元中加載圖像時,最后一種方法就足夠了。 無需將圖像另存為Core Graphics對象。

希望能幫助到你...

編輯:在tableview中加載具有可重復使用單元格的圖像的另一種解決方案

來自http://iphoneincubator.com/blog/tag/uiimage

像這樣將兩個圖像組合在一起。 只有9行,您應該在任何地方都沒有延遲。

- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 {  
UIGraphicsBeginImageContext(image1.size);  

// Draw image1  
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];  

// Draw image2  
[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];  

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  

UIGraphicsEndImageContext();  

return resultingImage;  
}  

嘗試構建一個圖像緩存,它是一個新的obj-c對象,該對象僅返回您需要的UIImage,最多保留最后50個左右的UIImages。 然后該單元開始繪制,它只是向緩存對象詢問圖像-要么立即獲取它,要么緩存對象開始下載它。

UImage* theImage = [myImageCache imageForURL:urlForPNGImage]; 
[theImage drawinRect:rectForImageInCell];

// imageCache具有UIImages字典,其中圖像以URL作為鍵存儲。 您還需要跟蹤諸如上次使用的時間等內容,以便可以控制內存。

另外,無論使用什么圖像緩存,都需要為用戶尚未看到的行加載圖像。 只需在顯示的行的兩側提前加載10(或其他一些數字)即可。 然后圖像准備就緒。 即致電

for (rows unseenButNearTheView)
 urlForRow = blah
 [myImageCache imageForURL:urlForRow]; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM