Импульсная бесконечная прокрутка изображений, загружаемых из Amazon Web Services S3 - PullRequest
4 голосов
/ 19 июля 2011

Я хотел бы создать приложение для iphone, которое отображает три строки бесконечного числа изображений, которые должны поступать из AWS S3 и загружаться на лету, пока пользователь прокручивает вправо в каждой строке. Я бы хотел, чтобы верхний ряд был маленьким, средний - большим, а нижний - маленьким. Кэширование и умная ленивая загрузка для управления памятью очень важны.

Я посмотрел на Three20, но слишком сложный для такой простой задачи. Любая идея простых библиотек или даже лучше нативный подход.

Ответы [ 3 ]

4 голосов
/ 27 марта 2012

Вы должны присмотреться к UIScrollView. Apple создала этот класс для конкретных целей прокрутки контента. Apple предлагает довольно много примеров, и они обсуждали эту конкретную проблему повторного использования контента и высококачественной прокрутки на последней WWDC.

Эта базовая стратегия заключается в отображении контента и циклическом перемещении позиции прокрутки в том же кадре, который будет обновлять поток обновления. Это приводит к перемещению контента в идеальный момент, чтобы обмануть пользователя, заставив его поверить, что контент «бесконечен».

Обзор: WWDC 2010: Сессия 104 - Разработка приложений с использованием прокрутки

WWDC 2011: Сессия 104 - Продвинутые методы просмотра прокрутки; Сессия 115 - Прокрутка, Проведение, Перетаскивание

Хотя эту концепцию довольно легко понять, если посмотреть, как Apple выполняет эту задачу, и использовать ее лучшие практики, то получится лучший код, который вы сможете написать для этой платформы.

2 голосов
/ 29 марта 2012


Привет Гил Марголин,

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

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

См. Следующие ссылки для этого,

1) Это хорошо для ясного трюка с горизонтальной таблицей ViewView.

2) Этот тоже хороший, но немного сложный.

После этого вы можете управлять концепцией отложенной загрузки в каждой ячейке tableView и получать желаемый результат.

Удачи.

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

Вот собственный код для извлечения изображений из S3.Первое - это реализация h пользовательского делегата S3.Второй - это файл m, чтобы получить объекты из S3.Последний метод должен быть в классе таблицы, в которой вы хотите отобразить картинки.

@protocol S3ObjectControllerDelegate

-(void)S3ControllerFinished:(NSString *)objectKey;

@end

@interface S3ObjectController :NSObject <AmazonServiceRequestDelegate>{
    NSMutableData *responseData;
    NSString *keyName;

    AmazonS3Client *s3Client;
    S3GetObjectRequest *s3GOR;

    id <S3ObjectControllerDelegate> delegate;

}

-(void)s3GetRacerPictuers;

@property (nonatomic, strong) NSString *keyName;
@property (nonatomic, strong) UIImage *image;

@property (nonatomic, strong) id  <S3ObjectControllerDelegate> delegate; //was assign


@end

@implementation S3ObjectController
@synthesize keyName,image;
@synthesize delegate;


-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"Error %@",error);
}

-(void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)response 
{
    //NSLog(@"Response Key %@", response);
    responseData = [[NSMutableData  alloc]init];
}

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data
{
    //NSLog(@"ObjectRequestKey = %@",request);
    [responseData appendData:data];
}

-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
    UIImage *myImage = [[UIImage alloc]initWithData:responseData];


    if(myImage == nil) 
    {
        //NSLog(@"NO IMAGE");

        image = [UIImage imageNamed:@"placeholder.png"];
        responseData = nil;
    }
    else
    {
        //NSLog(@"image added");

        image = myImage;
        responseData = nil;
    }
    [[self delegate] S3ControllerFinished:keyName];
}

-(void)s3GetPictuers
{
   // NSLog(@"Method Called");

    s3Client = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];
    s3GOR = [[S3GetObjectRequest alloc]initWithKey:keyName withBucket:[Constants pictureBucket]];
    s3GOR.delegate = self;
    [s3Client getObject:s3GOR];

    //NSLog(@"Method Finished");
}

@end

-(void)S3ControllerFinished:(NSString *)objectKey
{
    S3ObjectController *newS3 = [[S3ObjectController alloc] init];
    newS3 = [tempDictionary objectForKey:objectKey];
    UIImage *tempImage = newS3.image;
    [dictionaryOfImages setObject:tempImage forKey:objectKey];
    [table reloadData];

}
...