Xcode: UIScrollView галерея изображений с проблемами памяти - PullRequest
1 голос
/ 18 января 2011

Я пытаюсь создать галерею изображений UIScrollView.

Итак, позвольте мне объяснить, чего я пытаюсь достичь здесь:

Я хочу провести скользящую презентацию, чтобыможет показать до 140 изображений.(Вы можете пролистывать туда-сюда). Я нашел информацию в Интернете, и мне сказали, что лучший способ сделать это - UIScrollview, который имеет 3 UIImageViews, который вы создаете и удаляете из суперпредставления.

Итак, мне удалось создать такую ​​«скользящую галерею изображений» с помощью нескольких уроков :).Мне удалось загрузить приложение на ipad, запустить приложение и запустить его.

после того, как я просмотрел около 50-70 слайдов, происходит сбой приложения (не хватает памяти).Мое знание Obj.C не так уж велик.

Вы найдете код ниже: это Проб.имеет отношение к выпуску изображений.Улучшения в коде были бы действительно полезны

#import "ParatelPresentationViewController.h"

//Define the UIView ( we need 3 Image Views left, mid right);
@interface SlideShowView : UIView
{
 NSArray * mImages;

 UIImageView * mLeftImageView;
 UIImageView * mCurrentImageView;
 UIImageView * mRightImageView;

 NSUInteger mCurrentImage;

 BOOL mSwiping;
 CGFloat mSwipeStart;
}

- (id)initWithImages:(NSArray *)inImages;

@end // SlideShowView

#pragma mark -

@implementation SlideShowView


- (UIImageView *)createImageView:(NSUInteger)inImageIndex
{
 if (inImageIndex >= [mImages count])
 {
  return nil;
 }

 UIImageView * result = [[UIImageView alloc] initWithImage:[mImages objectAtIndex:inImageIndex]];
 result.opaque = YES;
 result.userInteractionEnabled = NO;
 result.backgroundColor = [UIColor blackColor];
 result.contentMode = UIViewContentModeScaleAspectFit;
 result.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ;

 return result;
}

- (id)initWithImages:(NSArray *)inImages
{
 if (self = [super initWithFrame:CGRectZero])
 {
  mImages = [inImages retain];

  NSUInteger imageCount = [inImages count];
  NSLog(@"hoeveel foto's: %i");
  if (imageCount > 0)
  {
   mCurrentImageView = [self createImageView:0];
   [self addSubview:mCurrentImageView];

   if (imageCount > 1)
   {
    mRightImageView = [self createImageView:1];
    [self addSubview:mRightImageView];
   }

  }

  self.opaque = YES;
  self.backgroundColor = [UIColor blueColor];
  self.contentMode = UIViewContentModeScaleAspectFit;
  self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
 }

 return self;
}

- (void)dealloc
{
 [mImages release];
 [super dealloc];
}



