我想實現一個應用程序使用帶分頁的UIScrollView,類似於蘋果的天氣應用程序。需求加載UIScrollView
但是我對性能有點擔心。我一直在使用的示例實現加載所有視圖,然後應用程序啓動。在某個點之後,一旦證明這個速度很慢?
我不知道蘋果的相機膠捲是如何處理這個的,用戶可能有100多張照片可以滾動瀏覽。我是否應該嘗試找出僅在需要時才構建視圖的方法?或者也許有一種方法可以從UITableView複製出隊可重用單元技術,僅用於水平視圖加載,因爲每個視圖都具有相同的佈局。
我想實現一個應用程序使用帶分頁的UIScrollView,類似於蘋果的天氣應用程序。需求加載UIScrollView
但是我對性能有點擔心。我一直在使用的示例實現加載所有視圖,然後應用程序啓動。在某個點之後,一旦證明這個速度很慢?
我不知道蘋果的相機膠捲是如何處理這個的,用戶可能有100多張照片可以滾動瀏覽。我是否應該嘗試找出僅在需要時才構建視圖的方法?或者也許有一種方法可以從UITableView複製出隊可重用單元技術,僅用於水平視圖加載,因爲每個視圖都具有相同的佈局。
到目前爲止,最有效的解決方案(也用於許多照片瀏覽應用程序,例如Facebook,也可能是本地的Photos應用程序)將按照UITableView的要求來加載內容。蘋果的StreetScroller示例項目應該能讓你走上正軌。
我模擬了我在頁面控制演示上的實現http://developer.apple.com/library/ios/#samplecode/PageControl/Introduction/Intro.html –
一個非常有效的解決方案是確保儘可能重用任何視圖。如果您只是簡單地顯示圖像,則可以使用UIScrollView的子類,並在layoutSubviews中佈置這些可重用的視圖。在這裏,您可以檢測哪些視圖可見並且不可見,並根據需要創建子視圖。
一個例子離隊功能可能看起來像:
- (UIImageView *)dequeueReusableTileWithFrame:(CGRect) frame andImage:(UIImage *) image
{
UIImageView *tile = [reusableTiles anyObject];
if (tile) {
[reusableTiles removeObject:tile];
tile.frame = frame;
}
else {
tile = [[UIImageView alloc] initWithFrame:frame];
}
tile.image = image;
return tile;
}
哪裏reusableTiles只是的NSMutableSet類型的伊娃。然後,您可以使用它來加載抓取任何當前離屏圖像視圖,並快速輕鬆地將它們帶回到視圖中。
你layoutSubviews可能看起來像:
- (void)layoutSubviews {
[super layoutSubviews];
CGRect visibleBounds = [self bounds];
CGPoint contentArea = [self contentOffset];
//recycle all tiles that are not visible
for (GSVLineTileView *tile in [self subviews]) {
if (! CGRectIntersectsRect([tile frame], visibleBounds)) {
[reusableTiles addObject:tile];
[tile removeFromSuperview];
}
}
int col = firstVisibleColumn = floorf(CGRectGetMinX(visibleBounds)/tileSize.width);
lastVisibleColumn = floorf(CGRectGetMaxX(visibleBounds)/tileSize.width) ;
int row = firstVisibleRow = floorf(CGRectGetMinY(visibleBounds)/tileSize.height);
lastVisibleRow = floorf(CGRectGetMaxY(visibleBounds)/tileSize.height);
while(row <= lastVisibleRow)
{
col = firstVisibleColumn;
while (col <= lastVisibleColumn)
{
if(row < firstDisplayedRow || row > lastDisplayedRow || col < firstDisplayedColumn || col >lastDisplayedColumn)
{
UImageView* tile = [self dequeueReusableTileWithFrame:CGRectMake(tileSize.width*col, tileSize.height*row, tileSize.width, tileSize.height) andImage:YourImage];
[self addSubview:tile];
}
++col;
}
++row;
}
firstDisplayedColumn = firstVisibleColumn;
lastDisplayedColumn = lastVisibleColumn;
firstDisplayedRow = firstVisibleRow;
lastDisplayedRow = lastVisibleRow;
}
我用類似這樣的瓷磚東西,當我與一個非常大面積的滾動視圖的工作線的區域,它似乎相當工作好。對不起,我更新此圖像視圖而不是自定義tileView類時可能會創建任何拼寫錯誤。
這個問題解決了嗎? – heckman