0

plist ファイルからの画像のギャラリーを表示する UIScrollView があります。また、基本的に plist ファイル内のオブジェクトを削除してから、ScrollView 内の画像をリロードするギャラリー画像リストから画像を削除する機能もあります。問題は、メソッドを使用するときに新しいコンテンツで再読み込みする前に UIScrollView の画像を解放できないことです- (IBAction)deleteimage:(id)sender。新しいコンテンツが読み込まれますが、古いコンテンツが上書きされ、画像はまだ新しいコンテンツの背後にあります。スクロールビューのコンテンツをリロードする前に画像をリリースするにはどうすればよいですか?

私が使用しているコードは次のとおりです。

#import "ImageScrollViewController.h"

@interface ImageScrollViewController ()

@end

@implementation ImageScrollViewController

@synthesize images,scrollView,pageControl,subview;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
scrollView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);

[self setupthescroll];
self.pageControl.currentPage = 0;
}

- (void)setupthescroll{

//Get the images of the Array
NSUserDefaults *success = [NSUserDefaults standardUserDefaults];
images = [success mutableArrayValueForKey:@"imagelist"];
NSLog(@"list of images%@",images);

pageControlBeingUsed = NO;

for (int i = 0; i < images.count; i++) {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * i;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;

    subview = [[UIImageView alloc] initWithFrame:frame];
    NSString *str4 = [images objectAtIndex:i];
    subview.image = [[[UIImage alloc] initWithContentsOfFile:str4] autorelease];
    self.subview.contentMode = UIViewContentModeScaleAspectFit;
    [self.scrollView addSubview:subview];
    [subview release];
}

self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * images.count, self.scrollView.frame.size.height);

self.pageControl.numberOfPages = images.count;

//Get the number of the images
int page;
page = self.pageControl.currentPage;
printf("Current Page: %d", page);

}

- (void)scrollViewDidScroll:(UIScrollView *)sender {
if (!pageControlBeingUsed) {
    // Switch the indicator when more than 50% of the previous/next page is visible
    CGFloat pageWidth = self.scrollView.frame.size.width;
    int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    self.pageControl.currentPage = page;
}
}


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
pageControlBeingUsed = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
pageControlBeingUsed = NO;
}

- (IBAction)changePage {
// Update the scroll view to the appropriate page
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * self.pageControl.currentPage;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
[self.scrollView scrollRectToVisible:frame animated:YES];
pageControlBeingUsed = YES;
}

- (IBAction)deleteimage:(id)sender{
//Get the number of the image
int page;
page = self.pageControl.currentPage;
printf("Current Page: %d", page);

//Remove the images of the Array
NSUserDefaults *success = [NSUserDefaults standardUserDefaults];
images = [success mutableArrayValueForKey:@"imagelist"];
[images removeObjectAtIndex:page];
NSLog(@"list of images%@",images);

//Update the Array
NSUserDefaults *arrayofimages = [NSUserDefaults standardUserDefaults];
[arrayofimages setObject:images forKey:@"imagelist"];

//Refresh the ScrollView
[self setupthescroll];

//post the notification than images have been updated
NSUserDefaults *deleted = [NSUserDefaults standardUserDefaults];
[deleted setObject:@"deleted" forKey:@"deletedimages"];
}

- (IBAction)closepage:(id)sender{
[self dismissModalViewControllerAnimated:YES];
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)dealloc {
[pageControl release];
[scrollView release];
//[images release];
[super dealloc];
}

@end
4

3 に答える 3

2

スクロールビュー全体をリロードする (つまり、すべての画像を追加し直す) 場合は、最初に既存の画像を削除する必要があります。

UIView の removeFromSuperview メソッドを使用て、スクロールビューからビューを削除します。

したがって、スクロールビューからすべての画像ビューを削除するコード スニペットは次のようになります。

NSArray *imgViews = [scrollView subviews];
for(id aView in imgViews){
    if([aView isKindOfClass:[UIImageView class]]){
      [aView removeFromSuperview]; //remove only if its an imageview
    }
}

画像ビューへの参照が既にある場合は、スクロールビューのすべてのサブビューを反復せずに、それらのメソッドを直接呼び出すことができます。

于 2012-08-22T07:25:36.153 に答える
1

scrollView 内のすべての UIImageView を削除する必要があります。

何かのようなもの

NSArray* subviews = [[scrollview subviews] copy];
for (UIView* v in subviews) {
    [v removeFromSuperview];
}
[subviews release];
于 2012-08-22T07:20:36.273 に答える
0

scrollView サブビューから以前の画像ビューを削除するのを忘れました。これに対する残忍な方法 (少なくとも仮説をテストするため) は、次の行を の先頭に追加することですsetupthescroll

[self.scrollView.subviews makeObjectsPerfomSelector:@selector(removeFromSuperview)];

これに関する問題は、スクロールビューのプライベート サブビュー (スクローラーなど) も削除されることです。したがって、実際には、ivar 配列で作成したサブビューを追跡し、subviews 配列の代わりにこの配列で上記の行を実行し、後で配列をクリアする必要があります。

あるいは、すべてを削除して再作成するのではなく、削除された画像に対応するサブビューのみを削除し、残りの画像ビューのフレームを更新するという、よりクリーンな方法があります。ディクショナリまたは subviewstagプロパティを使用して、どのビューがどの画像に関連付けられているかを追跡できます。

于 2012-08-22T07:34:31.853 に答える