- (void)layoutSubviews
{
 if (mSwiping)
  return;

 //CGSize contentSize = self.frame.size; // Enable when you use content.width/height
 //self.backgroundColor = [UIColor redColor];
 mLeftImageView.frame = CGRectMake(-1024, 0.0f, 1024, 748);//  (-1024, 0.0f, 1024, 748) can be replaced by  (-contentSize.width, 0.0f, contentSize.width, contentSize.height);
 mCurrentImageView.frame = CGRectMake(0.0f, 0.0f, 1024, 748);
 mRightImageView.frame = CGRectMake(1024, 0.0f,  1024, 748);
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 if ([touches count] != 1)
  return;

 mSwipeStart = [[touches anyObject] locationInView:self].x;
 mSwiping = YES;

 mLeftImageView.hidden = NO;
 mCurrentImageView.hidden = NO;
 mRightImageView.hidden = NO;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
 if (! mSwiping || [touches count] != 1)
  return;

 CGFloat swipeDistance = [[touches anyObject] locationInView:self].x - mSwipeStart;

 //CGSize contentSize = self.frame.size;

 mLeftImageView.frame = CGRectMake(swipeDistance - 1024, 0.0f, 1024, 748);
 mCurrentImageView.frame = CGRectMake(swipeDistance, 0.0f, 1024, 748);
 mRightImageView.frame = CGRectMake(swipeDistance + 1024, 0.0f, 1024, 748);
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
 if (! mSwiping)
  return;

 //CGSize contentSize = self.frame.size;

 NSUInteger count = [mImages count];

 CGFloat swipeDistance = [[touches anyObject] locationInView:self].x - mSwipeStart;
 if (mCurrentImage > 0 && swipeDistance > 50.0f)
 {
  mRightImageView.image = nil;
  //[mRightImageView.image release];
  [mRightImageView removeFromSuperview];
  [mRightImageView release];
  //mRightImageView = nil;
  //NSLog(@"Count of mRight : %i",[mRightImageView retainCount]);


  mRightImageView = mCurrentImageView;
  mCurrentImageView = mLeftImageView;

  mCurrentImage--;
  if (mCurrentImage > 0)
  {
   mLeftImageView = [self createImageView:mCurrentImage - 1];
   mLeftImageView.hidden = YES;

   [self addSubview:mLeftImageView];
  }
  else
  {
   mLeftImageView = nil;
  }
 }
 else if (mCurrentImage < count - 1 && swipeDistance < -50.0f)
 {
  mLeftImageView.image = nil;
  //[mLeftImageView.image release];
  [mLeftImageView removeFromSuperview];
  [mLeftImageView release];
  //mLeftImageView = nil;

  mLeftImageView = mCurrentImageView;
  mCurrentImageView = mRightImageView;

  mCurrentImage++;
  if (mCurrentImage < count - 1)
  {
   mRightImageView = [self createImageView:mCurrentImage + 1];
   mRightImageView.hidden = YES;

   [self addSubview:mRightImageView];
   NSLog(@"Count of mRight : %i",[mRightImageView.image retainCount]);
  }
  else
  {
   mRightImageView = nil;
  }
 }

 [UIView beginAnimations:@"swipe" context:NULL];
 [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
 [UIView setAnimationDuration:0.3f];

 mLeftImageView.frame = CGRectMake(-1024, 0.0f, 1024, 748);
 mCurrentImageView.frame = CGRectMake(0.0f, 0.0f, 1024, 748);
 mRightImageView.frame = CGRectMake(1024, 0.0f, 1024, 748);

 [UIView commitAnimations];

 mSwiping = NO;
}


@end // SlideShowView


#pragma mark -


@implementation ParatelPresentationViewController

- (id)init
{
 if (self = [super initWithNibName:nil bundle:nil])
 {

  NSMutableArray *Displayimages = [[NSMutableArray alloc]init];
  int i;
  for(i=0 ; i<139 ; i++) {


   NSString *tempString = [NSString stringWithFormat:@"Dia%d", i+1];
   NSLog(@"Dia%d.jpg", i+1);
   NSString *imageFile = [[NSBundle mainBundle] pathForResource:tempString ofType:@"JPG"];
   BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:imageFile];

   if (fileExists){
    [Displayimages addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:tempString ofType:@"JPG"]]];
    NSLog(@"img");
   }else {
    break;
   }

  }


  //NSArray * images = [NSArray arrayWithObjects:[UIImage imageNamed:@"1.jpg"], [UIImage imageNamed:@"2.jpg"], [UIImage imageNamed:@"3.jpg"], [UIImage imageNamed:@"4.jpg"], [UIImage imageNamed:@"5.jpg"], nil];
  //NSLog(@"Objects Img = %@", images);
  NSLog(@"Images %@",Displayimages);
  self.view = [[[SlideShowView alloc] initWithImages:Displayimages] autorelease];
  [Displayimages release];
 }

 return self;
}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //return YES;
 return UIInterfaceOrientationIsLandscape (interfaceOrientation);

}

@end

Если вы найдете решение или советы, все приветствуются!

Заранее спасибо

С уважением, Барт!

1 Ответ

1 голос
/ 18 января 2011

У вас определенно есть утечка памяти в createImageView :.Вам придется изменить

return result;

на

return [result autorelease];

Возможно, есть и другие утечки, но это очевидный факт.

  • Йоханнес
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...