2013-02-10 62 views
0

在我的ipad應用程序中,我有200個圖像,並將這些圖像添加到數組中。
然後通過循環將此數組添加到圖像視圖中。 然後,我將這個圖像視圖添加爲滾動視圖的子視圖。添加新圖像並從圖像視圖中刪除舊圖像

當我打開應用程序時,我的應用程序崩潰。
我嘗試縮小圖像大小。但是,它沒有奏效。

我的一個朋友先告訴我應該只添加image1和image2。
當用戶滾動image1時,它顯示image2。
之後image1從圖像視圖中刪除。
然後將圖像3添加到圖像視圖。

他告訴它可以保持內存使用。
但是,我不知道我該怎麼做? :D
請給我舉個例子。
在此先感謝。

我的代碼是在這裏,

- (void)viewDidLoad 
{ 
[super loadView]; 
self.view.backgroundColor = [UIColor grayColor]; 

UIScrollView *ScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height)]; 
ScrollView.pagingEnabled = YES; 

// Create a UIImage to hold Info.png 
UIImage *image1 = [UIImage imageNamed:@"Image-001.jpg"]; 
UIImage *image2 = [UIImage imageNamed:@"Image-002.jpg"]; 
UIImage *image200 = [UIImage imageNamed:@"Image-200.jpg"]; 

NSArray *images = [[NSArray alloc] initWithObjects:image1,image2,...,image200,nil]; 

NSInteger numberOfViews = 200; 
for (int i = 0; i < numberOfViews; i++) 
{ 
CGFloat xOrigin = i * self.view.frame.size.width; 

UIImageView *ImageView = [[UIImageView alloc] initWithFrame:CGRectMake(xOrigin, 0, self.view.frame.size.width, self.view.frame.size.height-44)]; 
[ImageView setImage:[images objectAtIndex:i]]; 

[ScrollView addSubview:ImageView]; 
} 
ScrollView.contentSize = CGSizeMake(self.view.frame.size.width * numberOfViews, self.view.frame.size.height); 
[self.view addSubview:ScrollView]; 
+0

您應該使用表格視圖,而不是圖片的滾動視圖。這樣,您只能加載屏幕上可見的圖像,而不是每個圖像。當表格滾動時,單元格被重用,並且從數組中填充它們,就像表格的任何其他數據一樣(但數組應該包含圖像名稱,而不是實際圖像,因此圖像僅在您將他們在桌子上)。 – rdelmar 2013-02-10 17:39:45

+0

僅供參考,您應該閱讀「延遲加載」 - 要點是僅根據需要加載資產以避免內存不足。你可能想看看我在這個關於UIScrollView和延遲加載的答案中發佈的代碼:http://stackoverflow.com/a/14661487/840992 – 2013-02-10 20:31:53

回答

0

它看起來像你所訪問的索引0..200圖像陣列,但它僅包含三個元素。任一組numberOfViews = 3;,或索引到陣列是這樣的:

ImageView.image = images[i%3]; 

模數索引將導致你添加每三個圖像中的重複序列,並且仍然讓您與滾動視圖的子視圖的更大數量的測試。我懷疑你的崩潰是關於只有200張圖像的內存,除非它們是超大的。

+0

讓我們使用新的酷語法'ImageView.image = images [i%3 ];':) – asdf 2013-02-10 17:31:23

+0

是的,我也會編輯以添加更酷的屬性語法。 :)也@NightHunter - 建議您在堆棧變量名稱(imageView,而不是ImageView)上使用小寫字母。 – danh 2013-02-10 17:33:04

+0

@danh,感謝您的快速回復,我不是說只有三張圖片。有200張圖片。 UIImage * image1 = [UIImage imageNamed:@「Image-001.jpg」]; UIImage * image2 = [UIImage imageNamed:@「Image-002。jpg「]; UIImage * image200 = [UIImage imageNamed:@」Image-200.jpg「];總共200張圖片大小爲300Mb(每張圖片大約2Mb),我減小了它們的大小。 。我應該怎麼做? – 2013-02-10 17:37:02

0

您應該使用表格視圖來顯示圖像。你不想創建所有這些圖像的數組,因爲這將所有這些圖像放入記憶中 - 這不是一件好事。你甚至不需要創建一個數組來保存這些名稱,因爲它們的名字可以很容易地用一個整數(你可以從tableView:cellForRowAtIndexPath:方法中的indexPath.row獲得)構造出來。像這樣的:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 200; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    NSString *imageName = [NSString stringWithFormat:@"Image-%.3d.jpg",indexPath.row +1]; 
    UIImage *image = [UIImage imageNamed:imageName]; 
    cell.imageView.image = image; 
    return cell; 
} 

這個例子只是使用單元格的默認imageView來顯示圖像,這是非常小的。您可能想要創建一個自定義單元格,其中包含更大的圖像視圖(如果每行需要多個圖像,則並排配對)。

+0

感謝您的幫助。我真的想使用表格視圖。但是,我的應用程序幾乎完成大約90%,只是有這樣的錯誤,我沒有考慮我的應用程序的內存管理,我認爲它不是我對我來說。但是,現在我陷入困境。我不想從頭開始。請給我一些建議,我如何重新編碼我的代碼。再次感謝。 – 2013-02-10 18:13:45

+0

@NightHunter,我不知道這是否會有所幫助(取決於內存問題),但擺脫那些你創建圖像的200行,並擺脫陣列。當你在你的循環中調用setImage時,使用上面的代碼(imageName = ...和image = ...)來填充你的圖像視圖(當你創建imageName時,你將使用我而不是indexPath.row)。 – rdelmar 2013-02-10 18:18:14