iOS - создание приложения для просмотра фотографий, такого как приложение Photo - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь создать просмотрщик фотографий, как приложение Apple Photos в iOS. Макет в порядке, но он получает предупреждение памяти и затем вылетает. Зачем? Это происходит даже когда я загружаю 7/8 изображений из папки документов приложения. Должен ли я управлять памятью с конкретной системой? Я использую ARC с iOS 5.

РЕДАКТИРОВАТЬ:

Код:

for (int i=0; i<[dataSource count]; i++) {
        UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[dataSource objectAtIndex:i] forState:UIControlStateNormal];
        [[button titleLabel] setText:[NSString stringWithFormat:@"%i",i+1]];
        [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
        [[button layer] setBorderWidth:1];
        [[button layer] setBorderColor:[UIColor darkGrayColor].CGColor];
        if (i==0) {
            [button setFrame:CGRectMake(x, y, width, height)];
        } else {
            if (i%5==0) {
                nRow++;
                x=18;
                [button setFrame:CGRectMake(x, (y*nRow), width, height)];
            } else {
                [button setFrame:CGRectMake(x+space+width, (y*nRow), width, height)];
                x=button.frame.origin.x;
            }
        }
        [[self view] addSubview:button];
    }

Основная часть этого кода - это первые 6 строк, после всех х и у. dataSource - NSArray, объявленный как свойство (неатомное, сильное). Содержит объекты UIImage.

Ответы [ 2 ]

1 голос
/ 30 марта 2012

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

Для реализации:

  1. Сохраняйте пути к файлам изображений в вашем массиве данных вместо объектов UIImage. Получить изображение с пути, используя imageWithContentsOfFile: когда вам это нужно.
  2. Загрузите первые кнопки z в представление прокрутки, где z - это число, отображаемое на экране за раз плюс стоимость одной строки.
  3. Установите UIViewController, в котором мы находимся в настоящее время, в качестве делегата представления прокрутки, и реагируйте на изменения в смещении, перемещая кнопки и устанавливая соответствующие изображения и цели.

Кроме того, если ваше приложение вызывает сбой в изображениях 7/8, похоже, вы имеете дело с довольно большими файлами изображений. Попытайтесь предоставить версии содержимого в виде миниатюр в каталоге документов (независимо от того, какой размер у ваших кнопок ТОЧНО), или, если изображения динамические, см. этот пост для получения инструкций.

0 голосов
/ 20 декабря 2011

Если вы, вероятно, используете ImageNamed, эта статья мне очень помогла:

http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/

Основном

НЕ ИСПОЛЬЗУЙТЕ [UIImage imageNamed] для значительного количества изображений. Это ЗЛО Это сломает ваше приложение и / или Springboard, даже если ваше приложение использует только небольшой кусок памяти сам по себе.

и

лучше реализовать собственный кеш

и вот пример предложенного кэшированного изображения:

- (UIImage*)thumbnailImage:(NSString*)fileName
{
   UIImage *thumbnail = [thumbnailCache objectForKey:fileName];

   if (nil == thumbnail)
   {
      NSString *thumbnailFile = [NSString stringWithFormat:@"%@/thumbnails/%@.jpg", [[NSBundle mainBundle] resourcePath], fileName];
      thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];
      [thumbnailCache setObject:thumbnail forKey:fileName];
   }
   return thumbnail;
}
...